I created the test program below in an attempt to debug an issue in a larger system. The program attempts to fread a large chunk of data from a small file, but I've found that the behavior of the program differs across platforms. 
Expected behavior
The behavior that I expect, and that I see on some platforms (e.g., Mac OS X, CentOS 6.4), is for the program to read N bytes (the size of the file) and then terminate with the EOF condition:
Read 2 bytes. OK. EOF
Anomalous behavior
On some platforms (e.g., CentOS 6.6), the program reports 0 bytes read and fails with an error:
Read 0 bytes. NOOOOOOOOOOOOOO!!!! Error: Operation not permitted
On these platforms, I can get the code to work as expected by reducing the chunk size "enough", but I'm not sure how to determine an acceptable size programmatically...
Questions
- Am I using 
freadcorrectly? - Is there a more portable approach I should be using?
 - Any suggested workarounds?
 
Code
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
    FILE* file = fopen("test.txt", "rb");
    size_t chunk = 0x7FFFFFFF;
    char* buf = malloc(chunk);
    if (buf == NULL) {
        printf("malloc failed\n");
        return 1;
    }
    int count = fread(buf, 1, chunk, file);
    printf("Read %i bytes.\n", count);
    int eof = feof(file);
    if (eof) {
        printf("OK. EOF\n");
    }
    int err = ferror(file);
    if (err) {
        printf("NOOOOOOOOOOOOOO!!!! Error: %s\n", strerror(err));
        return 1;
    }
    free(buf);
    return 0;
}
For my test, I created test.txt with echo "a" >test.txt.