-/* $OpenBSD: kex.c,v 1.128 2017/02/03 23:01:19 djm Exp $ */
+/* $OpenBSD: kex.c,v 1.129 2017/03/10 03:45:40 dtucker Exp $ */
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
  *
 char *
 kex_names_cat(const char *a, const char *b)
 {
-       char *ret = NULL, *tmp = NULL, *cp, *p;
+       char *ret = NULL, *tmp = NULL, *cp, *p, *m;
        size_t len;
 
        if (a == NULL || *a == '\0')
        }
        strlcpy(ret, a, len);
        for ((p = strsep(&cp, ",")); p && *p != '\0'; (p = strsep(&cp, ","))) {
-               if (match_list(ret, p, NULL) != NULL)
+               if ((m = match_list(ret, p, NULL)) != NULL) {
+                       free(m);
                        continue; /* Algorithm already present */
+               }
                if (strlcat(ret, ",", len) >= len ||
                    strlcat(ret, p, len) >= len) {
                        free(tmp);
 
        if (name == NULL)
                return SSH_ERR_NO_CIPHER_ALG_MATCH;
-       if ((enc->cipher = cipher_by_name(name)) == NULL)
+       if ((enc->cipher = cipher_by_name(name)) == NULL) {
+               free(name);
                return SSH_ERR_INTERNAL_ERROR;
+       }
        enc->name = name;
        enc->enabled = 0;
        enc->iv = NULL;
 
        if (name == NULL)
                return SSH_ERR_NO_MAC_ALG_MATCH;
-       if (mac_setup(mac, name) < 0)
+       if (mac_setup(mac, name) < 0) {
+               free(name);
                return SSH_ERR_INTERNAL_ERROR;
+       }
        /* truncate the key */
        if (ssh->compat & SSH_BUG_HMAC)
                mac->key_len = 16;
        } else if (strcmp(name, "none") == 0) {
                comp->type = COMP_NONE;
        } else {
+               free(name);
                return SSH_ERR_INTERNAL_ERROR;
        }
        comp->name = name;