[freetds] ctlib - Stored Proc Return Status

Iain Calder iain.calder at blueyonder.co.uk
Thu Jan 29 15:07:07 EST 2004


Thompson, Bill D (London) wrote:

>Iain,
>
>thanks for the bug report. Your findings look valid to me.
>
>I think we should save  tds->ret_status before calling tds_free_all_results
>etc, then use the saved value in the last statement of
>_ct_process_return_status instead of tds->ret_status.
>
>so....
>  
>
<snip code block>

>Can you do this fix locally and confirm the results ?
>
>thanks,
>
>Bill
>  
>
The suggested fix works fine for me and I am now getting integer return 
status from my MSSQL stored proc calls :-)

I would like to thank everyone who worked on the ct_param support for 
freetds.  It's great being able to call MSSQL stored procs properly from 
Linux code.

Bill - could you comment on the following patch too? - it fixes 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.

diff -uNr freetds-0.62/src/ctlib/ct.c freetds-0.62.new/src/ctlib/ct.c
--- 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-29 11:06:23.000000000 +0000
@@ -1446,6 +1446,12 @@
 			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 +2663,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