From: ornse01 Date: Wed, 18 Mar 2015 16:40:22 +0000 (+0000) Subject: fix infinit loop which cause by empty field's value. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;p=bbk%2Fbchanf.git fix infinit loop which cause by empty field's value. git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@668 20a0b8eb-f62a-4a12-8fe1-b598822500fb --- diff --git a/src/coding/htmlform_urlencoder.c b/src/coding/htmlform_urlencoder.c index abe780d..5606cf9 100644 --- a/src/coding/htmlform_urlencoder.c +++ b/src/coding/htmlform_urlencoder.c @@ -89,11 +89,14 @@ EXPORT Bool htmlform_urlencoder_next(htmlform_urlencoder_t *encoder, UB **str, W switch (encoder->state) { case HTMLFORM_URLENCODER_STATE_NAME: DP_STATE("NAME"); - htmlform_urlencoder_convert(encoder, field->name[encoder->src_pos], str, len); - encoder->src_pos++; if (encoder->src_pos == field->name_len) { encoder->state = HTMLFORM_URLENCODER_STATE_EQUAL; + *str = encoder->buf; + *len = 0; + return True; } + htmlform_urlencoder_convert(encoder, field->name[encoder->src_pos], str, len); + encoder->src_pos++; return True; case HTMLFORM_URLENCODER_STATE_EQUAL: DP_STATE("EQUAL"); @@ -104,12 +107,15 @@ EXPORT Bool htmlform_urlencoder_next(htmlform_urlencoder_t *encoder, UB **str, W return True; case HTMLFORM_URLENCODER_STATE_VALUE: DP_STATE("VALUE"); - htmlform_urlencoder_convert(encoder, field->value[encoder->src_pos], str, len); - encoder->src_pos++; if (encoder->src_pos == field->value_len) { encoder->state = HTMLFORM_URLENCODER_STATE_AMP; encoder->field_index++; + *str = encoder->buf; + *len = 0; + return True; } + htmlform_urlencoder_convert(encoder, field->value[encoder->src_pos], str, len); + encoder->src_pos++; return True; case HTMLFORM_URLENCODER_STATE_AMP: DP_STATE("AMP"); diff --git a/src/coding/test_htmlform_urlencoder.c b/src/coding/test_htmlform_urlencoder.c index 15a4717..50e7ffc 100644 --- a/src/coding/test_htmlform_urlencoder.c +++ b/src/coding/test_htmlform_urlencoder.c @@ -64,6 +64,9 @@ LOCAL UNITTEST_RESULT test_htmlform_urlencoder_common(urlencoder_testdata_t *tes if (cont == False) { break; } + if (len == 0) { + continue; + } result = realloc(result, result_len + len + 1); if (result == NULL) { ret = UNITTEST_RESULT_FAIL; @@ -149,10 +152,26 @@ LOCAL UNITTEST_RESULT test_htmlform_urlencoder_4() return test_htmlform_urlencoder_common(&testdata); } +LOCAL UNITTEST_RESULT test_htmlform_urlencoder_5() +{ + htmlform_field src[] = { + (htmlform_field){"aaa", 3, "", 0}, + (htmlform_field){"cc", 2, "", 0}, + }; + W src_len = 2; + UB expected[] = "aaa=&cc="; + W expected_len = strlen(expected); + urlencoder_testdata_t testdata = { + src, src_len, expected, expected_len + }; + return test_htmlform_urlencoder_common(&testdata); +} + EXPORT VOID test_htmlform_urlencoder_main(unittest_driver_t *driver) { UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_1); UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_2); UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_3); UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_4); + UNITTEST_DRIVER_REGIST(driver, test_htmlform_urlencoder_5); }