diff --git a/libio/Makefile b/libio/Makefile index cb390a53d6..d10d6c1648 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -50,7 +50,7 @@ tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc \ tst_wprintf2 tst-widetext test-fmemopen tst-ext tst-fopenloc \ tst-fgetws tst-ungetwc1 tst-ungetwc2 tst-swscanf tst-sscanf \ tst-mmap-setvbuf bug-ungetwc1 bug-ungetwc2 tst-atime tst-eof \ - tst-freopen bug-rewind + tst-freopen bug-rewind bug-ungetc test-srcs = test-freopen all: # Make this the default target; it will be defined in Rules. diff --git a/libio/bug-ungetc.c b/libio/bug-ungetc.c new file mode 100644 index 0000000000..51940b68f5 --- /dev/null +++ b/libio/bug-ungetc.c @@ -0,0 +1,61 @@ +/* Test program for ungetc/ftell interaction bug. */ + +#include + +static void do_prepare (void); +#define PREPARE(argc, argv) do_prepare () +static int do_test (void); +#define TEST_FUNCTION do_test () +#include + +static const char pattern[] = "12345"; +static char *temp_file; + +static void +do_prepare (void) +{ + int fd = create_temp_file ("bug-ungetc.", &temp_file); + if (fd == -1) + { + printf ("cannot create temporary file: %m\n"); + exit (1); + } + write (fd, pattern, sizeof (pattern)); + close (fd); +} + +static int +do_test (void) +{ + int i; + FILE *f; + char buf[10]; + long offset, diff; + int result = 0; + + f = fopen (temp_file, "rw"); + + rewind (f); + for (i = 0; i < 3; i++) + printf ("%c\n", getc (f)); + offset = ftell (f); + printf ("offset = %ld\n", offset); + if (ungetc ('4', f) != '4') + { + printf ("ungetc failed\n"); + abort (); + } + printf ("offset after ungetc = %ld\n", ftell (f)); + + i = fread ((void *) buf, 4, (size_t) 1, f); + printf ("read %d (%c), offset = %ld\n", i, buf[0], ftell (f)); + diff = ftell (f) - offset; + if (diff != 3) + { + printf ("ftell did not update properly. got %ld, expected 3\n", diff); + result = 1; + } + fclose (f); + + return result; +}