emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] feature/async-dns df91173 2/4: Ensure we always free DNS r


From: Lars Ingebrigtsen
Subject: [Emacs-diffs] feature/async-dns df91173 2/4: Ensure we always free DNS resources when deleting a process
Date: Tue, 16 Feb 2016 02:38:11 +0000

branch: feature/async-dns
commit df91173405f97075e939fa7072f941d7d59c785d
Author: Lars Ingebrigtsen <address@hidden>
Commit: Lars Ingebrigtsen <address@hidden>

    Ensure we always free DNS resources when deleting a process
    
    * src/process.c (free_dns_request): Factor out into own function.
    (Fdelete_process): When deleting a process, free any DNS
    structures associated with it.
    (check_for_dns): Always free all DNS resources.
---
 src/process.c |   43 +++++++++++++++++++++++++++++++------------
 1 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/src/process.c b/src/process.c
index 9c09aee..02e19c3 100644
--- a/src/process.c
+++ b/src/process.c
@@ -743,6 +743,23 @@ remove_process (register Lisp_Object proc)
   deactivate_process (proc);
 }
 
+#ifdef HAVE_GETADDRINFO_A
+static void
+free_dns_request (Lisp_Object proc)
+{
+  struct Lisp_Process *p = XPROCESS (proc);
+
+  if (p->dns_requests[0]->ar_result)
+    freeaddrinfo (p->dns_requests[0]->ar_result);
+  xfree ((void *)p->dns_requests[0]->ar_request);
+  xfree ((void *)p->dns_requests[0]->ar_name);
+  xfree ((void *)p->dns_requests[0]->ar_service);
+  xfree (p->dns_requests[0]);
+  xfree (p->dns_requests);
+  p->dns_requests = NULL;
+}
+#endif
+
 
 DEFUN ("processp", Fprocessp, Sprocessp, 1, 1, 0,
        doc: /* Return t if OBJECT is a process.  */)
@@ -833,6 +850,14 @@ nil, indicating the current buffer's process.  */)
   process = get_process (process);
   p = XPROCESS (process);
 
+#ifdef HAVE_GETADDRINFO_A
+  if (p->dns_requests)
+    {
+      gai_cancel (p->dns_requests[0]);
+      free_dns_request (process);
+    }
+#endif
+
   p->raw_status_new = 0;
   if (NETCONN1_P (p) || SERIALCONN1_P (p) || PIPECONN1_P (p))
     {
@@ -4652,10 +4677,6 @@ check_for_dns (Lisp_Object proc)
   if (! p->dns_requests)
     return Qnil;
 
-  /* This process should not already be connected (or killed). */
-  if (!EQ (p->status, Qconnect))
-    return Qnil;
-
   ret = gai_error (p->dns_requests[0]);
   if (ret == EAI_INPROGRESS)
     return Qt;
@@ -4673,10 +4694,9 @@ check_for_dns (Lisp_Object proc)
        }
 
       ip_addresses = Fnreverse (ip_addresses);
-      freeaddrinfo (p->dns_requests[0]->ar_result);
     }
   /* The DNS lookup failed. */
-  else
+  else if (!EQ (p->status, Qconnect))
     {
       deactivate_process (proc);
       pset_status (p, (list2
@@ -4686,12 +4706,11 @@ check_for_dns (Lisp_Object proc)
                                 build_string (" failed")))));
     }
 
-  xfree ((void *)p->dns_requests[0]->ar_request);
-  xfree ((void *)p->dns_requests[0]->ar_name);
-  xfree ((void *)p->dns_requests[0]->ar_service);
-  xfree (p->dns_requests[0]);
-  xfree (p->dns_requests);
-  p->dns_requests = NULL;
+  free_dns_request (proc);
+
+  /* This process should not already be connected (or killed). */
+  if (!EQ (p->status, Qconnect))
+    return Qnil;
 
   return ip_addresses;
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]