From: Matthew Jordan Date: Wed, 27 Mar 2013 18:51:11 +0000 (+0000) Subject: Fix a file descriptor leak in off nominal path X-Git-Tag: 11.4.0-rc1~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=66024dbae029e597f7fee7153ea8bd7420d5ffa1;p=thirdparty%2Fasterisk.git Fix a file descriptor leak in off nominal path While looking at the security vulnerability in ASTERISK-20967, Walter noticed a file descriptor leak and some other issues in off nominal code paths. This patch corrects them. Note that this patch is not related to the vulnerability in ASTERISK-20967, but the patch was placed on that issue. (closes issue ASTERISK-20967) Reported by: wdoekes patches: issueA20967_file_leak_and_unused_wkspace.patch uploaded by wdoekes (License 5674) ........ Merged revisions 384118 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@384119 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/http.c b/main/http.c index 52812a4f27..a41e1b4a49 100644 --- a/main/http.c +++ b/main/http.c @@ -229,7 +229,7 @@ static int static_callback(struct ast_tcptls_session_instance *ser, goto out403; } - /* Disallow any funny filenames at all */ + /* Disallow any funny filenames at all (checking first character only??) */ if ((uri[0] < 33) || strchr("./|~@#$%^&*() \t", uri[0])) { goto out403; } @@ -244,6 +244,7 @@ static int static_callback(struct ast_tcptls_session_instance *ser, if (!(mtype = ast_http_ftype2mtype(ftype))) { snprintf(wkspace, sizeof(wkspace), "text/%s", S_OR(ftype, "plain")); + mtype = wkspace; } /* Cap maximum length */ @@ -261,12 +262,12 @@ static int static_callback(struct ast_tcptls_session_instance *ser, goto out404; } - fd = open(path, O_RDONLY); - if (fd < 0) { + if (strstr(path, "/private/") && !astman_is_authed(ast_http_manid_from_vars(headers))) { goto out403; } - if (strstr(path, "/private/") && !astman_is_authed(ast_http_manid_from_vars(headers))) { + fd = open(path, O_RDONLY); + if (fd < 0) { goto out403; } @@ -289,6 +290,7 @@ static int static_callback(struct ast_tcptls_session_instance *ser, } if ( (http_header = ast_str_create(255)) == NULL) { + close(fd); return -1; }