|
|
| version 1.1.1.1.2.18, 2010/07/08 07:32:53 | version 1.1.1.1.2.22, 2010/07/12 08:46:41 |
|---|---|
| Line 58 rpc_srv_dispatchCall(void *arg) | Line 58 rpc_srv_dispatchCall(void *arg) |
| rpc_SetErr(EINVAL, "Error:: get invalid RPC session ...\n"); | rpc_SetErr(EINVAL, "Error:: get invalid RPC session ...\n"); |
| ret = -5; | ret = -5; |
| goto makeReply; | goto makeReply; |
| } | } else |
| Limit = sizeof(struct tagRPCCall); | |
| // RPC is OK! Go decapsulate variables ... | // RPC is OK! Go decapsulate variables ... |
| if (rpc->call_argc) { | if (rpc->call_argc) { |
| v = (rpc_val_t*) (buf + sizeof(struct tagRPCCall)); | v = (rpc_val_t*) (buf + Limit); |
| // check RPC packet length | |
| if (rpc->call_argc * sizeof(rpc_val_t) > BUFSIZ - Limit) { | |
| rpc_SetErr(EMSGSIZE, "Error:: Too big RPC packet ...\n"); | |
| ret = -5; | |
| goto makeReply; | |
| } else | |
| Limit += rpc->call_argc * sizeof(rpc_val_t); | |
| // RPC received variables types OK! | // RPC received variables types OK! |
| data = (u_char*) v + rpc->call_argc * sizeof(rpc_val_t); | data = (u_char*) v + rpc->call_argc * sizeof(rpc_val_t); |
| for (i = 0; i < rpc->call_argc; i++) { | for (i = 0; i < rpc->call_argc; i++) { |
| switch (v[i].val_type) { | switch (v[i].val_type) { |
| case buffer: | case buffer: |
| if (v[i].val_len > BUFSIZ - Limit) { | |
| rpc_SetErr(EMSGSIZE, "Error:: Too big RPC packet ...\n"); | |
| ret = -5; | |
| goto makeReply; | |
| } else | |
| Limit += v[i].val_len; | |
| v[i].val.buffer = data; | v[i].val.buffer = data; |
| data += v[i].val_len; | data += v[i].val_len; |
| break; | break; |
| case string: | case string: |
| if (v[i].val_len + 1 > BUFSIZ - Limit) { | |
| rpc_SetErr(EMSGSIZE, "Error:: Too big RPC packet ...\n"); | |
| ret = -5; | |
| goto makeReply; | |
| } else | |
| Limit += v[i].val_len; | |
| v[i].val.string = (int8_t*) data; | v[i].val.string = (int8_t*) data; |
| data += v[i].val_len + 1; | data += v[i].val_len + 1; |
| break; | break; |
| Line 234 rpc_srv_dispatchVars(void *arg) | Line 256 rpc_srv_dispatchVars(void *arg) |
| blob->hdr_var); | blob->hdr_var); |
| ret = -6; | ret = -6; |
| break; | break; |
| } | } else |
| blob->hdr_len = b->blob_len; | |
| if (rpc_srv_blobMap(s, b) != -1) { | if (rpc_srv_blobMap(s, b) != -1) { |
| ret = rpc_srv_sendBLOB(c, b); | ret = rpc_srv_sendBLOB(c, b); |
| Line 410 rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) | Line 433 rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) |
| } | } |
| pthread_mutex_unlock(&srv->srv_blob.mtx); | pthread_mutex_unlock(&srv->srv_blob.mtx); |
| while (pthread_mutex_trylock(&srv->srv_blob.mtx) == EBUSY); | |
| pthread_mutex_destroy(&srv->srv_blob.mtx); | pthread_mutex_destroy(&srv->srv_blob.mtx); |
| } | } |
| Line 578 rpc_srv_initServer(u_int regProgID, u_int regProcID, i | Line 602 rpc_srv_initServer(u_int regProgID, u_int regProcID, i |
| } else | } else |
| memset(srv->srv_clients, 0, srv->srv_numcli * sizeof(rpc_cli_t)); | memset(srv->srv_clients, 0, srv->srv_numcli * sizeof(rpc_cli_t)); |
| pthread_mutex_init(&srv->srv_mtx, NULL); | |
| rpc_srv_registerCall(srv, NULL, CALL_SRVSHUTDOWN, 0); | rpc_srv_registerCall(srv, NULL, CALL_SRVSHUTDOWN, 0); |
| rpc_srv_registerCall(srv, NULL, CALL_SRVCLIENTS, 0); | rpc_srv_registerCall(srv, NULL, CALL_SRVCLIENTS, 0); |
| rpc_srv_registerCall(srv, NULL, CALL_SRVCALLS, 0); | rpc_srv_registerCall(srv, NULL, CALL_SRVCALLS, 0); |
| rpc_srv_registerCall(srv, NULL, CALL_SRVSESSIONS, 0); | rpc_srv_registerCall(srv, NULL, CALL_SRVSESSIONS, 0); |
| pthread_mutex_init(&srv->srv_mtx, NULL); | |
| return srv; | return srv; |
| } | } |
| Line 624 rpc_srv_endServer(rpc_srv_t * __restrict srv) | Line 648 rpc_srv_endServer(rpc_srv_t * __restrict srv) |
| } | } |
| pthread_mutex_unlock(&srv->srv_mtx); | pthread_mutex_unlock(&srv->srv_mtx); |
| while (pthread_mutex_trylock(&srv->srv_mtx) == EBUSY); | |
| pthread_mutex_destroy(&srv->srv_mtx); | pthread_mutex_destroy(&srv->srv_mtx); |
| free(srv); | free(srv); |