From e2213f2468eb1c6f8ca033c6529ee1b5ceadab7f Mon Sep 17 00:00:00 2001 From: Andre Date: Mon, 3 Apr 2006 21:50:06 +0200 Subject: [PATCH] fix potential segfault in para_client The first data buffer which is sent by the server is checked for the AWAITING_DATA_MSG, but that buffer might not be 0-terminated.. Some other minor cleanups also. --- client.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/client.c b/client.c index ce66ea7b..663f2206 100644 --- a/client.c +++ b/client.c @@ -240,7 +240,7 @@ interactive_loop: numbytes); buf[numbytes] = '\0'; PARA_ERROR_LOG("received the following instead: %s\n", buf); - goto write_out; + exit(EXIT_FAILURE); } PARA_INFO_LOG("<-- [challenge (%i bytes)]\n", numbytes); /* decrypt challenge number */ @@ -289,18 +289,16 @@ interactive_loop: if (send_buffer(sockfd, EOC_MSG "\n") < 0) exit(EXIT_FAILURE); PARA_NOTICE_LOG("%s", "command sent.\n"); -write_out: received = 0; - /* write server output to stdout */ - while ((numbytes = recv_bin_buffer(sockfd, buf, sizeof(buf))) > 0) { - int ret; - + while ((numbytes = recv_bin_buffer(sockfd, buf, sizeof(buf) - 1)) > 0) { + buf[numbytes] = '\0'; if (!received && strstr(buf, AWAITING_DATA_MSG)) { - PARA_NOTICE_LOG("%s", "<-- awaiting data\n"); - PARA_NOTICE_LOG("%s", "--> sending stdin\n"); + PARA_NOTICE_LOG("%s", "sending stdin\n"); while ((ret = read(STDIN_FILENO, buf, - sizeof(buf))) > 0) - send_bin_buffer(sockfd, buf, ret); + sizeof(buf))) > 0) { + if (send_bin_buffer(sockfd, buf, ret) < 0) + break; + } PARA_NOTICE_LOG("%s", "closing connection\n"); numbytes = 1; break; @@ -314,5 +312,5 @@ write_out: close(sockfd); if (interactive) goto interactive_loop; - return 0; + return ret >= 0? 0: 1; } -- 2.39.5