Fixed bug in Generic Frontend Server that could cause a server to stop
[yaz-moved-to-github.git] / src / seshigh.c
index 2a3fc2f..5132309 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: seshigh.c,v 1.96 2006-08-24 13:25:45 adam Exp $
+ * $Id: seshigh.c,v 1.98 2006-09-06 09:35:41 adam Exp $
  */
 /**
  * \file seshigh.c
@@ -339,8 +339,18 @@ void ir_session(IOCHAN h, int event)
                 return;
             }
             assoc->cs_get_mask = EVENT_INPUT;
-            if ((res = cs_get(conn, &assoc->input_buffer,
-                &assoc->input_buffer_len)) == 0)
+            res = cs_get(conn, &assoc->input_buffer,
+                &assoc->input_buffer_len);
+            if (res < 0 && cs_errno(conn) == CSBUFSIZE)
+            {
+                yaz_log(log_session, "Connection error: %s res=%d",
+                        cs_errmsg(cs_errno(conn)), res);
+                req = request_get(&assoc->incoming); /* get a new request */
+                do_close_req(assoc, Z_Close_protocolError, 
+                             "Incoming package too large", req);
+                return;
+            }
+            else if (res <= 0)
             {
                 yaz_log(log_sessiondetail, "Connection closed by client");
                 cs_close(conn);
@@ -348,15 +358,6 @@ void ir_session(IOCHAN h, int event)
                 iochan_destroy(h);
                 return;
             }
-            else if (res < 0)
-            {
-                yaz_log(log_session, "Connection error: %s",
-                        cs_errmsg(cs_errno(conn)));
-                req = request_get(&assoc->incoming); /* get a new request */
-                do_close_req(assoc, Z_Close_protocolError, 
-                             "Incoming package too large", req);
-                return;
-            }
             else if (res == 1) /* incomplete read - wait for more  */
             {
                 if (conn->io_pending & CS_WANT_WRITE)
@@ -518,9 +519,6 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num, Z_S
         yaz_log(log_requestdetail, "srw_bend_init config=%s", cb->configname);
         assoc_init_reset(assoc);
         
-        assoc->maximumRecordSize = 3000000;
-        assoc->preferredMessageSize = 3000000;
-
         if (sr->username)
         {
             Z_IdAuthentication *auth = odr_malloc(assoc->decode, sizeof(*auth));
@@ -2307,13 +2305,12 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
     }
 
     yaz_log(log_requestdetail, "Negotiated to v%d: %s", assoc->version, options);
-    assoc->maximumRecordSize = *req->maximumRecordSize;
 
-    if (cb && assoc->maximumRecordSize > cb->maxrecordsize)
-        assoc->maximumRecordSize = cb->maxrecordsize;
-    assoc->preferredMessageSize = *req->preferredMessageSize;
-    if (assoc->preferredMessageSize > assoc->maximumRecordSize)
-        assoc->preferredMessageSize = assoc->maximumRecordSize;
+    if (*req->maximumRecordSize < assoc->maximumRecordSize)
+        assoc->maximumRecordSize = *req->maximumRecordSize;
+
+    if (*req->preferredMessageSize < assoc->preferredMessageSize)
+        assoc->preferredMessageSize = *req->preferredMessageSize;
 
     resp->preferredMessageSize = &assoc->preferredMessageSize;
     resp->maximumRecordSize = &assoc->maximumRecordSize;
@@ -2326,7 +2323,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
                 assoc->init->implementation_name,
                 odr_prepend(assoc->encode, "GFS", resp->implementationName));
 
-    version = odr_strdup(assoc->encode, "$Revision: 1.96 $");
+    version = odr_strdup(assoc->encode, "$Revision: 1.98 $");
     if (strlen(version) > 10)   /* check for unexpanded CVS strings */
         version[strlen(version)-2] = '\0';
     resp->implementationVersion = odr_prepend(assoc->encode,