fix for sslecho in demos echoing garbage #18165
authorphilippe lhardy <pl@artisanlogiciel.net>
Mon, 25 Apr 2022 17:42:16 +0000 (19:42 +0200)
committerTomas Mraz <tomas@openssl.org>
Mon, 21 Nov 2022 09:49:51 +0000 (10:49 +0100)
- getline does set &txbufp content at return, make sure it can be done.
  - fixes warning 'passing argument 1 of ‘getline’ from incompatible pointer type'
- remove OPENSSL_free on non allocated fixed size array
  - fixes 'free(): invalid pointer'

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/18177)

(cherry picked from commit 3c0e8bc4a797d29b2152aebc6e687ddfa941160b)

demos/sslecho/main.c

index c6f087c56fab6d3f4b8fde73e5d2315fbd62b7f0..588158e749e4771251c2b224d44e2366e9610631 100644 (file)
@@ -137,8 +137,9 @@ int main(int argc, char **argv)
     int server_skt = -1;
     int client_skt = -1;
 
-    char txbuf[128];
-    size_t txcap = sizeof(txbuf);
+    /* used by getline relying on realloc, can't be statically allocated */
+    char *txbuf = NULL;
+    size_t txcap = 0;
     int txlen;
 
     char rxbuf[128];
@@ -286,11 +287,14 @@ int main(int argc, char **argv)
             while (true) {
                 /* Get a line of input */
                 txlen = getline(&txbuf, &txcap, stdin);
+                /* Exit loop on error */
+                if (txlen < 0 || txbuf == NULL) {
+                    break;
+                }
                 /* Exit loop if just a carriage return */
                 if (txbuf[0] == '\n') {
                     break;
                 }
-
                 /* Send it to the server */
                 if ((result = SSL_write(ssl, txbuf, txlen)) <= 0) {
                     printf("Server closed connection\n");
@@ -331,8 +335,8 @@ int main(int argc, char **argv)
     if (server_skt != -1)
         close(server_skt);
 
-    OPENSSL_free(txbuf);
-    OPENSSL_free(rxbuf);
+    if (txbuf != NULL && txcap > 0)
+        free(txbuf);
 
     printf("sslecho exiting\n");