OSDN Git Service

fix infinit loop which cause by empty field's value. master
authorornse01 <ornse01@users.sourceforge.jp>
Wed, 18 Mar 2015 16:40:22 +0000 (16:40 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Wed, 18 Mar 2015 16:40:22 +0000 (16:40 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@668 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/coding/htmlform_urlencoder.c
src/coding/test_htmlform_urlencoder.c

index abe780d..5606cf9 100644 (file)
@@ -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");
index 15a4717..50e7ffc 100644 (file)
@@ -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);
 }