# HG changeset patch # User Andreas Schwab # Date 937298004 0 # Node ID 1f109108fa7edc56e42749838e23fad46b34d949 # Parent 71063541d5e3620fc390f724834cc45ae0fb6460 (Fopen_network_stream): Avoid socket decriptor leak. diff -r 71063541d5e3 -r 1f109108fa7e src/process.c --- 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