Fix another request leak that occured on bad HTTP requests
[yaz-moved-to-github.git] / server / seshigh.c
index eedf040..34223f1 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1995-2003, Index Data
  * See the file LICENSE for details.
  *
- * $Id: seshigh.c,v 1.161 2003-09-09 16:03:46 mike Exp $
+ * $Id: seshigh.c,v 1.164 2003-10-21 09:48:23 adam Exp $
  */
 
 /*
@@ -169,6 +169,7 @@ association *create_association(IOCHAN channel, COMSTACK link)
 void destroy_association(association *h)
 {
     statserv_options_block *cb = statserv_getcontrol();
+    request *req;
 
     xfree(h->init);
     odr_destroy(h->decode);
@@ -179,8 +180,10 @@ void destroy_association(association *h)
     xfree(h->input_buffer);
     if (h->backend)
        (*cb->bend_close)(h->backend);
-    while (request_deq(&h->incoming));
-    while (request_deq(&h->outgoing));
+    while ((req = request_deq(&h->incoming)))
+       request_release(req);
+    while ((req = request_deq(&h->outgoing)))
+       request_release(req);
     request_delq(&h->incoming);
     request_delq(&h->outgoing);
     xfree(h);
@@ -213,6 +216,7 @@ static void do_close_req(association *a, int reason, char *message,
     }
     else
     {
+       request_release(req);
        yaz_log(LOG_DEBUG, "v2 client. No Close PDU");
        iochan_setevent(a->client_chan, EVENT_TIMEOUT); /* force imm close */
     }
@@ -221,7 +225,8 @@ static void do_close_req(association *a, int reason, char *message,
 
 static void do_close(association *a, int reason, char *message)
 {
-    do_close_req (a, reason, message, request_get(&a->outgoing));
+    request *req = request_get(&a->outgoing);
+    do_close_req (a, reason, message, req);
 }
 
 /*
@@ -336,7 +341,8 @@ void ir_session(IOCHAN h, int event)
                 {
                     yaz_log(LOG_LOG, "PDU dump:");
                     odr_dumpBER(yaz_log_file(), assoc->input_buffer, res);
-                    do_close(assoc, Z_Close_protocolError, "Malformed package");
+                   request_release(req);
+                    do_close(assoc, Z_Close_protocolError,"Malformed package");
                 }
                 else
                 {
@@ -1384,9 +1390,10 @@ static int process_gdu_response(association *assoc, request *req, Z_GDU *res)
     }
     if (!z_GDU(assoc->encode, &res, 0, 0))
     {
-       yaz_log(LOG_WARN, "ODR error when decoding PDU: %s [element %s]",
+       yaz_log(LOG_WARN, "ODR error when encoding PDU: %s [element %s]",
                 odr_errmsg(odr_geterror(assoc->decode)),
                 odr_getelement(assoc->decode));
+       request_release(req);
        return -1;
     }
     req->response = odr_getbuf(assoc->encode, &req->len_response,