From ffce4c94aa9088e5e6b9325cc661807b53e49c1a Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 12 Sep 2014 07:23:34 +0000 Subject: [PATCH] fixed a memory leak bug caused when the duplicated host name is an address. fixed wrong redirection code processing bug in rewriting handler. fixed a bug of not setting the default port when no port is specfied in rewritten url address --- qse/lib/http/httpd-proxy.c | 25 +++++++++++++++++++++++-- qse/lib/http/httpd.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/qse/lib/http/httpd-proxy.c b/qse/lib/http/httpd-proxy.c index 9d474f18..430ff467 100644 --- a/qse/lib/http/httpd-proxy.c +++ b/qse/lib/http/httpd-proxy.c @@ -1947,13 +1947,20 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url); { /* if a network address is returned, change the peer address only */ /* TODO: prevent proxying to self */ + + if (qse_getnwadport(&nwad) == 0) + { + /* i don't care if new_url is X.X.X.X:0 or just X.X.X.X */ + qse_setnwadport (&nwad, qse_hton16(QSE_HTTPD_DEFAULT_PORT)); + } + proxy->peer.nwad = nwad; proxy->flags |= PROXY_URL_REWRITTEN; proxy->flags &= ~PROXY_RESOLVE_PEER_NAME; /* skip dns */ } else if (new_url[0] >= QSE_MT('0') && new_url[0] <= QSE_MT('9')) { - /* redirection */ + /* check if it begins with redirection code followed by a colon */ int redir_code = 0; qse_httpd_status_reloc_t reloc; const qse_mchar_t* nuptr = new_url; @@ -1963,7 +1970,11 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url); nuptr++; } while (*nuptr >= QSE_MT('0') && *nuptr <= QSE_MT('9')); - if (*nuptr != QSE_MT(':')) goto fail; + if (*nuptr != QSE_MT(':')) + { + /* no colon is found after digits. it's probably a normal url */ + goto normal_url; + } if (redir_code != 301 && redir_code != 302 && redir_code != 307) redir_code = 301; nuptr++; @@ -1981,6 +1992,7 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url); } else { + normal_url: if (proxy->flags & PROXY_RAW) { qse_mchar_t* tmp; @@ -2042,6 +2054,12 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url); } else { + if (qse_getnwadport(&nwad) == 0) + { + /* i don't care if tmp is X.X.X.X:0 or just X.X.X.X */ + qse_setnwadport (&nwad, qse_hton16(QSE_HTTPD_DEFAULT_PORT)); + } + proxy->peer.nwad = nwad; proxy->flags |= PROXY_URL_REWRITTEN; proxy->flags &= ~PROXY_RESOLVE_PEER_NAME; /* skip dns */ @@ -2050,6 +2068,9 @@ qse_mchar_t xxxx[128]; qse_nwadtombs (&proxy->peer.nwad, xxxx, 128, QSE_NWADTOMBS_ALL); printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX PEER NAME RESOLVED.....TO [%s] IN URLREWRITING NEW_URL[%s] %d %d\n", xxxx, new_url, (int)proxy->qpath_pos_in_reqfwdbuf, (int)proxy->qpath_len_in_reqfwdbuf); } + + /* the temporary string is not used. kill it */ + qse_httpd_freemem (httpd, tmp); } } } diff --git a/qse/lib/http/httpd.c b/qse/lib/http/httpd.c index 1e552bf1..33c32d0f 100644 --- a/qse/lib/http/httpd.c +++ b/qse/lib/http/httpd.c @@ -491,7 +491,8 @@ static qse_httpd_client_t* new_client (qse_httpd_t* httpd, qse_httpd_client_t* t /* copy the public fields, * keep the private fields initialized at 0 */ client->status = tmpl->status; - if (httpd->opt.scb.client.accepted == QSE_NULL) client->status |= QSE_HTTPD_CLIENT_READY; + if (httpd->opt.scb.client.accepted == QSE_NULL) + client->status |= QSE_HTTPD_CLIENT_READY; client->handle = tmpl->handle; client->handle2 = tmpl->handle2; client->remote_addr = tmpl->remote_addr; @@ -610,6 +611,21 @@ static void move_client_to_tail (qse_httpd_t* httpd, qse_httpd_client_t* client) } } +#if 0 +static int is_client_allowed (qse_httpd_t* httpd, qse_httpd_client_t* client) +{ + qse_httpd_mod_t* mod; + +/* TODO: no sequential search. speed up */ + for (mod = httpd->modlist; mod; mod = mod->next) + { + if (mod->new_client) mod->new_client (httpd, client); + } + + return 0; +} +#endif + static int accept_client ( qse_httpd_t* httpd, void* mux, qse_ubi_t handle, int mask, void* cbarg) { @@ -642,6 +658,14 @@ qse_printf (QSE_T("failed to accept from server [%s] [%d]\n"), tmp, server->hand if (server->dope.flags & QSE_HTTPD_SERVER_SECURE) clibuf.status |= QSE_HTTPD_CLIENT_SECURE; clibuf.server = server; +#if 0 + if (is_client_allowed (httpd, &clibuf) <= -1) + { + httpd->opt.scb.client.close (httpd, &clibuf); + return -1; + } +#endif + client = new_client (httpd, &clibuf); if (client == QSE_NULL) { @@ -649,9 +673,6 @@ qse_printf (QSE_T("failed to accept from server [%s] [%d]\n"), tmp, server->hand return -1; } -#if 0 -printf ("MUX ADDHND CLIENT READ %d\n", client->handle.i); -#endif if (httpd->opt.scb.mux.addhnd (httpd, mux, client->handle, QSE_HTTPD_MUX_READ, client) <= -1) { free_client (httpd, client); @@ -682,6 +703,7 @@ printf ("MUX ADDHND CLIENT READ %d\n", client->handle.i); httpd->opt.rcb.logact (httpd, &msg); } } + return 0; }