changeset 25705:1f109108fa7e

(Fopen_network_stream): Avoid socket decriptor leak.
author Andreas Schwab <schwab@suse.de>
date Tue, 14 Sep 1999 08:33:24 +0000
parents 71063541d5e3
children 498eb90e1723
files src/process.c
diffstat 1 files changed, 14 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/process.c	Tue Sep 14 08:29:51 1999 +0000
+++ b/src/process.c	Tue Sep 14 08:33:24 1999 +0000
@@ -1834,6 +1834,7 @@
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
   int retry = 0;
   int count = specpdl_ptr - specpdl;
+  int count1;
 
 #ifdef WINDOWSNT
   /* Ensure socket support is loaded if available. */
@@ -1899,6 +1900,10 @@
     immediate_quit = 0;
   }
 
+  s = -1;
+  count1 = specpdl_ptr - specpdl;
+  record_unwind_protect (close_file_unwind, make_number (s));
+
   for (lres = res; lres; lres = lres->ai_next)
     {
       s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol);
@@ -1984,6 +1989,9 @@
   if (s < 0) 
     report_file_error ("error creating socket", Fcons (name, Qnil));
 
+  count1 = specpdl_ptr - specpdl;
+  record_unwind_protect (close_file_unwind, make_number (s));
+
   /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
      when connect is interrupted.  So let's not let it get interrupted.
      Note we do not turn off polling, because polling is only used
@@ -2017,6 +2025,9 @@
 	  goto loop;
 	}
 
+      /* Discard the unwind protect.  */
+      specpdl_ptr = specpdl + count1;
+
       close (s);
 
       if (interrupt_input)
@@ -2030,6 +2041,9 @@
 
   immediate_quit = 0;
 
+  /* Discard the unwind protect.  */
+  specpdl_ptr = specpdl + count1;
+
 #ifdef POLL_FOR_INPUT
   unbind_to (count, Qnil);
 #endif