diff --git a/ChangeLog b/ChangeLog index 9e11c51201..71e1e5b74e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-07-07 Ulrich Drepper + + [BZ #4745] + * libio/strops.c (_IO_str_underflow): Clear errno before returning + EOF. + * stdio-common/Makefile (tests): Add bug18. + * stdio-common/bug18.c: New file. + 2007-07-05 Mike Frysinger * Makeconfig ($(common-objpfx)gnu/lib-names.stmp): Use LC_ALL=C when diff --git a/libio/strops.c b/libio/strops.c index 05270ce407..c3222e0803 100644 --- a/libio/strops.c +++ b/libio/strops.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997-2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1997-2004, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -166,7 +166,12 @@ _IO_str_underflow (fp) if (fp->_IO_read_ptr < fp->_IO_read_end) return *((unsigned char *) fp->_IO_read_ptr); else - return EOF; + { + /* We have to reset errno since callers check for errno being + EINTR and there has been no such problem here. */ + __set_errno (0); + return EOF; + } } INTDEF(_IO_str_underflow) diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 735b40104a..57797c7f2b 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -54,7 +54,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \ tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \ tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \ tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \ - tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 + tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 test-srcs = tst-unbputc tst-printf diff --git a/stdio-common/bug18.c b/stdio-common/bug18.c new file mode 100644 index 0000000000..c3a86e5786 --- /dev/null +++ b/stdio-common/bug18.c @@ -0,0 +1,42 @@ +#include +#include +#include + + +static int +do_test (void) +{ + printf("setting errno to EINTR\n"); + errno = EINTR; + + printf("checking sscanf\n"); + + char str[] = "7-11"; + int i, j, n; + + i = j = n = 0; + sscanf (str, " %i - %i %n", &i, &j, &n); + printf ("found %i-%i (length=%i)\n", i, j, n); + + int result = 0; + if (i != 7) + { + printf ("i is %d, expected 7\n", i); + result = 1; + } + if (j != 11) + { + printf ("j is %d, expected 11\n", j); + result = 1; + } + if (n != 4) + { + printf ("n is %d, expected 4\n", j); + result = 1; + } + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c"