Просмотр исходного кода

qapi: Fix string input visitor regression for empty lists

Visiting a list when input is the empty string should result in an
empty list, not an error.  Noticed when commit 3d089ce belatedly added
tests, but simply accepted as weird then.  It's actually a regression:
broken in commit 74f24cb, v2.7.0.  Fix it, and throw in another test
case for empty string.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1490026424-11330-2-git-send-email-armbru@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Markus Armbruster 8 лет назад
Родитель
Сommit
d2788227c6
2 измененных файлов с 12 добавлено и 3 удалено
  1. 4 0
      qapi/string-input-visitor.c
  2. 8 3
      tests/test-string-input-visitor.c

+ 4 - 0
qapi/string-input-visitor.c

@@ -54,6 +54,10 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
         return 0;
         return 0;
     }
     }
 
 
+    if (!*str) {
+        return 0;
+    }
+
     do {
     do {
         errno = 0;
         errno = 0;
         start = strtoll(str, &endptr, 0);
         start = strtoll(str, &endptr, 0);

+ 8 - 3
tests/test-string-input-visitor.c

@@ -63,6 +63,11 @@ static void test_visitor_in_int(TestInputVisitorData *data,
 
 
     visit_type_int(v, NULL, &res, &err);
     visit_type_int(v, NULL, &res, &err);
     error_free_or_abort(&err);
     error_free_or_abort(&err);
+
+    v = visitor_input_test_init(data, "");
+
+    visit_type_int(v, NULL, &res, &err);
+    error_free_or_abort(&err);
 }
 }
 
 
 static void check_ilist(Visitor *v, int64_t *expected, size_t n)
 static void check_ilist(Visitor *v, int64_t *expected, size_t n)
@@ -140,11 +145,11 @@ static void test_visitor_in_intList(TestInputVisitorData *data,
     v = visitor_input_test_init(data, "18446744073709551615");
     v = visitor_input_test_init(data, "18446744073709551615");
     check_ulist(v, expect4, ARRAY_SIZE(expect4));
     check_ulist(v, expect4, ARRAY_SIZE(expect4));
 
 
-    /* Empty list is invalid (weird) */
+    /* Empty list */
 
 
     v = visitor_input_test_init(data, "");
     v = visitor_input_test_init(data, "");
-    visit_type_int64List(v, NULL, &res, &err);
-    error_free_or_abort(&err);
+    visit_type_int64List(v, NULL, &res, &error_abort);
+    g_assert(!res);
 
 
     /* Not a list */
     /* Not a list */