From 10cd4d8a93905f6fa1c3a20e2610c1438dca1571 Mon Sep 17 00:00:00 2001 From: russell Date: Sat, 23 Dec 2006 20:22:52 +0000 Subject: Implement locking for the list of URI handlers to make it thread-safe. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@48931 f38db490-d61c-443f-a65b-d21fe96a405b --- main/http.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'main/http.c') diff --git a/main/http.c b/main/http.c index b778017ec..78b1a960b 100644 --- a/main/http.c +++ b/main/http.c @@ -64,7 +64,8 @@ struct ast_http_server_instance { ast_http_callback callback; }; -static struct ast_http_uri *uris; +AST_MUTEX_DEFINE_STATIC(uris_lock); +static struct ast_http_uri *uris = NULL; static int httpfd = -1; static pthread_t master = AST_PTHREADT_NULL; @@ -241,7 +242,10 @@ char *ast_http_error(int status, const char *title, const char *extra_header, co int ast_http_uri_link(struct ast_http_uri *urih) { - struct ast_http_uri *prev=uris; + struct ast_http_uri *prev; + + ast_mutex_lock(&uris_lock); + prev = uris; if (!uris || strlen(uris->uri) <= strlen(urih->uri)) { urih->next = uris; uris = urih; @@ -252,14 +256,21 @@ int ast_http_uri_link(struct ast_http_uri *urih) urih->next = prev->next; prev->next = urih; } + ast_mutex_unlock(&uris_lock); + return 0; } void ast_http_uri_unlink(struct ast_http_uri *urih) { - struct ast_http_uri *prev = uris; - if (!uris) + struct ast_http_uri *prev; + + ast_mutex_lock(&uris_lock); + if (!uris) { + ast_mutex_unlock(&uris_lock); return; + } + prev = uris; if (uris == urih) { uris = uris->next; } @@ -270,6 +281,7 @@ void ast_http_uri_unlink(struct ast_http_uri *urih) } prev = prev->next; } + ast_mutex_unlock(&uris_lock); } static char *handle_uri(struct sockaddr_in *sin, char *uri, int *status, char **title, int *contentlength, struct ast_variable **cookies) @@ -317,6 +329,7 @@ static char *handle_uri(struct sockaddr_in *sin, char *uri, int *status, char ** if (!*uri || (*uri == '/')) { if (*uri == '/') uri++; + ast_mutex_lock(&uris_lock); urih = uris; while(urih) { len = strlen(urih->uri); @@ -333,10 +346,13 @@ static char *handle_uri(struct sockaddr_in *sin, char *uri, int *status, char ** } urih = urih->next; } + if (!urih) + ast_mutex_unlock(&uris_lock); } } if (urih) { c = urih->callback(sin, uri, vars, status, title, contentlength); + ast_mutex_unlock(&uris_lock); } else if (ast_strlen_zero(uri) && ast_strlen_zero(prefix)) { /* Special case: If no prefix, and no URI, send to /static/index.html */ c = ast_http_error(302, "Moved Temporarily", "Location: /static/index.html\r\n", "This is not the page you are looking for..."); @@ -672,6 +688,7 @@ static int handle_show_http(int fd, int argc, char *argv[]) else ast_cli(fd, "Server Disabled\n\n"); ast_cli(fd, "Enabled URI's:\n"); + ast_mutex_lock(&uris_lock); urih = uris; while(urih){ ast_cli(fd, "%s/%s%s => %s\n", prefix, urih->uri, (urih->has_subtree ? "/..." : "" ), urih->description); @@ -679,6 +696,7 @@ static int handle_show_http(int fd, int argc, char *argv[]) } if (!uris) ast_cli(fd, "None.\n"); + ast_mutex_unlock(&uris_lock); return RESULT_SUCCESS; } -- cgit v1.2.3