rtp_engine: Prevent possible double free with DTLS config
authorSean Bright <sean.bright@gmail.com>
Fri, 1 Sep 2017 21:17:38 +0000 (17:17 -0400)
committerSean Bright <sean.bright@gmail.com>
Fri, 1 Sep 2017 23:00:03 +0000 (18:00 -0500)
ASTERISK-27225 #close
Reported by: Richard Kenner

Change-Id: I097b81734ef730f8603c0b972909d212a3a5cf89

main/rtp_engine.c

index e078b24..226b229 100644 (file)
@@ -2718,35 +2718,35 @@ int ast_rtp_dtls_cfg_parse(struct ast_rtp_dtls_cfg *dtls_cfg, const char *name,
                        return -1;
                }
        } else if (!strcasecmp(name, "dtlscertfile")) {
-               ast_free(dtls_cfg->certfile);
                if (!ast_strlen_zero(value) && !ast_file_is_readable(value)) {
                        ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
                        return -1;
                }
+               ast_free(dtls_cfg->certfile);
                dtls_cfg->certfile = ast_strdup(value);
        } else if (!strcasecmp(name, "dtlsprivatekey")) {
-               ast_free(dtls_cfg->pvtfile);
                if (!ast_strlen_zero(value) && !ast_file_is_readable(value)) {
                        ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
                        return -1;
                }
+               ast_free(dtls_cfg->pvtfile);
                dtls_cfg->pvtfile = ast_strdup(value);
        } else if (!strcasecmp(name, "dtlscipher")) {
                ast_free(dtls_cfg->cipher);
                dtls_cfg->cipher = ast_strdup(value);
        } else if (!strcasecmp(name, "dtlscafile")) {
-               ast_free(dtls_cfg->cafile);
                if (!ast_strlen_zero(value) && !ast_file_is_readable(value)) {
                        ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
                        return -1;
                }
+               ast_free(dtls_cfg->cafile);
                dtls_cfg->cafile = ast_strdup(value);
        } else if (!strcasecmp(name, "dtlscapath") || !strcasecmp(name, "dtlscadir")) {
-               ast_free(dtls_cfg->capath);
                if (!ast_strlen_zero(value) && !ast_file_is_readable(value)) {
                        ast_log(LOG_ERROR, "%s file %s does not exist or is not readable\n", name, value);
                        return -1;
                }
+               ast_free(dtls_cfg->capath);
                dtls_cfg->capath = ast_strdup(value);
        } else if (!strcasecmp(name, "dtlssetup")) {
                if (!strcasecmp(value, "active")) {