[glibc] stdio-common: In tst-setvbuf2, close helper thread descriptor only if opened

Florian Weimer fw@sourceware.org
Tue Apr 8 08:39:53 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=4fa959d13d21b8f56a43aa0a416100303736c55c

commit 4fa959d13d21b8f56a43aa0a416100303736c55c
Author: Florian Weimer <fweimer@redhat.com>
Date:   Tue Apr 8 10:39:44 2025 +0200

    stdio-common: In tst-setvbuf2, close helper thread descriptor only if opened
    
    The helper thread may get canceled before the open system
    call succeds.  Then ThreadData.fd remains zero, and eventually
    the xclose call in end_reader_thread fails because descriptor 0
    is not open.
    
    Instead, initialize the fd member to -1 (not a valid descriptor)
    and close the descriptor only if valid.  Do this in a new end_thread
    helper routine.
    
    Also add more error checking to close operations.
    
    Fixes commit 95b780c1d0549678c0a244c6e2112ec97edf0839 ("stdio: Add
    more setvbuf tests").

Diff:
---
 stdio-common/tst-setvbuf2.c | 39 +++++++++++++++++++++------------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/stdio-common/tst-setvbuf2.c b/stdio-common/tst-setvbuf2.c
index 6cc83355f3..84d8b43a58 100644
--- a/stdio-common/tst-setvbuf2.c
+++ b/stdio-common/tst-setvbuf2.c
@@ -240,6 +240,21 @@ typedef struct {
 /* It's OK if this is static, we only run one at a time.  */
 ThreadData thread_data;
 
+static void
+end_thread (pthread_t *ptid)
+{
+  if (*ptid)
+    {
+      pthread_cancel (*ptid);
+      xpthread_join (*ptid);
+      /* The descriptor was passed in, or the helper thread made
+	 sufficient progress and opened the file.  */
+      if (thread_data.fd >= 0)
+	xclose (thread_data.fd);
+      *ptid = 0;
+    }
+}
+
 static void *
 writer_thread_proc (void *closure)
 {
@@ -306,7 +321,7 @@ static void
 start_writer_thread_n (const char *fname)
 {
   debug;
-  thread_data.fd = 0;
+  thread_data.fd = -1;
   thread_data.fname = fname;
   writer_thread_tid = xpthread_create (NULL, writer_thread_proc,
 				       (void *)&thread_data);
@@ -316,13 +331,7 @@ static void
 end_writer_thread (void)
 {
   debug;
-  if (writer_thread_tid)
-    {
-      pthread_cancel (writer_thread_tid);
-      xpthread_join (writer_thread_tid);
-      xclose (thread_data.fd);
-      writer_thread_tid = 0;
-    }
+  end_thread (&writer_thread_tid);
 }
 
 static void
@@ -339,7 +348,7 @@ static void
 start_reader_thread_n (const char *fname)
 {
   debug;
-  thread_data.fd = 0;
+  thread_data.fd = -1;
   thread_data.fname = fname;
   reader_thread_tid = xpthread_create (NULL, reader_thread_proc,
 				       (void *)&thread_data);
@@ -349,13 +358,7 @@ static void
 end_reader_thread (void)
 {
   debug;
-  if (reader_thread_tid)
-    {
-      pthread_cancel (reader_thread_tid);
-      xpthread_join (reader_thread_tid);
-      xclose (thread_data.fd);
-      reader_thread_tid = 0;
-    }
+  end_thread (&reader_thread_tid);
 }
 
 /*------------------------------------------------------------*/
@@ -852,7 +855,7 @@ do_second_part (FILE *fp,
     }
 
 
-  fclose (fp);
+  xfclose (fp);
   return rv;
 }
 
@@ -939,7 +942,7 @@ recurse (FILE *fp,
       break;
 
     default: /* parent */
-      fclose (fp);
+      xfclose (fp);
       xwaitpid (pid, &status, 0);
       if (WIFEXITED (status)
 	  && WEXITSTATUS (status) == 0)


More information about the Glibc-cvs mailing list