tests: replace fread by xfread
authorFrederic Berat <fberat@redhat.com>
Mon, 12 Jun 2023 15:18:20 +0000 (17:18 +0200)
committerSiddhesh Poyarekar <siddhesh@sourceware.org>
Tue, 13 Jun 2023 23:59:08 +0000 (19:59 -0400)
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>
libio/bug-fseek.c
stdio-common/bug12.c
stdio-common/bug3.c
stdio-common/bug4.c
stdio-common/tst-cookie.c
stdio-common/tst-fmemopen3.c
support/Makefile
support/xfread.c [new file with mode: 0644]
support/xstdio.h

index 1b60580b53cef07a9de7c735133e4cb207fdcb1f..19d5e2429e36f615d8404bf097dfed5ff8a5e8eb 100644 (file)
@@ -3,6 +3,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+#include <support/xstdio.h>
 
 static char *fname;
 
@@ -48,7 +49,7 @@ do_test (void)
       perror ("fopen(\"r\")");
     }
 
-  fread (buf, 3, 1, f);
+  xfread (buf, 3, 1, f);
   errno = 0;
   if (fseek (f, -10, SEEK_CUR) == 0)
     {
@@ -72,7 +73,7 @@ Got %d instead\n",
       perror ("fopen(\"r+\")");
     }
 
-  fread (buf, 3, 1, f);
+  xfread (buf, 3, 1, f);
   errno = 0;
   if (fseek (f, -10, SEEK_CUR) == 0)
     {
@@ -96,7 +97,7 @@ Got %d instead\n",
       perror ("fopen(\"r+\")");
     }
 
-  fread (buf, 3, 1, f);
+  xfread (buf, 3, 1, f);
   if (ftell (f) != 3)
     {
       puts ("ftell failed");
index 48610c0e78e81b5b8b69aaac887ff3c50d6d192c..1ba296deb43c0e41b687e950860b5dab45e72da6 100644 (file)
@@ -1,6 +1,8 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <support/xstdio.h>
+
 char x[4096], z[4096], b[21], m[4096 * 4];
 
 int
@@ -20,24 +22,24 @@ main (void)
     }
   rewind (f);
 
-  fread (m, 4096 * 4 - 10, 1, f);
-  fread (b, 20, 1, f);
+  xfread (m, 4096 * 4 - 10, 1, f);
+  xfread (b, 20, 1, f);
   printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx");
   if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx"))
     failed = 1;
 
   fseek (f, -40, SEEK_CUR);
-  fread (b, 20, 1, f);
+  xfread (b, 20, 1, f);
   printf ("got %s (should be %s)\n", b, "zzzzzzzzzzzzzzzzzzzz");
   if (strcmp (b, "zzzzzzzzzzzzzzzzzzzz"))
     failed = 1;
 
-  fread (b, 20, 1, f);
+  xfread (b, 20, 1, f);
   printf ("got %s (should be %s)\n", b, "zzzzzzzzzzxxxxxxxxxx");
   if (strcmp (b, "zzzzzzzzzzxxxxxxxxxx"))
     failed = 1;
 
-  fread (b, 20, 1, f);
+  xfread (b, 20, 1, f);
   printf ("got %s (should be %s)\n", b, "xxxxxxxxxxxxxxxxxxxx");
   if (strcmp (b, "xxxxxxxxxxxxxxxxxxxx"))
     failed = 1;
index 62a6cab330925296c40740a980415664c42d9aae..deabd0057290e64bcecfcecb26a9ae12670fe1a5 100644 (file)
@@ -1,6 +1,8 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <support/xstdio.h>
+
 int
 main (void)
 {
@@ -32,7 +34,7 @@ main (void)
              char buf[25];
 
              buf[0] = j;
-             fread (buf + 1, 1, 23, f);
+             xfread (buf + 1, 1, 23, f);
              buf[24] = '\0';
              if (strcmp (buf, "Where does this text go?") != 0)
                {
index cf7fe116ebc29fcfcf3cf4b9089e762f58e8a7a0..4059ff75b3df916a1ed1f1895d95c3101ba00a41 100644 (file)
@@ -2,6 +2,8 @@
 #include <unistd.h>
 #include <string.h>
 
+#include <support/xstdio.h>
+
 int stdio_block_read = 1, stdio_block_write = 1;
 
 int
@@ -30,7 +32,7 @@ main (int argc, char *argv[])
   fseek (f, 8180L, 0);
   fwrite ("Where does this text come from?", 1, 31, f);
   fseek (f, 8180L, 0);
-  fread (buffer, 1, 31, f);
+  xfread (buffer, 1, 31, f);
   fwrite (buffer, 1, 31, stdout);
   fclose (f);
   remove (filename);
index 030e6845623b14ea0a5c0c99c56364a27d1ab59a..90ebc8e58c4b5f2348a7c3153aa7fb378a80def0 100644 (file)
@@ -5,6 +5,8 @@
 
 #include <stdio.h>
 
+#include <support/xstdio.h>
+
 
 #define THE_COOKIE ((void *) 0xdeadbeeful)
 
@@ -77,7 +79,8 @@ do_test (void)
 
   f = fopencookie (THE_COOKIE, "r+", fcts);
 
-  fread (buf, 1, 1, f);
+  xfread (buf, 1, 1, f);
+
   fwrite (buf, 1, 1, f);
   fseek (f, 0, SEEK_CUR);
   fclose (f);
index bef87b712ad68c3b24d2646a8d6c11cf4cac8c6c..1627f17f59fbdb4fef6a3062536fad264b3f8db3 100644 (file)
@@ -21,6 +21,8 @@
 #include <string.h>
 #include <sys/types.h>
 
+#include <support/xstdio.h>
+
 static void
 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);
   fseek (fp, offset, SEEK_END);
-  fread (tmp, tmps, 1, fp);
+  xfread (tmp, tmps, 1, fp);
 
   if (memcmp (tmp, expected, tmps) != 0)
     {
index 130de4a9858c1add92312aba04119087090dfa4f..1f0f526e06451004628cc1a47c58db3eed3a185f 100644 (file)
@@ -125,6 +125,7 @@ libsupport-routines = \
   xfclose \
   xfopen \
   xfork \
+  xfread \
   xfreopen \
   xftruncate \
   xgetline \
diff --git a/support/xfread.c b/support/xfread.c
new file mode 100644 (file)
index 0000000..948f0c8
--- /dev/null
@@ -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;
+    }
+}
index 5410d42579231cc08dd51d3f1244454bb66fec86..633c342c8218938dc02683a1cfb39b8bf3ef278d 100644 (file)
@@ -27,6 +27,7 @@ __BEGIN_DECLS
 FILE *xfopen (const char *path, const char *mode);
 void xfclose (FILE *);
 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
    heap-allocated pointer of *LENGTH bytes.  Return the number of