summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcorvid <devnull@localhost>2015-03-05 06:14:56 +0000
committercorvid <devnull@localhost>2015-03-05 06:14:56 +0000
commit09c394a5917f7f96e91ec7f07542768a562793b3 (patch)
tree28e04bae0b1f47997af2ea332f75cbdd1e543796 /src
parent14cc0a100856253987d2e6859ffe657f75c0cdb1 (diff)
http, don't presume that socket data is found in ValidSocks
jeremy's valgrind logs have an instance of ==15610== Invalid read of size 4 ==15610== at 0x8090B53: Http_socket_reuse (http.c:668)
Diffstat (limited to 'src')
-rw-r--r--src/IO/http.c59
1 files changed, 31 insertions, 28 deletions
diff --git a/src/IO/http.c b/src/IO/http.c
index 49b3a3ac..fdc5d308 100644
--- a/src/IO/http.c
+++ b/src/IO/http.c
@@ -665,37 +665,40 @@ static int Http_get(ChainLink *Info, void *Data1)
static void Http_socket_reuse(int SKey)
{
SocketData_t *new_sd, *old_sd = a_Klist_get_data(ValidSocks, SKey);
- HostConnection_t *hc = Http_host_connection_get(old_sd->connected_to);
- int i, n = dList_length(hc->queue);
- for (i = 0; i < n; i++) {
- new_sd = dList_nth_data(hc->queue, i);
-
- if (a_Web_valid(new_sd->web) && old_sd->port == new_sd->port) {
- new_sd->SockFD = old_sd->SockFD;
- Http_fd_map_remove_entry(old_sd->SockFD);
- a_Klist_remove(ValidSocks, SKey);
- dFree(old_sd);
-
- dList_remove(hc->queue, new_sd);
- new_sd->flags &= ~HTTP_SOCKET_QUEUED;
- FdMapEntry_t *e = dNew0(FdMapEntry_t, 1);
- e->fd = new_sd->SockFD;
- e->skey = VOIDP2INT(new_sd->Info->LocalKey);
- dList_append(fd_map, e);
-
- a_Chain_bcb(OpSend, new_sd->Info, &new_sd->SockFD, "FD");
- a_Chain_fcb(OpSend, new_sd->Info, &new_sd->SockFD, "FD");
- Http_send_query(new_sd->Info, new_sd);
- new_sd->connected_to = hc->host;
- return;
+ if (old_sd) {
+ HostConnection_t *hc = Http_host_connection_get(old_sd->connected_to);
+ int i, n = dList_length(hc->queue);
+
+ for (i = 0; i < n; i++) {
+ new_sd = dList_nth_data(hc->queue, i);
+
+ if (a_Web_valid(new_sd->web) && old_sd->port == new_sd->port) {
+ new_sd->SockFD = old_sd->SockFD;
+ Http_fd_map_remove_entry(old_sd->SockFD);
+ a_Klist_remove(ValidSocks, SKey);
+ dFree(old_sd);
+
+ dList_remove(hc->queue, new_sd);
+ new_sd->flags &= ~HTTP_SOCKET_QUEUED;
+ FdMapEntry_t *e = dNew0(FdMapEntry_t, 1);
+ e->fd = new_sd->SockFD;
+ e->skey = VOIDP2INT(new_sd->Info->LocalKey);
+ dList_append(fd_map, e);
+
+ a_Chain_bcb(OpSend, new_sd->Info, &new_sd->SockFD, "FD");
+ a_Chain_fcb(OpSend, new_sd->Info, &new_sd->SockFD, "FD");
+ Http_send_query(new_sd->Info, new_sd);
+ new_sd->connected_to = hc->host;
+ return;
+ }
}
+ dClose(old_sd->SockFD);
+ Http_fd_map_remove_entry(old_sd->SockFD);
+ a_Klist_remove(ValidSocks, SKey);
+ hc->active_conns--;
+ dFree(old_sd);
}
- dClose(old_sd->SockFD);
- Http_fd_map_remove_entry(old_sd->SockFD);
- a_Klist_remove(ValidSocks, SKey);
- hc->active_conns--;
- dFree(old_sd);
}
/*