src/server/daemon/resourcepool.c

changeset 460
b9a447b02046
parent 415
d938228c382e
child 463
4fd523fff13b
--- a/src/server/daemon/resourcepool.c	Fri Mar 10 22:45:58 2023 +0100
+++ b/src/server/daemon/resourcepool.c	Fri Mar 10 23:00:02 2023 +0100
@@ -60,6 +60,12 @@
         return 1;
     }
     
+    char *respool_name = cx_strdup_a(cfg->a, name).ptr;
+    if(!respool_name) {
+        log_ereport(LOG_FAILURE, "resourcepool_new: OOM");
+        return 1;
+    }
+    
     // convert ConfigNode to pblock
     // no sub-objects allowed for this specific ConfigNode, therefore
     // it can be represented as key-value-pairs
@@ -82,6 +88,7 @@
         return 1;
     }
     
+    respool->name = respool_name;
     respool->type = restype;
     respool->data = respool_data;
     respool->min = 4; // TODO: get from node
@@ -211,9 +218,18 @@
 }
 
 void resourcepool_free(Session *sn, Request *rq, ResourceData *resource) {
+    NSAPIRequest *nsapi_rq = (NSAPIRequest *)rq;
     ResourceDataPrivate *res = (ResourceDataPrivate*)resource;
     ResourcePool *respool = resource->resourcepool;
     
+    if(nsapi_rq && !nsapi_rq->finished) {
+        // request processing still ongoing and SAFs will be executed
+        if(!cxMapRemove(nsapi_rq->resources, cx_hash_key_str(respool->name))) {
+            log_ereport(LOG_FAILURE, "resourcepool_free: cannot remove resource from request: potential double free");
+        }
+    }
+    // else: safe to ignore nsapi_rq->resources
+    
     if(respool->type->finish(respool->data, res->resdata)) {
         log_ereport(LOG_FAILURE, "resourcepool_free: finish failed");
     }

mercurial