Skip to content

Commit

Permalink
[BZ #4745]
Browse files Browse the repository at this point in the history
	* stdio-common/vfscanf.c (_IO_vfscanf): Add additional test for EOF
	in loop to look for conversion specifier to avoid testing of
	wrong errno value.
	* stdio-common/Makefile (tests): Add bug18, bug18a, bug19, bug19a.
	* stdio-common/bug18.c: New file.
	* stdio-common/bug18a.c: New file.
	* stdio-common/bug19.c: New file.
	* stdio-common/bug19a.c: New file.
  • Loading branch information
Jakub Jelinek committed Jul 8, 2007
1 parent 027dc27 commit 41dfb5c
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 4 deletions.
12 changes: 12 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
2007-07-07 Ulrich Drepper <drepper@redhat.com>

[BZ #4745]
* stdio-common/vfscanf.c (_IO_vfscanf): Add additional test for EOF
in loop to look for conversion specifier to avoid testing of
wrong errno value.
* stdio-common/Makefile (tests): Add bug18, bug18a, bug19, bug19a.
* stdio-common/bug18.c: New file.
* stdio-common/bug18a.c: New file.
* stdio-common/bug19.c: New file.
* stdio-common/bug19a.c: New file.

2007-06-06 Jakub Jelinek <jakub@redhat.com>

[BZ #4586]
Expand Down
3 changes: 2 additions & 1 deletion stdio-common/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ 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 bug18a \
bug19 bug19a

test-srcs = tst-unbputc tst-printf

Expand Down
48 changes: 48 additions & 0 deletions stdio-common/bug18.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <assert.h>
#include <errno.h>
#include <stdio.h>

#ifndef CHAR
# define CHAR char
# define L(str) str
# define SSCANF sscanf
#endif


static int
do_test (void)
{
printf("setting errno to EINTR\n");
errno = EINTR;

printf("checking sscanf\n");

CHAR str[] = L("7-11");
int i, j, n;

i = j = n = 0;
SSCANF (str, L(" %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"
6 changes: 6 additions & 0 deletions stdio-common/bug18a.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include <wchar.h>
#define CHAR wchar_t
#define L(str) L##str
#define SSCANF swscanf

#include "bug18.c"
58 changes: 58 additions & 0 deletions stdio-common/bug19.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include <assert.h>
#include <errno.h>
#include <stdio.h>

#ifndef CHAR
# define CHAR char
# define L(str) str
# define FPUTS fputs
# define FSCANF fscanf
#endif


static int
do_test (void)
{
FILE *fp = tmpfile ();
if (fp == NULL)
{
puts ("cannot open file");
return 1;
}

FPUTS (L("7-11"), fp);
rewind (fp);

printf("setting errno to EINTR\n");
errno = EINTR;

printf("checking sscanf\n");

int i, j, n;

i = j = n = 0;
FSCANF (fp, L(" %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"
7 changes: 7 additions & 0 deletions stdio-common/bug19a.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include <wchar.h>
#define CHAR wchar_t
#define L(str) L##str
#define FPUTS fputws
#define FSCANF fwscanf

#include "bug19.c"
11 changes: 8 additions & 3 deletions stdio-common/vfscanf.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,12 +530,17 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
{
/* Eat whitespace. */
int save_errno = errno;
errno = 0;
__set_errno (0);
do
if (__builtin_expect (inchar () == EOF && errno == EINTR, 0))
/* We add the additional test for EOF here since otherwise
inchar will restore the old errno value which might be
EINTR but does not indicate an interrupt since nothing
was read at this time. */
if (__builtin_expect ((c == EOF || inchar () == EOF)
&& errno == EINTR, 0))
input_error ();
while (ISSPACE (c));
errno = save_errno;
__set_errno (save_errno);
ungetc (c, s);
skip_space = 0;
}
Expand Down

0 comments on commit 41dfb5c

Please sign in to comment.