diff options
| author | Lars Ingebrigtsen | 2016-01-31 02:00:12 +0100 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2016-01-31 02:00:12 +0100 |
| commit | 1f71df7aacf15dbf242c74a4b7a7ac8fe0984a3c (patch) | |
| tree | 11136901fcb93c5dc4097045ef9caf18cb39dad6 /src/process.c | |
| parent | e2d0ccc96e3314d836c7b38fbee4c30eb8ee9dac (diff) | |
| download | emacs-1f71df7aacf15dbf242c74a4b7a7ac8fe0984a3c.tar.gz emacs-1f71df7aacf15dbf242c74a4b7a7ac8fe0984a3c.zip | |
Fix segfault from double free
* process.c (check_for_dns): Protect against double free
issues.
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/process.c b/src/process.c index 0fe45185361..a30dd23077c 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -4542,6 +4542,11 @@ check_for_dns (Lisp_Object proc) | |||
| 4542 | struct Lisp_Process *p = XPROCESS (proc); | 4542 | struct Lisp_Process *p = XPROCESS (proc); |
| 4543 | Lisp_Object ip_addresses = Qnil; | 4543 | Lisp_Object ip_addresses = Qnil; |
| 4544 | int ret = 0; | 4544 | int ret = 0; |
| 4545 | int connect = 0; | ||
| 4546 | |||
| 4547 | /* Sanity check. */ | ||
| 4548 | if (! p->dns_requests) | ||
| 4549 | return 1; | ||
| 4545 | 4550 | ||
| 4546 | ret = gai_error (p->dns_requests[0]); | 4551 | ret = gai_error (p->dns_requests[0]); |
| 4547 | if (ret == EAI_INPROGRESS) | 4552 | if (ret == EAI_INPROGRESS) |
| @@ -4561,7 +4566,7 @@ check_for_dns (Lisp_Object proc) | |||
| 4561 | 4566 | ||
| 4562 | ip_addresses = Fnreverse (ip_addresses); | 4567 | ip_addresses = Fnreverse (ip_addresses); |
| 4563 | freeaddrinfo (p->dns_requests[0]->ar_result); | 4568 | freeaddrinfo (p->dns_requests[0]->ar_result); |
| 4564 | connect_network_socket (proc, ip_addresses); | 4569 | connect = 1; |
| 4565 | } | 4570 | } |
| 4566 | else | 4571 | else |
| 4567 | pset_status (p, Qfailed); | 4572 | pset_status (p, Qfailed); |
| @@ -4571,6 +4576,11 @@ check_for_dns (Lisp_Object proc) | |||
| 4571 | xfree ((void *)p->dns_requests[0]->ar_service); | 4576 | xfree ((void *)p->dns_requests[0]->ar_service); |
| 4572 | xfree (p->dns_requests[0]); | 4577 | xfree (p->dns_requests[0]); |
| 4573 | xfree (p->dns_requests); | 4578 | xfree (p->dns_requests); |
| 4579 | p->dns_requests = NULL; | ||
| 4580 | |||
| 4581 | if (connect) | ||
| 4582 | connect_network_socket (proc, ip_addresses); | ||
| 4583 | |||
| 4574 | return 1; | 4584 | return 1; |
| 4575 | } | 4585 | } |
| 4576 | #endif /* HAVE_GETADDRINFO_A */ | 4586 | #endif /* HAVE_GETADDRINFO_A */ |