mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
mod_lua: Use binary strstr for finding endpoints of a multipart object. (How did this EVER work?! *sigh*)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1588761 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -317,6 +317,20 @@ static int req_parseargs(lua_State *L)
|
|||||||
return 2; /* [table<string, string>, table<string, array<string>>] */
|
return 2; /* [table<string, string>, table<string, array<string>>] */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ap_lua_binstrstr: Binary strstr function for uploaded data with NULL bytes */
|
||||||
|
char* ap_lua_binstrstr (const char * haystack, size_t hsize, const char* needle, size_t nsize)
|
||||||
|
{
|
||||||
|
if (haystack == NULL) return NULL;
|
||||||
|
if (needle == NULL) return NULL;
|
||||||
|
if (hsize < nsize) return NULL;
|
||||||
|
for (size_t p = 0; p <= (hsize - nsize); ++p) {
|
||||||
|
if (memcmp(haystack + p, needle, nsize) == 0) {
|
||||||
|
return (char*) (haystack + p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* r:parsebody(): Parses regular (url-enocded) or multipart POST data and returns two tables*/
|
/* r:parsebody(): Parses regular (url-enocded) or multipart POST data and returns two tables*/
|
||||||
static int req_parsebody(lua_State *L)
|
static int req_parsebody(lua_State *L)
|
||||||
{
|
{
|
||||||
@@ -348,15 +362,15 @@ static int req_parsebody(lua_State *L)
|
|||||||
for
|
for
|
||||||
(
|
(
|
||||||
start = strstr((char *) data, multipart);
|
start = strstr((char *) data, multipart);
|
||||||
start != start + size;
|
start != NULL;
|
||||||
start = end
|
start = end
|
||||||
) {
|
) {
|
||||||
i++;
|
i++;
|
||||||
if (i == POST_MAX_VARS) break;
|
if (i == POST_MAX_VARS) break;
|
||||||
end = strstr((char *) (start + 1), multipart);
|
|
||||||
if (!end) end = start + size;
|
|
||||||
crlf = strstr((char *) start, "\r\n\r\n");
|
crlf = strstr((char *) start, "\r\n\r\n");
|
||||||
if (!crlf) break;
|
if (!crlf) break;
|
||||||
|
end = ap_lua_binstrstr(crlf, (size - (crlf - data)), multipart, len);
|
||||||
|
if (end == NULL) break;
|
||||||
key = (char *) apr_pcalloc(r->pool, 256);
|
key = (char *) apr_pcalloc(r->pool, 256);
|
||||||
filename = (char *) apr_pcalloc(r->pool, 256);
|
filename = (char *) apr_pcalloc(r->pool, 256);
|
||||||
vlen = end - crlf - 8;
|
vlen = end - crlf - 8;
|
||||||
|
Reference in New Issue
Block a user