diff src/process.c @ 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 a14111a2a100
children d051dc68801d
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