Mercurial > emacs
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