]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
tests: replace read by xread
authorFrédéric Bérat <fberat@redhat.com>
Wed, 14 Jun 2023 08:52:06 +0000 (10:52 +0200)
committerSiddhesh Poyarekar <siddhesh@sourceware.org>
Mon, 19 Jun 2023 13:14:56 +0000 (09:14 -0400)
With fortification enabled, read calls return result needs to be checked,
has it gets the __wur macro enabled.

Note on read call removal from  sysdeps/pthread/tst-cancel20.c and
sysdeps/pthread/tst-cancel21.c:
It is assumed that this second read call was there to overcome the race
condition between pipe closure and thread cancellation that could happen
in the original code. Since this race condition got fixed by
d0e3ffb7a58854248f1d5e737610d50cd0a60f46 the second call seems
superfluous. Hence, instead of checking for the return value of read, it
looks reasonable to simply remove it.
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
dirent/tst-fdopendir.c
nptl/tst-cleanup4.c
support/Makefile
support/test-container.c
support/xread.c [new file with mode: 0644]
support/xunistd.h
sysdeps/pthread/Makefile
sysdeps/pthread/tst-cancel11.c
sysdeps/pthread/tst-cancel20.c
sysdeps/pthread/tst-cancel21.c
sysdeps/pthread/tst-fini1mod.c

index 2c9520574dddfba89da4b688c42da55bdc246039..d6a24f47db25b7b6f638682f49161597c3e9354c 100644 (file)
@@ -45,7 +45,8 @@ do_test (void)
     }
 
   char buf[5];
-  read(fd, buf, sizeof (buf));
+  xread(fd, buf, sizeof (buf));
+
   close(fd);
 
   struct stat64 st2;
index 1d3d53fb5f14f7b2539beefe2fd2feccd74dff9c..f2e9f263e5cbce2a54295b02a70b4e86afdf56de 100644 (file)
@@ -21,6 +21,8 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+#include <support/xunistd.h>
+
 /* LinuxThreads pthread_cleanup_{push,pop} helpers.  */
 extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer,
                                    void (*__routine) (void *),
@@ -64,7 +66,7 @@ fn_read (void)
     }
 
   char c;
-  read (fds[0], &c, 1);
+  xread (fds[0], &c, 1);
 }
 
 
index 8ebe68aa95cdcc17b18ee82c89c2016c8d734624..5939e5346981e36268afcbaaea6302b686a54cbb 100644 (file)
@@ -197,6 +197,7 @@ libsupport-routines = \
   xpthread_spin_lock \
   xpthread_spin_unlock \
   xraise \
+  xread \
   xreadlink \
   xrealloc \
   xrecvfrom \
index 20ea19af37aa3a25ed5167cefe55fb94d264f278..788b091ea082ab813f8ff820818f1fc1cdf4de1b 100644 (file)
@@ -1217,7 +1217,8 @@ main (int argc, char **argv)
 
   /* Get our "outside" pid from our parent.  We use this to help with
      debugging from outside the container.  */
-  read (pipes[0], &child, sizeof(child));
+  xread (pipes[0], &child, sizeof(child));
+
   close (pipes[0]);
   close (pipes[1]);
   sprintf (pid_buf, "%lu", (long unsigned)child);
diff --git a/support/xread.c b/support/xread.c
new file mode 100644 (file)
index 0000000..19f76fc
--- /dev/null
@@ -0,0 +1,36 @@
+/* read with error checking and retries.
+   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/xunistd.h>
+
+#include <support/check.h>
+
+void
+xread (int fd, void *buffer, size_t length)
+{
+  char *p = buffer;
+  char *end = p + length;
+  while (p < end)
+    {
+      ssize_t ret = read (fd, p, end - p);
+      if (ret < 0)
+        FAIL_EXIT1 ("read of %zu bytes failed after %td: %m",
+                    length, p - (char *) buffer);
+      p += ret;
+    }
+}
index 43a1e69fcb9e33c0825a72c50e5a10eea8d71805..0aa2638a8da152ffd452b18f6e3877261b269c8d 100644 (file)
@@ -77,6 +77,9 @@ void xclose (int);
 /* Write the buffer.  Retry on short writes.  */
 void xwrite (int, const void *, size_t);
 
+/* Read to buffer.  Retry on short reads.  */
+void xread (int, void *, size_t);
+
 /* Invoke mmap with a zero file offset.  */
 void *xmmap (void *addr, size_t length, int prot, int flags, int fd);
 void xmprotect (void *addr, size_t length, int prot);
index 5df1109dd3ac805734be15d945a78423d2db23a8..32cf4eb119c09676c9e6399a98994403b2dd4769 100644 (file)
@@ -464,7 +464,7 @@ $(objpfx)tst-cancel28: $(librt)
 
 $(objpfx)tst-fini1: $(shared-thread-library) $(objpfx)tst-fini1mod.so
 
-$(objpfx)tst-fini1mod.so: $(shared-thread-library)
+$(objpfx)tst-fini1mod.so: $(libsupport) $(shared-thread-library)
 
 $(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so
 LDFLAGS-tst-_res1mod1.so = -Wl,-soname,tst-_res1mod1.so
index 4dd84d6673c59f9fa88876968fe00d35a8f84c11..0fdc44415424d85868928d0909a1ccedd22fe426 100644 (file)
@@ -56,7 +56,11 @@ tf (void *arg)
 
   /* This call should block and be cancelable.  */
   char buf[20];
-  read (fd[0], buf, sizeof (buf));
+  if (read (fd[0], buf, sizeof (buf)))
+  {
+    puts ("read unexpectedly returned");
+    exit (1);
+  }
 
   pthread_cleanup_pop (0);
 
index 1d5c53049bfc14d620c8a7c1a2b540aecf0c8dad..93f287aa4f47940dca09da62f076e281da9d0801 100644 (file)
@@ -84,8 +84,6 @@ tf_body (void)
       exit (1);
     }
 
-  read (fd[0], &c, 1);
-
   pthread_cleanup_pop (0);
 }
 
index bc4ff308f93e808a20f88fe8b078b64b67b072ff..ec8bf0dba30a00b9afc5e435314d12184a415578 100644 (file)
@@ -85,8 +85,6 @@ tf_body (void)
       exit (1);
     }
 
-  read (fd[0], &c, 1);
-
   pthread_cleanup_pop (0);
 }
 
index cdadf034cd7de890f56b2bfb3625134500a11f8b..0a45f6c5f2f0283c458301b3a7613c314df922fb 100644 (file)
@@ -20,6 +20,8 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+#include <support/xunistd.h>
+
 
 static void *
 tf (void *arg)
@@ -32,7 +34,7 @@ tf (void *arg)
     }
 
   char buf[10];
-  read (fds[0], buf, sizeof (buf));
+  xread (fds[0], buf, sizeof (buf));
 
   puts ("read returned");
   exit (1);