| /* Test case for bug with mmap stdio read past end of file. */ |
| |
| #include <stdio.h> |
| #include <error.h> |
| #include <errno.h> |
| |
| static void do_prepare (void); |
| #define PREPARE(argc, argv) do_prepare () |
| static int do_test (void); |
| #define TEST_FUNCTION do_test () |
| #include <test-skeleton.c> |
| |
| static char *temp_file; |
| |
| static const char text1[] = "hello\n"; |
| |
| static void |
| do_prepare (void) |
| { |
| int temp_fd = create_temp_file ("tst-mmap-offend.", &temp_file); |
| if (temp_fd == -1) |
| error (1, errno, "cannot create temporary file"); |
| else |
| { |
| ssize_t cc = write (temp_fd, text1, sizeof text1 - 1); |
| if (cc != sizeof text1 - 1) |
| error (1, errno, "cannot write to temporary file"); |
| } |
| close (temp_fd); |
| } |
| |
| static int |
| do_test (void) |
| { |
| unsigned char buffer[8192]; |
| int result = 0; |
| FILE *f = fopen (temp_file, "rm"); |
| size_t cc; |
| |
| if (f == NULL) |
| { |
| perror (temp_file); |
| return 1; |
| } |
| |
| cc = fread (buffer, 1, sizeof (buffer), f); |
| printf ("fread %zu: \"%.*s\"\n", cc, (int) cc, buffer); |
| if (cc != sizeof text1 - 1) |
| { |
| perror ("fread"); |
| result = 1; |
| } |
| |
| if (fseek (f, 2048, SEEK_SET) != 0) |
| { |
| perror ("fseek off end"); |
| result = 1; |
| } |
| |
| if (fread (buffer, 1, sizeof (buffer), f) != 0 |
| || ferror (f) || !feof (f)) |
| { |
| printf ("after fread error %d eof %d\n", |
| ferror (f), feof (f)); |
| result = 1; |
| } |
| |
| printf ("ftell %ld\n", ftell (f)); |
| |
| if (fseek (f, 0, SEEK_SET) != 0) |
| { |
| perror ("fseek rewind"); |
| result = 1; |
| } |
| |
| cc = fread (buffer, 1, sizeof (buffer), f); |
| printf ("fread after rewind %zu: \"%.*s\"\n", cc, (int) cc, buffer); |
| if (cc != sizeof text1 - 1) |
| { |
| perror ("fread after rewind"); |
| result = 1; |
| } |
| |
| fclose (f); |
| return result; |
| } |