Skip to content
Permalink
1ce8aaaedb
Switch branches/tags

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?
Go to file
 
 
Cannot retrieve contributors at this time
86 lines (72 sloc) 1.73 KB
/* 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;
}