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
1 changed files with 20 additions and 26 deletions

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);
}
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;
if (strstr(out, "--tpm2")) {
has_tpm2 = true;
}
cleanup:
for (i = 0; swtpm_argv[i]; i++) {
g_free(swtpm_argv[i]);
}
return succ;
g_free(out);
return has_tpm2;
}
gboolean tpm_util_swtpm_start(const char *path, GPid *pid,