diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2018-10-03 17:21:28 +0400 |
---|---|---|
committer | Stefan Berger <stefanb@linux.vnet.ibm.com> | 2018-10-25 12:46:47 -0400 |
commit | c1d99200dd3d7f73ebe13b32f12944d3e48a2cb9 (patch) | |
tree | dbdd3560a08e6f6a2d7e3955803c89d2103abc5e | |
parent | a4d710251fa5aa9ec26de4626f11c78500195d12 (diff) | |
download | qemu-c1d99200dd3d7f73ebe13b32f12944d3e48a2cb9.zip qemu-c1d99200dd3d7f73ebe13b32f12944d3e48a2cb9.tar.gz qemu-c1d99200dd3d7f73ebe13b32f12944d3e48a2cb9.tar.bz2 |
tests/tpm: fix tpm_util_swtpm_has_tpm2()
Using g_spawn_async_with_pipes() is more complicated than running the
sync version. The async version returns a file descriptor for stdout, which may
not be fully read. Sometime "--tpm2" will failed to be read, and will
cause the related test to be silently skipped.
Use g_spawn_sync() instead, simplifying the code and fixing the race.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
-rw-r--r-- | tests/tpm-util.c | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/tests/tpm-util.c b/tests/tpm-util.c index 9f3f156..ae4aaf3 100644 --- a/tests/tpm-util.c +++ b/tests/tpm-util.c @@ -145,39 +145,33 @@ void tpm_util_pcrread(QTestState *s, tx_func *tx, g_assert_cmpmem(buffer, exp_resp_size, exp_resp, exp_resp_size); } -static gboolean tpm_util_swtpm_has_tpm2(void) +static bool tpm_util_swtpm_has_tpm2(void) { - gint mystdout; - gboolean succ; - unsigned i; - char buffer[10240]; - ssize_t n; - gchar *swtpm_argv[] = { - g_strdup("swtpm"), g_strdup("socket"), g_strdup("--help"), NULL + bool has_tpm2 = false; + char *out = NULL; + static const char *argv[] = { + "swtpm", "socket", "--help", NULL }; - succ = g_spawn_async_with_pipes(NULL, swtpm_argv, NULL, - G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, - NULL, &mystdout, NULL, NULL); - if (!succ) { - goto cleanup; + if (!g_spawn_sync(NULL /* working_dir */, + (char **)argv, + NULL /* envp */, + G_SPAWN_SEARCH_PATH, + NULL /* child_setup */, + NULL /* user_data */, + &out, + NULL /* err */, + NULL /* exit_status */, + NULL)) { + return false; } - n = read(mystdout, buffer, sizeof(buffer) - 1); - if (n < 0) { - goto cleanup; - } - buffer[n] = 0; - if (!strstr(buffer, "--tpm2")) { - succ = false; - } - - cleanup: - for (i = 0; swtpm_argv[i]; i++) { - g_free(swtpm_argv[i]); + if (strstr(out, "--tpm2")) { + has_tpm2 = true; } - return succ; + g_free(out); + return has_tpm2; } gboolean tpm_util_swtpm_start(const char *path, GPid *pid, |