fix infinit loop which cause by empty field's value.
@@ -64,6 +64,9 @@ | ||
64 | 64 | if (cont == False) { |
65 | 65 | break; |
66 | 66 | } |
67 | + if (len == 0) { | |
68 | + continue; | |
69 | + } | |
67 | 70 | result = realloc(result, result_len + len + 1); |
68 | 71 | if (result == NULL) { |
69 | 72 | ret = UNITTEST_RESULT_FAIL; |
@@ -149,6 +152,21 @@ | ||
149 | 152 | return test_htmlform_urlencoder_common(&testdata); |
150 | 153 | } |
151 | 154 | |
155 | +LOCAL UNITTEST_RESULT test_htmlform_urlencoder_5() | |
156 | +{ | |
157 | + htmlform_field src[] = { | |
158 | + (htmlform_field){"aaa", 3, "", 0}, | |
159 | + (htmlform_field){"cc", 2, "", 0}, | |
160 | + }; | |
161 | + W src_len = 2; | |
162 | + UB expected[] = "aaa=&cc="; | |
163 | + W expected_len = strlen(expected); | |
164 | + urlencoder_testdata_t testdata = { | |
165 | + src, src_len, expected, expected_len | |
166 | + }; | |
167 | + return test_htmlform_urlencoder_common(&testdata); | |
168 | +} | |
169 | + | |
152 | 170 | EXPORT VOID test_htmlform_urlencoder_main(unittest_driver_t *driver) |
153 | 171 | { |
154 | 172 | UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_1); |
@@ -155,4 +173,5 @@ | ||
155 | 173 | UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_2); |
156 | 174 | UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_3); |
157 | 175 | UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_4); |
176 | + UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_5); | |
158 | 177 | } |
@@ -89,11 +89,14 @@ | ||
89 | 89 | switch (encoder->state) { |
90 | 90 | case HTMLFORM_URLENCODER_STATE_NAME: |
91 | 91 | DP_STATE("NAME"); |
92 | - htmlform_urlencoder_convert(encoder, field->name[encoder->src_pos], str, len); | |
93 | - encoder->src_pos++; | |
94 | 92 | if (encoder->src_pos == field->name_len) { |
95 | 93 | encoder->state = HTMLFORM_URLENCODER_STATE_EQUAL; |
94 | + *str = encoder->buf; | |
95 | + *len = 0; | |
96 | + return True; | |
96 | 97 | } |
98 | + htmlform_urlencoder_convert(encoder, field->name[encoder->src_pos], str, len); | |
99 | + encoder->src_pos++; | |
97 | 100 | return True; |
98 | 101 | case HTMLFORM_URLENCODER_STATE_EQUAL: |
99 | 102 | DP_STATE("EQUAL"); |
@@ -104,12 +107,15 @@ | ||
104 | 107 | return True; |
105 | 108 | case HTMLFORM_URLENCODER_STATE_VALUE: |
106 | 109 | DP_STATE("VALUE"); |
107 | - htmlform_urlencoder_convert(encoder, field->value[encoder->src_pos], str, len); | |
108 | - encoder->src_pos++; | |
109 | 110 | if (encoder->src_pos == field->value_len) { |
110 | 111 | encoder->state = HTMLFORM_URLENCODER_STATE_AMP; |
111 | 112 | encoder->field_index++; |
113 | + *str = encoder->buf; | |
114 | + *len = 0; | |
115 | + return True; | |
112 | 116 | } |
117 | + htmlform_urlencoder_convert(encoder, field->value[encoder->src_pos], str, len); | |
118 | + encoder->src_pos++; | |
113 | 119 | return True; |
114 | 120 | case HTMLFORM_URLENCODER_STATE_AMP: |
115 | 121 | DP_STATE("AMP"); |