1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /* 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;
- }
|