Integrate from perlio:
Jarkko Hietaniemi [Sat, 18 Jan 2003 18:36:00 +0000 (18:36 +0000)]
[ 18507]
Thread-protection for dup/fclose/dup2 scheme of stdio leak
avoidance.
p4raw-link: @18507 on //depot/perlio: 997ec9b4c5029a8aa56f484e7b625da92e3e0521

p4raw-id: //depot/perl@18514

perlio.c

index de6950b..2d5785b 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -2708,6 +2708,13 @@ PerlIOStdio_close(pTHX_ PerlIO *f)
            }
            else {
                /* Tricky - must fclose(stdio) to free memory but not close(fd) */ 
+#ifdef USE_THREADS
+               /* Sarathy pointed out that another thread could reuse
+                  fd after fclose() but before we dup2() below
+                  so take out a MUTEX to shut them out 
+                */  
+               MUTEX_LOCK(&PerlIO_mutex);
+#endif
                dupfd = PerlLIO_dup(fd);
            }
        }    
@@ -2725,12 +2732,14 @@ PerlIOStdio_close(pTHX_ PerlIO *f)
            /* We need to restore fd from the saved copy */
            if (PerlLIO_dup2(dupfd,fd) != fd)
              result = -1;
+#ifdef USE_THREADS
+           MUTEX_UNLOCK(&PerlIO_mutex);
+#endif
            if (PerlLIO_close(dupfd) != 0)
              result = -1; 
        }
        return result;
     } 
-
 }