Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
glibc/libio/tst-mmap-offend.c
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
86 lines (72 sloc)
1.73 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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; | |
} |