tests: replace fread by xfread

With fortification enabled, fread calls return result needs to be checked,
has it gets the __wur macro enabled.
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
Frederic Berat 2023-06-12 17:18:20 +02:00 committed by Siddhesh Poyarekar
parent 127c21c0e2
commit a84dcb4bdf
9 changed files with 65 additions and 12 deletions

View File

@ -3,6 +3,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <support/xstdio.h>
static char *fname; static char *fname;
@ -48,7 +49,7 @@ do_test (void)
perror ("fopen(\"r\")"); perror ("fopen(\"r\")");
} }
fread (buf, 3, 1, f); xfread (buf, 3, 1, f);
errno = 0; errno = 0;
if (fseek (f, -10, SEEK_CUR) == 0) if (fseek (f, -10, SEEK_CUR) == 0)
{ {
@ -72,7 +73,7 @@ Got %d instead\n",
perror ("fopen(\"r+\")"); perror ("fopen(\"r+\")");
} }
fread (buf, 3, 1, f); xfread (buf, 3, 1, f);
errno = 0; errno = 0;
if (fseek (f, -10, SEEK_CUR) == 0) if (fseek (f, -10, SEEK_CUR) == 0)
{ {
@ -96,7 +97,7 @@ Got %d instead\n",
perror ("fopen(\"r+\")"); perror ("fopen(\"r+\")");
} }
fread (buf, 3, 1, f); xfread (buf, 3, 1, f);
if (ftell (f) != 3) if (ftell (f) != 3)
{ {
puts ("ftell failed"); puts ("ftell failed");

View File

@ -1,6 +1,8 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <support/xstdio.h>
char x[4096], z[4096], b[21], m[4096 * 4]; char x[4096], z[4096], b[21], m[4096 * 4];
int int
@ -20,24 +22,24 @@ main (void)
} }
rewind (f); rewind (f);
fread (m, 4096 * 4 - 10, 1, f); xfread (m, 4096 * 4 - 10, 1, f);
fread (b, 20, 1, f); xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx"); printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx");
if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx")) if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx"))
failed = 1; failed = 1;
fseek (f, -40, SEEK_CUR); fseek (f, -40, SEEK_CUR);
fread (b, 20, 1, f); xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "zzzzzzzzzzzzzzzzzzzz"); printf ("got %s (should be %s)\n", b, "zzzzzzzzzzzzzzzzzzzz");
if (strcmp (b, "zzzzzzzzzzzzzzzzzzzz")) if (strcmp (b, "zzzzzzzzzzzzzzzzzzzz"))
failed = 1; failed = 1;
fread (b, 20, 1, f); xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx"); printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx");
if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx")) if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx"))
failed = 1; failed = 1;
fread (b, 20, 1, f); xfread (b, 20, 1, f);
printf ("got %s (should be %s)\n", b, "xxxxxxxxxxxxxxxxxxxx"); printf ("got %s (should be %s)\n", b, "xxxxxxxxxxxxxxxxxxxx");
if (strcmp (b, "xxxxxxxxxxxxxxxxxxxx")) if (strcmp (b, "xxxxxxxxxxxxxxxxxxxx"))
failed = 1; failed = 1;

View File

@ -1,6 +1,8 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <support/xstdio.h>
int int
main (void) main (void)
{ {
@ -32,7 +34,7 @@ main (void)
char buf[25]; char buf[25];
buf[0] = j; buf[0] = j;
fread (buf + 1, 1, 23, f); xfread (buf + 1, 1, 23, f);
buf[24] = '\0'; buf[24] = '\0';
if (strcmp (buf, "Where does this text go?") != 0) if (strcmp (buf, "Where does this text go?") != 0)
{ {

View File

@ -2,6 +2,8 @@
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <support/xstdio.h>
int stdio_block_read = 1, stdio_block_write = 1; int stdio_block_read = 1, stdio_block_write = 1;
int int
@ -30,7 +32,7 @@ main (int argc, char *argv[])
fseek (f, 8180L, 0); fseek (f, 8180L, 0);
fwrite ("Where does this text come from?", 1, 31, f); fwrite ("Where does this text come from?", 1, 31, f);
fseek (f, 8180L, 0); fseek (f, 8180L, 0);
fread (buffer, 1, 31, f); xfread (buffer, 1, 31, f);
fwrite (buffer, 1, 31, stdout); fwrite (buffer, 1, 31, stdout);
fclose (f); fclose (f);
remove (filename); remove (filename);

View File

@ -5,6 +5,8 @@
#include <stdio.h> #include <stdio.h>
#include <support/xstdio.h>
#define THE_COOKIE ((void *) 0xdeadbeeful) #define THE_COOKIE ((void *) 0xdeadbeeful)
@ -77,7 +79,8 @@ do_test (void)
f = fopencookie (THE_COOKIE, "r+", fcts); f = fopencookie (THE_COOKIE, "r+", fcts);
fread (buf, 1, 1, f); xfread (buf, 1, 1, f);
fwrite (buf, 1, 1, f); fwrite (buf, 1, 1, f);
fseek (f, 0, SEEK_CUR); fseek (f, 0, SEEK_CUR);
fclose (f); fclose (f);

View File

@ -21,6 +21,8 @@
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <support/xstdio.h>
static void static void
print_buffer (const char *s, size_t n) print_buffer (const char *s, size_t n)
{ {
@ -153,7 +155,7 @@ do_test_read_seek_neg (const char *mode, const char *expected)
FILE *fp = fmemopen (buf, sizeof (buf), mode); FILE *fp = fmemopen (buf, sizeof (buf), mode);
fseek (fp, offset, SEEK_END); fseek (fp, offset, SEEK_END);
fread (tmp, tmps, 1, fp); xfread (tmp, tmps, 1, fp);
if (memcmp (tmp, expected, tmps) != 0) if (memcmp (tmp, expected, tmps) != 0)
{ {

View File

@ -125,6 +125,7 @@ libsupport-routines = \
xfclose \ xfclose \
xfopen \ xfopen \
xfork \ xfork \
xfread \
xfreopen \ xfreopen \
xftruncate \ xftruncate \
xgetline \ xgetline \

39
support/xfread.c Normal file
View File

@ -0,0 +1,39 @@
/* fread with error checking.
Copyright (C) 2023 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
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <support/xstdio.h>
#include <support/check.h>
#include <stdlib.h>
void
xfread (void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t count = 0;
char *p = ptr;
while (count < nmemb)
{
size_t ret = fread (p, size, nmemb - count, stream);
if (ret <= 0 && ferror(stream))
FAIL_EXIT1 ("read of %zu bytes failed after %td: %m",
size * nmemb, p - (char *) ptr);
count += ret;
p += size * ret;
}
}

View File

@ -27,6 +27,7 @@ __BEGIN_DECLS
FILE *xfopen (const char *path, const char *mode); FILE *xfopen (const char *path, const char *mode);
void xfclose (FILE *); void xfclose (FILE *);
FILE *xfreopen (const char *path, const char *mode, FILE *stream); FILE *xfreopen (const char *path, const char *mode, FILE *stream);
void xfread (void *ptr, size_t size, size_t nmemb, FILE *stream);
/* Read a line from FP, using getline. *BUFFER must be NULL, or a /* Read a line from FP, using getline. *BUFFER must be NULL, or a
heap-allocated pointer of *LENGTH bytes. Return the number of heap-allocated pointer of *LENGTH bytes. Return the number of