]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix segfault from double free
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 31 Jan 2016 01:00:12 +0000 (02:00 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 31 Jan 2016 01:00:12 +0000 (02:00 +0100)
* process.c (check_for_dns): Protect against double free
issues.

src/process.c

index 0fe45185361a1d4bc77aec9841dcc361f8a49f26..a30dd23077cb6b4cfec9f138bc1232a303414b3f 100644 (file)
@@ -4542,6 +4542,11 @@ check_for_dns (Lisp_Object proc)
   struct Lisp_Process *p = XPROCESS (proc);
   Lisp_Object ip_addresses = Qnil;
   int ret = 0;
+  int connect = 0;
+
+  /* Sanity check. */
+  if (! p->dns_requests)
+    return 1;
 
   ret = gai_error (p->dns_requests[0]);
   if (ret == EAI_INPROGRESS)
@@ -4561,7 +4566,7 @@ check_for_dns (Lisp_Object proc)
 
       ip_addresses = Fnreverse (ip_addresses);
       freeaddrinfo (p->dns_requests[0]->ar_result);
-      connect_network_socket (proc, ip_addresses);
+      connect = 1;
     }
   else
     pset_status (p, Qfailed);
@@ -4571,6 +4576,11 @@ check_for_dns (Lisp_Object proc)
   xfree ((void *)p->dns_requests[0]->ar_service);
   xfree (p->dns_requests[0]);
   xfree (p->dns_requests);
+  p->dns_requests = NULL;
+
+  if (connect)
+    connect_network_socket (proc, ip_addresses);
+
   return 1;
 }
 #endif /* HAVE_GETADDRINFO_A */