From: Andre Date: Mon, 3 Apr 2006 19:50:06 +0000 (+0200) Subject: fix potential segfault in para_client X-Git-Tag: v0.2.12~114 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=e2213f2468eb1c6f8ca033c6529ee1b5ceadab7f;hp=9ebd69fa0ad93040ca37190e1b71683d027095e9;ds=sidebyside 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. --- 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; }