From abe46958ffd48a2af09b9f7753f89342e31fb1e1 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 30 Dec 2011 14:36:47 +0100 Subject: [PATCH] GFS: fix bend_assoc_is_alive When cs_get returns 0 the association is marked dead, rather then being destroyed. If not, the session memory is being free'd before the search/scan handler is finished. Also destroy request memory in request_release rather than in various places, which resulted in leaks from time to time. --- src/requestq.c | 2 ++ src/seshigh.c | 8 ++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/requestq.c b/src/requestq.c index 41517d9..43eadfb 100644 --- a/src/requestq.c +++ b/src/requestq.c @@ -91,6 +91,8 @@ request *request_get(request_q *q) void request_release(request *r) { request_q *q = r->q; + if (r->request_mem) + nmem_destroy(r->request_mem); r->next = q->list; q->list = r; } diff --git a/src/seshigh.c b/src/seshigh.c index 92627c2..6aa2fe0 100644 --- a/src/seshigh.c +++ b/src/seshigh.c @@ -270,11 +270,10 @@ int ir_read(IOCHAN h, int event) if ((assoc->cs_put_mask & EVENT_INPUT) == 0 && (event & assoc->cs_get_mask)) { - yaz_log(YLOG_DEBUG, "ir_session (input)"); /* We aren't speaking to this fellow */ if (assoc->state == ASSOC_DEAD) { - yaz_log(log_sessiondetail, "Connection closed - end of session"); + yaz_log(log_session, "Connection closed - end of session"); cs_close(conn); destroy_association(assoc); iochan_destroy(h); @@ -297,10 +296,8 @@ int ir_read(IOCHAN h, int event) } else if (res <= 0) { + assoc->state = ASSOC_DEAD; yaz_log(log_session, "Connection closed by client"); - cs_close(conn); - destroy_association(assoc); - iochan_destroy(h); return 0; } else if (res == 1) /* incomplete read - wait for more */ @@ -447,7 +444,6 @@ void ir_session(IOCHAN h, int event) yaz_log(YLOG_DEBUG, "HTTP out:\n%.*s", req->len_response, req->response); #endif - nmem_destroy(req->request_mem); request_deq(&assoc->outgoing); request_release(req); if (!request_head(&assoc->outgoing)) -- 1.7.10.4