summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorRich Salz <rsalz@openssl.org>2016-06-10 11:40:32 -0400
committerRich Salz <rsalz@openssl.org>2016-06-12 08:02:46 -0400
commit7315ce80de2f48503dfc5d160299baef123b71d7 (patch)
tree043fb04ef1cb8db3bc112929cb273fe899f48cf2 /apps
parent6b3602882e089aaca18828a72d9f4072e6a20252 (diff)
Avoid memory leaks if options repeated.
Reviewed-by: Andy Polyakov <appro@openssl.org>
Diffstat (limited to 'apps')
-rw-r--r--apps/s_client.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/apps/s_client.c b/apps/s_client.c
index d990f46bed..b0b66b3fec 100644
--- a/apps/s_client.c
+++ b/apps/s_client.c
@@ -770,6 +770,15 @@ static const OPT_PAIR services[] = {
(o == OPT_4 || o == OPT_6 || o == OPT_HOST || o == OPT_PORT || o == OPT_CONNECT)
#define IS_UNIX_FLAG(o) (o == OPT_UNIX)
+/* Free |*dest| and optionally set it to a copy of |source|. */
+static void freeandcopy(char **dest, const char *source)
+{
+ OPENSSL_free(*dest);
+ *dest = NULL;
+ if (source != NULL)
+ *dest = OPENSSL_strdup(source);
+}
+
int s_client_main(int argc, char **argv)
{
BIO *sbio;
@@ -790,7 +799,7 @@ int s_client_main(int argc, char **argv)
char *mbuf = NULL, *proxystr = NULL, *connectstr = NULL;
char *cert_file = NULL, *key_file = NULL, *chain_file = NULL;
char *chCApath = NULL, *chCAfile = NULL, *host = NULL;
- char *port = BUF_strdup(PORT);
+ char *port = OPENSSL_strdup(PORT);
char *inrand = NULL;
char *passarg = NULL, *pass = NULL, *vfyCApath = NULL, *vfyCAfile = NULL;
char *sess_in = NULL, *sess_out = NULL, *crl_file = NULL, *p;
@@ -921,15 +930,15 @@ int s_client_main(int argc, char **argv)
#endif
case OPT_HOST:
connect_type = use_inet;
- host = OPENSSL_strdup(opt_arg());
+ freeandcopy(&host, opt_arg());
break;
case OPT_PORT:
connect_type = use_inet;
- port = OPENSSL_strdup(opt_arg());
+ freeandcopy(&port, opt_arg());
break;
case OPT_CONNECT:
connect_type = use_inet;
- connectstr = opt_arg();
+ freeandcopy(&connectstr, opt_arg());
break;
case OPT_PROXY:
proxystr = opt_arg();
@@ -939,7 +948,7 @@ int s_client_main(int argc, char **argv)
case OPT_UNIX:
connect_type = use_unix;
socket_family = AF_UNIX;
- host = OPENSSL_strdup(opt_arg());
+ freeandcopy(&host, opt_arg());
break;
#endif
case OPT_XMPPHOST: