struct httpd_redirect_t
{
httpd_url_t *url;
- char *psz_dst;
+ char dst[1];
};
static int httpd_RedirectCallBack(httpd_callback_sys_t *p_sys,
answer->i_type = HTTPD_MSG_ANSWER;
answer->i_status = 301;
- answer->i_body = httpd_HtmlError (&p_body, 301, rdir->psz_dst);
+ answer->i_body = httpd_HtmlError (&p_body, 301, rdir->dst);
answer->p_body = (unsigned char *)p_body;
/* XXX check if it's ok or we need to set an absolute url */
- httpd_MsgAdd(answer, "Location", "%s", rdir->psz_dst);
+ httpd_MsgAdd(answer, "Location", "%s", rdir->dst);
httpd_MsgAdd(answer, "Content-Length", "%d", answer->i_body);
httpd_redirect_t *httpd_RedirectNew(httpd_host_t *host, const char *psz_url_dst,
const char *psz_url_src)
{
- httpd_redirect_t *rdir = malloc(sizeof(*rdir));
- if (!rdir)
+ size_t dstlen = strlen(psz_url_dst);
+
+ httpd_redirect_t *rdir = malloc(sizeof(*rdir) + dstlen);
+ if (unlikely(rdir == NULL))
return NULL;
rdir->url = httpd_UrlNew(host, psz_url_src, NULL, NULL);
free(rdir);
return NULL;
}
- rdir->psz_dst = strdup(psz_url_dst);
+ memcpy(rdir->dst, psz_url_dst, dstlen + 1);
/* Redirect apply for all HTTP request and RTSP DESCRIBE resquest */
httpd_UrlCatch(rdir->url, HTTPD_MSG_HEAD, httpd_RedirectCallBack,
void httpd_RedirectDelete(httpd_redirect_t *rdir)
{
httpd_UrlDelete(rdir->url);
- free(rdir->psz_dst);
free(rdir);
}