Fix leak for odr_print of ZOOM connection.
[yaz-moved-to-github.git] / src / zoom-c.c
index d02f63a..d0f5042 100644 (file)
@@ -406,6 +406,7 @@ ZOOM_API(ZOOM_connection)
 
     c->odr_in = odr_createmem(ODR_DECODE);
     c->odr_out = odr_createmem(ODR_ENCODE);
+    c->odr_print = 0;
 
     c->async = 0;
     c->support_named_resultsets = 0;
@@ -479,6 +480,11 @@ ZOOM_API(void)
     set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
     ZOOM_connection_remove_tasks(c);
 
+    if (c->odr_print)
+    {
+        odr_setprint(c->odr_print, 0); /* prevent destroy from fclose'ing */
+        odr_destroy(c->odr_print);
+    }
     if (ZOOM_options_get_bool(c->options, "apdulog", 0))
     {
         c->odr_print = odr_createmem(ODR_PRINT);
@@ -2144,14 +2150,15 @@ ZOOM_API(const char *)
     {
         return return_record(rec, len, npr, YAZ_MARC_ISO2709, charset);
     }
-    else if (!strcmp (type, "ext"))
+    else if (!strcmp(type, "ext"))
     {
         if (len) *len = -1;
         return (const char *) npr->u.databaseRecord;
     }
-    else if (!strcmp (type, "opac"))
+    else if (!strcmp(type, "opac"))
     {
-        return return_record(rec, len, npr, YAZ_MARC_MARCXML, charset);
+        if (npr->u.databaseRecord->which == Z_External_OPAC)
+            return return_record(rec, len, npr, YAZ_MARC_MARCXML, charset);
     }
     return 0;
 }
@@ -3136,7 +3143,7 @@ static Z_ItemOrder *encode_item_order(ZOOM_package p)
         req->u.esRequest->notToKeep->resultSetItem->resultSetId =
             odr_strdup(p->odr_out, str);
         req->u.esRequest->notToKeep->resultSetItem->item =
-            (int *) odr_malloc(p->odr_out, sizeof(int));
+            odr_intdup(p->odr_out, 0);
         
         str = ZOOM_options_get(p->options, "itemorder-item");
         *req->u.esRequest->notToKeep->resultSetItem->item =