]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
fix potential segfault in para_client
authorAndre <maan@p133.(none)>
Mon, 3 Apr 2006 19:50:06 +0000 (21:50 +0200)
committerAndre <maan@p133.(none)>
Mon, 3 Apr 2006 19:50:06 +0000 (21:50 +0200)
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

index ce66ea7b7159c101d77896b09c77f433d1f05c54..663f22060e1e1e3c6aad88761fa24a0872d848b6 100644 (file)
--- 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;
 }