va_list ap;
int ret = -1;
size_t i, j;
- const char *name;
+ const char *name, *last_name = NULL;
int type;
size_t nkeys = 0, nkeysalloc = 0;
virTypedParameterPtr sorted = NULL, keys = NULL;
if (STRNEQ(sorted[i].field, keys[j].field)) {
j++;
} else {
- if (i > j && !(keys[j].value.i & VIR_TYPED_PARAM_MULTIPLE)) {
+ if (STREQ_NULLABLE(last_name, sorted[i].field) &&
+ !(keys[j].value.i & VIR_TYPED_PARAM_MULTIPLE)) {
virReportError(VIR_ERR_INVALID_ARG,
_("parameter '%s' occurs multiple times"),
sorted[i].field);
virTypedParameterTypeToString(keys[j].type));
goto cleanup;
}
+ last_name = sorted[i].field;
i++;
}
}
"foobar", VIR_TYPED_PARAM_STRING | test->foobar_flags,
"foo", VIR_TYPED_PARAM_INT,
"bar", VIR_TYPED_PARAM_UINT,
+ "zzz", VIR_TYPED_PARAM_UINT,
NULL);
if (test->expected_errcode) {
)
.expected_errcode = 0, .expected_errmessage = NULL,
},
+ {
+ .name = "BUG, non-duplicate marked as duplicate",
+ .foobar_flags = VIR_TYPED_PARAM_MULTIPLE,
+ PARAMS(
+ { .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
+ { .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
+ { .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
+ { .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
+ { .field = "foobar", .type = VIR_TYPED_PARAM_STRING },
+ { .field = "zzz", .type = VIR_TYPED_PARAM_UINT },
+ )
+ .expected_errcode = 0, .expected_errmessage = NULL,
+ },
{
.name = NULL
}