summaryrefslogtreecommitdiff
path: root/tests/test-qga.c
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2018-08-06 08:53:33 +0200
committerMarkus Armbruster <armbru@redhat.com>2018-08-16 08:42:06 +0200
commit015715f554f19a809cd80ff53a3881fddfda1336 (patch)
tree0fdd62ad38256540016f4570d28d4831912daa89 /tests/test-qga.c
parent62fff696d56b90e5820d2c3c3085b778b23f0d93 (diff)
downloadqemu-015715f554f19a809cd80ff53a3881fddfda1336.zip
tests: Clean up string interpolation into QMP input (simple cases)
When you build QMP input manually like this cmd = g_strdup_printf("{ 'execute': 'migrate'," "'arguments': { 'uri': '%s' } }", uri); rsp = qmp(cmd); g_free(cmd); you're responsible for escaping the interpolated values for JSON. Not done here, and therefore works only for sufficiently nice @uri. For instance, if @uri contained a single "'", qobject_from_vjsonf_nofail() would abort. A sufficiently nasty @uri could even inject unwanted members into the arguments object. Leaving interpolation into JSON to qmp() is more robust: rsp = qmp("{ 'execute': 'migrate', 'arguments': { 'uri': %s } }", uri); It's also more concise. Clean up the simple cases where we interpolate exactly a JSON value. Bonus: gets rid of non-literal format strings. A step towards compile-time format string checking without triggering -Wformat-nonliteral. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20180806065344.7103-13-armbru@redhat.com>
Diffstat (limited to 'tests/test-qga.c')
-rw-r--r--tests/test-qga.c150
1 files changed, 66 insertions, 84 deletions
diff --git a/tests/test-qga.c b/tests/test-qga.c
index d638b1571a..c552cc0125 100644
--- a/tests/test-qga.c
+++ b/tests/test-qga.c
@@ -146,12 +146,11 @@ static void test_qga_sync_delimited(gconstpointer fix)
guint32 v, r = g_random_int();
unsigned char c;
QDict *ret;
- gchar *cmd;
- cmd = g_strdup_printf("\xff{'execute': 'guest-sync-delimited',"
- " 'arguments': {'id': %u } }", r);
- qmp_fd_send(fixture->fd, cmd);
- g_free(cmd);
+ qmp_fd_send(fixture->fd,
+ "\xff{'execute': 'guest-sync-delimited',"
+ " 'arguments': {'id': %u } }",
+ r);
/*
* Read and ignore garbage until resynchronized.
@@ -188,7 +187,6 @@ static void test_qga_sync(gconstpointer fix)
const TestFixture *fixture = fix;
guint32 v, r = g_random_int();
QDict *ret;
- gchar *cmd;
/*
* TODO guest-sync is inherently limited: we cannot distinguish
@@ -201,10 +199,9 @@ static void test_qga_sync(gconstpointer fix)
* invalid JSON. Testing of '\xff' handling is done in
* guest-sync-delimited instead.
*/
- cmd = g_strdup_printf("{'execute': 'guest-sync',"
- " 'arguments': {'id': %u } }", r);
- ret = qmp_fd(fixture->fd, cmd);
- g_free(cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-sync', 'arguments': {'id': %u } }",
+ r);
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
@@ -428,7 +425,7 @@ static void test_qga_file_ops(gconstpointer fix)
const TestFixture *fixture = fix;
const unsigned char helloworld[] = "Hello World!\n";
const char *b64;
- gchar *cmd, *path, *enc;
+ gchar *path, *enc;
unsigned char *dec;
QDict *ret, *val;
int64_t id, eof;
@@ -446,10 +443,10 @@ static void test_qga_file_ops(gconstpointer fix)
enc = g_base64_encode(helloworld, sizeof(helloworld));
/* write */
- cmd = g_strdup_printf("{'execute': 'guest-file-write',"
- " 'arguments': { 'handle': %" PRId64 ","
- " 'buf-b64': '%s' } }", id, enc);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-write',"
+ " 'arguments': { 'handle': %" PRId64 ", 'buf-b64': %s } }",
+ id, enc);
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
@@ -459,23 +456,20 @@ static void test_qga_file_ops(gconstpointer fix)
g_assert_cmpint(count, ==, sizeof(helloworld));
g_assert_cmpint(eof, ==, 0);
qobject_unref(ret);
- g_free(cmd);
/* flush */
- cmd = g_strdup_printf("{'execute': 'guest-file-flush',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-flush',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
qobject_unref(ret);
- g_free(cmd);
/* close */
- cmd = g_strdup_printf("{'execute': 'guest-file-close',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-close',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
qobject_unref(ret);
- g_free(cmd);
/* check content */
path = g_build_filename(fixture->test_dir, "foo", NULL);
@@ -497,10 +491,10 @@ static void test_qga_file_ops(gconstpointer fix)
qobject_unref(ret);
/* read */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
@@ -510,14 +504,13 @@ static void test_qga_file_ops(gconstpointer fix)
g_assert_cmpstr(b64, ==, enc);
qobject_unref(ret);
- g_free(cmd);
g_free(enc);
/* read eof */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
@@ -526,14 +519,13 @@ static void test_qga_file_ops(gconstpointer fix)
g_assert(eof);
g_assert_cmpstr(b64, ==, "");
qobject_unref(ret);
- g_free(cmd);
/* seek */
- cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
- " 'arguments': { 'handle': %" PRId64 ", "
- " 'offset': %d, 'whence': '%s' } }",
- id, 6, "set");
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-seek',"
+ " 'arguments': { 'handle': %" PRId64 ", "
+ " 'offset': %d, 'whence': %s } }",
+ id, 6, "set");
qmp_assert_no_error(ret);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "position");
@@ -541,13 +533,12 @@ static void test_qga_file_ops(gconstpointer fix)
g_assert_cmpint(count, ==, 6);
g_assert(!eof);
qobject_unref(ret);
- g_free(cmd);
/* partial read */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
@@ -560,15 +551,13 @@ static void test_qga_file_ops(gconstpointer fix)
g_free(dec);
qobject_unref(ret);
- g_free(cmd);
/* close */
- cmd = g_strdup_printf("{'execute': 'guest-file-close',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-close',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
qobject_unref(ret);
- g_free(cmd);
}
static void test_qga_file_write_read(gconstpointer fix)
@@ -576,7 +565,7 @@ static void test_qga_file_write_read(gconstpointer fix)
const TestFixture *fixture = fix;
const unsigned char helloworld[] = "Hello World!\n";
const char *b64;
- gchar *cmd, *enc;
+ gchar *enc;
QDict *ret, *val;
int64_t id, eof;
gsize count;
@@ -591,10 +580,10 @@ static void test_qga_file_write_read(gconstpointer fix)
enc = g_base64_encode(helloworld, sizeof(helloworld));
/* write */
- cmd = g_strdup_printf("{'execute': 'guest-file-write',"
- " 'arguments': { 'handle': %" PRId64 ","
- " 'buf-b64': '%s' } }", id, enc);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-write',"
+ " 'arguments': { 'handle': %" PRId64 ","
+ " 'buf-b64': %s } }", id, enc);
g_assert_nonnull(ret);
qmp_assert_no_error(ret);
@@ -604,13 +593,12 @@ static void test_qga_file_write_read(gconstpointer fix)
g_assert_cmpint(count, ==, sizeof(helloworld));
g_assert_cmpint(eof, ==, 0);
qobject_unref(ret);
- g_free(cmd);
/* read (check implicit flush) */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
@@ -619,14 +607,13 @@ static void test_qga_file_write_read(gconstpointer fix)
g_assert(eof);
g_assert_cmpstr(b64, ==, "");
qobject_unref(ret);
- g_free(cmd);
/* seek to 0 */
- cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
- " 'arguments': { 'handle': %" PRId64 ", "
- " 'offset': %d, 'whence': '%s' } }",
- id, 0, "set");
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-seek',"
+ " 'arguments': { 'handle': %" PRId64 ", "
+ " 'offset': %d, 'whence': %s } }",
+ id, 0, "set");
qmp_assert_no_error(ret);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "position");
@@ -634,13 +621,12 @@ static void test_qga_file_write_read(gconstpointer fix)
g_assert_cmpint(count, ==, 0);
g_assert(!eof);
qobject_unref(ret);
- g_free(cmd);
/* read */
- cmd = g_strdup_printf("{'execute': 'guest-file-read',"
- " 'arguments': { 'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-read',"
+ " 'arguments': { 'handle': %" PRId64 "} }",
+ id);
val = qdict_get_qdict(ret, "return");
count = qdict_get_int(val, "count");
eof = qdict_get_bool(val, "eof");
@@ -649,16 +635,14 @@ static void test_qga_file_write_read(gconstpointer fix)
g_assert(eof);
g_assert_cmpstr(b64, ==, enc);
qobject_unref(ret);
- g_free(cmd);
g_free(enc);
/* close */
- cmd = g_strdup_printf("{'execute': 'guest-file-close',"
- " 'arguments': {'handle': %" PRId64 "} }",
- id);
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-file-close',"
+ " 'arguments': {'handle': %" PRId64 "} }",
+ id);
qobject_unref(ret);
- g_free(cmd);
}
static void test_qga_get_time(gconstpointer fix)
@@ -814,7 +798,6 @@ static void test_qga_guest_exec(gconstpointer fix)
int64_t pid, now, exitcode;
gsize len;
bool exited;
- char *cmd;
/* exec 'echo foo bar' */
ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
@@ -829,10 +812,10 @@ static void test_qga_guest_exec(gconstpointer fix)
/* wait for completion */
now = g_get_monotonic_time();
- cmd = g_strdup_printf("{'execute': 'guest-exec-status',"
- " 'arguments': { 'pid': %" PRId64 " } }", pid);
do {
- ret = qmp_fd(fixture->fd, cmd);
+ ret = qmp_fd(fixture->fd,
+ "{'execute': 'guest-exec-status',"
+ " 'arguments': { 'pid': %" PRId64 " } }", pid);
g_assert_nonnull(ret);
val = qdict_get_qdict(ret, "return");
exited = qdict_get_bool(val, "exited");
@@ -842,7 +825,6 @@ static void test_qga_guest_exec(gconstpointer fix)
} while (!exited &&
g_get_monotonic_time() < now + 5 * G_TIME_SPAN_SECOND);
g_assert(exited);
- g_free(cmd);
/* check stdout */
exitcode = qdict_get_int(val, "exitcode");