Blame libio/tst-mmap-offend.c

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