1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
Description: apreq_parse_multipart: allow (back) empty parts' "name" and "filename"
Fixes regression in v2.17, restoring the behaviour of v2.16.
Origin: https://svn.apache.org/viewvc?view=revision&revision=1905018
Forwarded: not-needed
--- a/library/parser_multipart.c
+++ b/library/parser_multipart.c
@@ -425,7 +425,7 @@ APREQ_DECLARE_PARSER(apreq_parse_multipa
if (cd != NULL) {
s = apreq_header_attribute(cd, "name", 4,
&name, &nlen);
- if (s == APR_SUCCESS && nlen) {
+ if (s == APR_SUCCESS) {
next_ctx->param_name = apr_pstrmemdup(pool, name,
nlen);
}
@@ -460,14 +460,14 @@ APREQ_DECLARE_PARSER(apreq_parse_multipa
if (cd != NULL && strncmp(cd, "form-data", 9) == 0) {
s = apreq_header_attribute(cd, "name", 4, &name, &nlen);
- if (s != APR_SUCCESS || !nlen) {
+ if (s != APR_SUCCESS) {
ctx->status = MFD_ERROR;
goto mfd_parse_brigade;
}
s = apreq_header_attribute(cd, "filename",
8, &filename, &flen);
- if (s == APR_SUCCESS && flen) {
+ if (s == APR_SUCCESS) {
apreq_param_t *param;
param = apreq_param_make(pool, name, nlen,
@@ -497,7 +497,7 @@ APREQ_DECLARE_PARSER(apreq_parse_multipa
s = apreq_header_attribute(cd, "filename",
8, &filename, &flen);
- if (s != APR_SUCCESS || !flen || !ctx->param_name) {
+ if (s != APR_SUCCESS || !ctx->param_name) {
ctx->status = MFD_ERROR;
goto mfd_parse_brigade;
}
--- a/library/t/util.c
+++ b/library/t/util.c
@@ -152,7 +152,7 @@ static void test_encode(dAT, void *ctx)
static void test_cp1252_to_utf8(dAT, void *ctx)
{
char src1[] = "%C3%80%E3%82%a2"; /* A_GRAVE KATAKANA_A as utf8 */
- char src2[5];
+ char src2[6]; /* + '\0' */
unsigned char expect[16];
apr_size_t slen;
@@ -270,7 +270,9 @@ static void test_file_mktemp(dAT, void *
static void test_header_attribute(dAT, void *ctx)
{
- const char hdr[] = "name=\"filename=foo\"; filename=\"quux.txt\"";
+ const char hdr[] = "form-data; name=\"filename=foo\"; filename=\"quux.txt\"";
+ const char opera[] = "form-data; name=\"foo\"; filename=\"\"";
+ const char empty[] = "form-data; name=\"\"; filename=\"\"";
const char *val;
apr_size_t vlen;
@@ -278,12 +280,25 @@ static void test_header_attribute(dAT, v
APR_SUCCESS);
AT_int_eq(vlen, 12);
AT_mem_eq("filename=foo", val, 12);
-
AT_int_eq(apreq_header_attribute(hdr, "filename", 8, &val, &vlen),
APR_SUCCESS);
AT_int_eq(vlen, 8);
AT_mem_eq("quux.txt", val, 8);
+ AT_int_eq(apreq_header_attribute(opera, "name", 4, &val, &vlen),
+ APR_SUCCESS);
+ AT_int_eq(vlen, 3);
+ AT_mem_eq("foo", val, 3);
+ AT_int_eq(apreq_header_attribute(opera, "filename", 8, &val, &vlen),
+ APR_SUCCESS);
+ AT_int_eq(vlen, 0);
+
+ AT_int_eq(apreq_header_attribute(empty, "name", 4, &val, &vlen),
+ APR_SUCCESS);
+ AT_int_eq(vlen,0);
+ AT_int_eq(apreq_header_attribute(empty, "filename", 8, &val, &vlen),
+ APR_SUCCESS);
+ AT_int_eq(vlen, 0);
}
static void test_brigade_concat(dAT, void *ctx)
@@ -315,7 +330,7 @@ int main(int argc, char *argv[])
{ dT(test_join, 0) },
{ dT(test_brigade_fwrite, 0) },
{ dT(test_file_mktemp, 0) },
- { dT(test_header_attribute, 6) },
+ { dT(test_header_attribute, 15) },
{ dT(test_brigade_concat, 0) },
};
|