[freetds] ct_param memory leak patch

Iain Calder iain.calder at blueyonder.co.uk
Thu Jan 15 18:44:47 EST 2004


First I would like to thank everyone who contributed to the 0.62 
release.  I
am using FreeTDS-ctlib to call stored procedures on SQL Server 2000 from
Linux with great success.

I have noticed a couple of memory leaks when using ct_param to add 
stored procedure parameters.  ct_param() seems to create temporary param 
structures which are not freed, and ct_cmd_drop() does not free cmd->rpc 
structures.

The following patch to ct.c appears to correct the leaks:

--- freetds-0.62/src/ctlib/ct.c    2003-12-26 18:11:08.000000000 +0000
+++ freetds-0.62.new/src/ctlib/ct.c    2004-01-15 14:05:30.000000000 +0000
@@ -1446,6 +1446,13 @@
            free(cmd->query);
        if (cmd->input_params)
            param_clear(cmd->input_params);
+        if (cmd->rpc)
+        {
+            if (cmd->rpc->param_list)
+                param_clear(cmd->rpc->param_list);
+            free(cmd->rpc->name);
+            free(cmd->rpc);
+        }
        free(cmd);
    }
    return CS_SUCCEED;
@@ -2657,16 +2664,14 @@
        rpc = cmd->rpc;
        pparam = &rpc->param_list;
        if (*pparam == NULL) {
-            *pparam = (CSREMOTE_PROC_PARAM *)
malloc(sizeof(CSREMOTE_PROC_PARAM));
+            *pparam = param;
        } else {
            while ((*pparam)->next != NULL) {
                pparam = &(*pparam)->next;
            }
-
-            (*pparam)->next = (CSREMOTE_PROC_PARAM *)
malloc(sizeof(CSREMOTE_PROC_PARAM));
-            pparam = &(*pparam)->next;
        }
-        *pparam = param;
+        (*pparam)->next = param;
+        pparam = &(*pparam)->next;
        (*pparam)->next = NULL;
        tdsdump_log(TDS_DBG_INFO1, " ct_param() added rpc parameter %s
\n", (*param).name);
        return CS_SUCCEED;





More information about the FreeTDS mailing list