--- libaitrpc/src/srv.c 2013/08/21 09:42:12 1.17.4.3 +++ libaitrpc/src/srv.c 2013/08/21 11:41:15 1.17.4.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.17.4.3 2013/08/21 09:42:12 misho Exp $ +* $Id: srv.c,v 1.17.4.4 2013/08/21 11:41:15 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -191,28 +191,38 @@ txPacket(sched_task_t *task) rpc_cli_t *c = TASK_ARG(task); rpc_srv_t *s = c->cli_parent; rpc_func_t *f = NULL; - u_char buf[USHRT_MAX] = { 0 }; - struct tagRPCCall *rpc = (struct tagRPCCall*) buf; + u_char *buf; + struct tagRPCCall *rpc; int ret, wlen = sizeof(struct tagRPCCall); + int len = sizeof(struct tagRPCCall) + ntohl(rpc->call_len); - /* copy RPC header */ - memcpy(buf, TASK_DATA(task), wlen); + buf = e_malloc(len); + if (!buf) { + rpc_SetErr(elwix_GetErrno(), "%s", elwix_GetError()); + return NULL; + } else { + /* copy RPC header */ + memcpy(buf, TASK_DATA(task), wlen); + rpc = (struct tagRPCCall*) buf; + } if (rpc->call_argc) { f = rpc_srv_getCall(s, ntohs(rpc->call_tag)); if (!f) { rpc_SetErr(EPROGUNAVAIL, "Function not found at RPC server"); + rpc->call_argc ^= rpc->call_argc; rpc->call_rep.ret = RPC_ERROR(-1); rpc->call_rep.eno = RPC_ERROR(rpc_Errno); } else { rpc->call_argc = htons(array_Size(RPC_RETVARS(c))); /* Go Encapsulate variables */ - ret = ait_vars2buffer(buf + wlen, sizeof buf - wlen, RPC_RETVARS(c)); + ret = ait_vars2buffer(buf + wlen, len - wlen, RPC_RETVARS(c)); /* Free return values */ ait_freeVars(&c->cli_vars); if (ret == -1) { rpc_SetErr(EBADRPC, "Prepare RPC packet failed"); + rpc->call_argc ^= rpc->call_argc; rpc->call_rep.ret = RPC_ERROR(-1); rpc->call_rep.eno = RPC_ERROR(rpc_Errno); @@ -221,13 +231,7 @@ txPacket(sched_task_t *task) } } - rpc->call_len = htons(wlen); - -#if 0 - /* calculate CRC */ - rpc->call_crc ^= rpc->call_crc; - rpc->call_crc = htons(crcFletcher16((u_short*) buf, wlen / 2)); -#endif + rpc->call_len = htonl(wlen); /* send reply */ ret = send(TASK_FD(task), buf, wlen, MSG_NOSIGNAL);