There are some bugs in the testcase: 1.return_buffer be defined as a struct data * and is uninitialized,it is a random value,maybe NULL,in function do_compare(rc, "callrpc", &buffer, return_buffer->data) will cause a NULL pointer reference and "Segmentation fault". 2.in callrpc() the sixth and the eighth parameter is error,it should be buffer.data and a valid char *,and the clnt_call() has the same error. 3.the malloc for buffer.data is not freed.
I change the definition of return_buffer to char *,malloc memory for it,and free when test exit. Please review it,thanks. Signed-off-by: Liao Qingwei <liaoqing...@huawei.com> --- testcases/network/rpc/basic_tests/rpc01/rpc1.c | 41 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/testcases/network/rpc/basic_tests/rpc01/rpc1.c b/testcases/network/rpc/basic_tests/rpc01/rpc1.c index bc9f35b..19835d5 100644 --- a/testcases/network/rpc/basic_tests/rpc01/rpc1.c +++ b/testcases/network/rpc/basic_tests/rpc01/rpc1.c @@ -24,7 +24,8 @@ void usage_error(char *program_name); int main(int argc, char *argv[]) { struct hostent *hp; - struct data buffer, *return_buffer; + struct data buffer; + char *return_buffer; int i, n, rc; FILE *fp; struct stat stat_buffer; @@ -121,14 +122,26 @@ int main(int argc, char *argv[]) } buffer.data = malloc(buffer.data_length); + if (!buffer.data) { + fprintf(stderr, "malloc failed for buffer.data\n"); + exit(1); + } + for (i = 0, p = buffer.data; i < buffer.data_length; i++, p++) *p = getc(fp); fclose(fp); + return_buffer = malloc(buffer.data_length); + if (!return_buffer) { + fprintf(stderr, "malloc failed for return_buffer\n"); + free(buffer.data); + exit(1); + } + rc = callrpc(server, program, version, 1, (xdrproc_t)xdr_send_data, - (char *)&buffer, (xdrproc_t)xdr_receive_data, - (char *)&return_buffer); - do_compare(rc, "callrpc", &buffer, return_buffer->data); + buffer.data, (xdrproc_t)xdr_receive_data, + return_buffer); + do_compare(rc, "callrpc", &buffer, return_buffer); server_sin.sin_port = 0; sock = RPC_ANYSOCK; @@ -137,30 +150,34 @@ int main(int argc, char *argv[]) clnt = clntudp_create(&server_sin, program, version, timeout, &sock); if (clnt == NULL) { fprintf(stderr, "clntudp_create failed\n"); + free(buffer.data); + free(return_buffer); exit(1); } timeout.tv_usec = 0; timeout.tv_sec = 30; rc = (int)clnt_call(clnt, 1, (xdrproc_t)xdr_send_data, - (char *)&buffer, (xdrproc_t)xdr_receive_data, - (char *)&return_buffer, timeout); + buffer.data, (xdrproc_t)xdr_receive_data, + return_buffer, timeout); clnt_destroy(clnt); - do_compare(rc, "udp transport", &buffer, return_buffer->data); + do_compare(rc, "udp transport", &buffer, return_buffer); server_sin.sin_port = 0; sock = RPC_ANYSOCK; clnt = clnttcp_create(&server_sin, program, version, &sock, 0, 0); if (clnt == NULL) { fprintf(stderr, "clntudp_create failed\n"); + free(buffer.data); + free(return_buffer); exit(1); } timeout.tv_usec = 0; timeout.tv_sec = 30; rc = (int)clnt_call(clnt, 1, (xdrproc_t)xdr_send_data, - (char *)&buffer, (xdrproc_t)xdr_receive_data, - (char *)&return_buffer, timeout); + buffer.data, (xdrproc_t)xdr_receive_data, + return_buffer, timeout); clnt_destroy(clnt); - do_compare(rc, "tcp transport", &buffer, return_buffer->data); + do_compare(rc, "tcp transport", &buffer, return_buffer); exit(0); } @@ -173,11 +190,15 @@ void do_compare(int rpc_rc, char *msg, struct data *buffer, char *ret_data) printf("RPC call with %s returned %d: ", msg, rpc_rc); clnt_perrno(rpc_rc); printf("\n"); + free(buffer->data); + free(ret_data); exit(1); } rc = memcmp(buffer->data, ret_data, buffer->data_length); if (rc) { printf("Data compare for %s returned %d\n", msg, rc); + free(buffer->data); + free(ret_data); exit(1); } } -- 1.9.1 ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list