Message ID | 1525423069-61903-9-git-send-email-imammedo@redhat.com |
---|---|
State | New |
Headers | show |
Series | enable numa configuration before machine_init() from QMP | expand |
On Fri, May 04, 2018 at 10:37:46AM +0200, Igor Mammedov wrote: > Add permission checks for commands at 'preconfig' stage. > > Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Queued, thanks.
On 05/04/2018 03:37 AM, Igor Mammedov wrote: > Add permission checks for commands at 'preconfig' stage. > > Signed-off-by: Igor Mammedov <imammedo@redhat.com> > --- > +++ b/tests/qmp-test.c > @@ -392,6 +392,49 @@ static void add_query_tests(QmpSchema *schema) > } > } > > +static bool qmp_rsp_is_err(QDict *rsp) > +{ > + QDict *error = qdict_get_qdict(rsp, "error"); > + QDECREF(rsp); > + return !!error; At first glance, I was worried that this was a use-after-free; but as you are not actually dereferencing error, but merely checking whether the pointer was non-NULL (which works even if the pointer has gone stale in the meantime due to the QDECREF), you are okay. > +} > + > +static void test_qmp_preconfig(void) > +{ > + QDict *rsp, *ret; > + QTestState *qs = qtest_startf("%s --preconfig", common_args); > + > + /* preconfig state */ > + /* enabled commands, no error expected */ > + g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'query-commands' }"))); > + > + /* forbidden commands, expected error */ > + g_assert(qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'query-cpus' }"))); > + > + /* check that query-status returns preconfig state */ > + rsp = qtest_qmp(qs, "{ 'execute': 'query-status' }"); > + ret = qdict_get_qdict(rsp, "return"); > + g_assert(ret); > + g_assert_cmpstr(qdict_get_try_str(ret, "status"), ==, "preconfig"); > + QDECREF(rsp); > + > + /* exit preconfig state */ > + g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'exit-preconfig' }"))); > + qtest_qmp_eventwait(qs, "RESUME"); > + > + /* check that query-status returns running state */ > + rsp = qtest_qmp(qs, "{ 'execute': 'query-status' }"); > + ret = qdict_get_qdict(rsp, "return"); > + g_assert(ret); > + g_assert_cmpstr(qdict_get_try_str(ret, "status"), ==, "running"); > + QDECREF(rsp); > + > + /* enabled commands, no error expected */ > + g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'query-cpus' }"))); It would also be worth testing that a second exit-preconfig fails, now that you are no longer in preconfig state.
diff --git a/tests/qmp-test.c b/tests/qmp-test.c index 772058f..c49837a 100644 --- a/tests/qmp-test.c +++ b/tests/qmp-test.c @@ -392,6 +392,49 @@ static void add_query_tests(QmpSchema *schema) } } +static bool qmp_rsp_is_err(QDict *rsp) +{ + QDict *error = qdict_get_qdict(rsp, "error"); + QDECREF(rsp); + return !!error; +} + +static void test_qmp_preconfig(void) +{ + QDict *rsp, *ret; + QTestState *qs = qtest_startf("%s --preconfig", common_args); + + /* preconfig state */ + /* enabled commands, no error expected */ + g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'query-commands' }"))); + + /* forbidden commands, expected error */ + g_assert(qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'query-cpus' }"))); + + /* check that query-status returns preconfig state */ + rsp = qtest_qmp(qs, "{ 'execute': 'query-status' }"); + ret = qdict_get_qdict(rsp, "return"); + g_assert(ret); + g_assert_cmpstr(qdict_get_try_str(ret, "status"), ==, "preconfig"); + QDECREF(rsp); + + /* exit preconfig state */ + g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'exit-preconfig' }"))); + qtest_qmp_eventwait(qs, "RESUME"); + + /* check that query-status returns running state */ + rsp = qtest_qmp(qs, "{ 'execute': 'query-status' }"); + ret = qdict_get_qdict(rsp, "return"); + g_assert(ret); + g_assert_cmpstr(qdict_get_try_str(ret, "status"), ==, "running"); + QDECREF(rsp); + + /* enabled commands, no error expected */ + g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'query-cpus' }"))); + + qtest_quit(qs); +} + int main(int argc, char *argv[]) { QmpSchema schema; @@ -403,6 +446,7 @@ int main(int argc, char *argv[]) qtest_add_func("qmp/oob", test_qmp_oob); qmp_schema_init(&schema); add_query_tests(&schema); + qtest_add_func("qmp/preconfig", test_qmp_preconfig); ret = g_test_run();
Add permission checks for commands at 'preconfig' stage. Signed-off-by: Igor Mammedov <imammedo@redhat.com> --- v6: * replace 'cont' with 'exit-preconfig' command v5: * s/-preconfig/--preconfig/ v4: * s/is_err()/qmp_rsp_is_err()/ * return true even if 'error' doesn't contain 'desc' (Eric Blake <eblake@redhat.com>) --- tests/qmp-test.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+)