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>
This commit is contained in:
Marc-André Lureau 2018-10-03 17:21:28 +04:00 committed by Stefan Berger
parent a4d710251f
commit c1d99200dd

View File

@ -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); 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; bool has_tpm2 = false;
gboolean succ; char *out = NULL;
unsigned i; static const char *argv[] = {
char buffer[10240]; "swtpm", "socket", "--help", NULL
ssize_t n;
gchar *swtpm_argv[] = {
g_strdup("swtpm"), g_strdup("socket"), g_strdup("--help"), NULL
}; };
succ = g_spawn_async_with_pipes(NULL, swtpm_argv, NULL, if (!g_spawn_sync(NULL /* working_dir */,
G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, (char **)argv,
NULL, &mystdout, NULL, NULL); NULL /* envp */,
if (!succ) { G_SPAWN_SEARCH_PATH,
goto cleanup; NULL /* child_setup */,
NULL /* user_data */,
&out,
NULL /* err */,
NULL /* exit_status */,
NULL)) {
return false;
} }
n = read(mystdout, buffer, sizeof(buffer) - 1); if (strstr(out, "--tpm2")) {
if (n < 0) { has_tpm2 = true;
goto cleanup;
}
buffer[n] = 0;
if (!strstr(buffer, "--tpm2")) {
succ = false;
} }
cleanup: g_free(out);
for (i = 0; swtpm_argv[i]; i++) { return has_tpm2;
g_free(swtpm_argv[i]);
}
return succ;
} }
gboolean tpm_util_swtpm_start(const char *path, GPid *pid, gboolean tpm_util_swtpm_start(const char *path, GPid *pid,