--- libaitrpc/src/srv.c 2011/07/14 01:37:02 1.2.2.3 +++ libaitrpc/src/srv.c 2011/07/14 02:36:57 1.2.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.2.2.3 2011/07/14 01:37:02 misho Exp $ +* $Id: srv.c,v 1.2.2.5 2011/07/14 02:36:57 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -52,9 +52,10 @@ rpc_srv_dispatchCall(void *arg) rpc_cli_t *c = arg; rpc_srv_t *s; rpc_val_t *vals = NULL, *v = NULL; - rpc_func_t *f; + rpc_func_t *f = NULL; struct tagRPCCall *rpc; struct tagRPCRet *rrpc; + rpc_sess_t ses = { 0 }; fd_set fds; u_char buf[BUFSIZ], *data; int ret, argc = 0, Limit = 0; @@ -147,6 +148,7 @@ rpc_srv_dispatchCall(void *arg) argc = 0; vals = NULL; + memcpy(&ses, &rpc->call_session, sizeof ses); if (!(f = rpc_srv_getCall(s, rpc->call_tag, rpc->call_hash))) { rpc_SetErr(EINVAL, "Error:: call not found into RPC server ...\n"); ret = -6; @@ -155,13 +157,12 @@ rpc_srv_dispatchCall(void *arg) ret = -9; else argc = rpc_srv_getValsCall(f, &vals); - makeReply: memset(buf, 0, BUFSIZ); rrpc = (struct tagRPCRet*) buf; Limit = sizeof(struct tagRPCRet); - memcpy(&rrpc->ret_session, &rpc->call_session, sizeof rrpc->ret_session); + memcpy(&rrpc->ret_session, &ses, sizeof(rpc_sess_t)); rrpc->ret_tag = rpc->call_tag; rrpc->ret_hash = rpc->call_hash; rrpc->ret_errno = rpc_Errno; @@ -173,7 +174,7 @@ makeReply: if (argc * sizeof(rpc_val_t) > BUFSIZ - Limit) { for (i = 0; i < argc; i++) RPC_FREE_VAL(&vals[i]); - free(vals); + rpc_srv_freeValsCall(f); vals = NULL; argc = 0; ret = -7; @@ -222,8 +223,9 @@ makeReply: RPC_FREE_VAL(&vals[i]); } - free(vals); + rpc_srv_freeValsCall(f); vals = NULL; + argc = 0; } if ((ret = send(c->cli_sock, buf, Limit, 0)) == -1) {