File: multipart-with-empty-filename.patch

package info (click to toggle)
libapreq2 2.17-8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,164 kB
  • sloc: ansic: 8,283; perl: 5,451; sh: 4,627; cpp: 380; makefile: 270; javascript: 186
file content (100 lines) | stat: -rw-r--r-- 3,958 bytes parent folder | download | duplicates (2)
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) },
     };