tpm2-tools/backport-clarify-return-values-from-string.patch
jinlun 401cdc3f40 fix build error
(cherry picked from commit 29e340782711577f5bdf7a48d8c5dcc7e5dc174c)
2022-12-19 11:48:36 +08:00

110 lines
4.0 KiB
Diff

From d6e7e673a6179400b66339bb5f66b0da87006fb1 Mon Sep 17 00:00:00 2001
From: Imran Desai <imran.desai@intel.com>
Date: Tue, 21 Dec 2021 13:53:40 -0700
Subject: [PATCH] lib/tpm2_options.c: clarify return values from string
comparisons
See #2890
Signed-off-by: Imran Desai <imran.desai@intel.com>
---
lib/tpm2_options.c | 58 +++++++++++++++++++++++++++++-----------------
1 file changed, 37 insertions(+), 21 deletions(-)
diff --git a/lib/tpm2_options.c b/lib/tpm2_options.c
index 8c8af2af7..ab6660dc5 100644
--- a/lib/tpm2_options.c
+++ b/lib/tpm2_options.c
@@ -119,8 +119,6 @@ void tpm2_options_free(tpm2_options *opts) {
static bool execute_man(char *prog_name, bool show_errors) {
pid_t pid;
- int status;
-
if ((pid = fork()) < 0) {
LOG_ERR("Could not fork process to execute man, error: %s",
strerror(errno));
@@ -129,7 +127,6 @@ static bool execute_man(char *prog_name, bool show_errors) {
#define MAX_TOOL_NAME_LEN 64
if (pid == 0) {
-
if (!show_errors) {
/* redirect manpager errors to stderr */
int fd = open("/dev/null", O_WRONLY);
@@ -141,29 +138,45 @@ static bool execute_man(char *prog_name, bool show_errors) {
close(fd);
}
+ /*
+ * Handle the case where tpm2 is specified without tool-name or help
+ */
const char *manpage = basename(prog_name);
- if (!strcmp(manpage, "tpm2")) {
- /*
- * Handle the case where tpm2 is specified without tool-name or help
- */
+ bool is_only_tpm2 = (strcmp(manpage, "tpm2") == 0);
+ if (is_only_tpm2) {
execlp("man", "man", "tpm2", NULL);
- } else if (strncmp(manpage, "tpm2_", strlen("tpm2_"))) {
- /*
- * Handle the case where the tool is specified as tpm2< >tool-name
- */
- char man_tool_name[MAX_TOOL_NAME_LEN] = {'t','p','m','2','_'};
- strncat(man_tool_name, manpage,
+ }
+
+ /*
+ * Handle the case where the tool is specified as tpm2< >tool-name
+ */
+ bool is_tpm2_space_toolname =
+ (strncmp(manpage, "tpm2_", strlen("tpm2_")) != 0);
+ if (is_tpm2_space_toolname) {
+ uint8_t toolname_len =
strlen(manpage) < (MAX_TOOL_NAME_LEN - strlen("tpm2_")) ?
- strlen(manpage) : (MAX_TOOL_NAME_LEN - strlen("tpm2_")));
+ strlen(manpage) : MAX_TOOL_NAME_LEN - strlen("tpm2_");
+
+ char man_tool_name[MAX_TOOL_NAME_LEN] = {'t','p','m','2','_'};
+
+ strncat(man_tool_name, manpage, toolname_len);
execlp("man", "man", man_tool_name, NULL);
- } else {
- /*
- * Handle the case where the tool is specified as tpm2<_>tool-name
- */
+ }
+
+ /*
+ * Handle the case where the tool is specified as tpm2<_>tool-name
+ */
+ bool is_tpm2_underscore_toolname =
+ (!is_only_tpm2 && !is_tpm2_space_toolname);
+ if (is_tpm2_underscore_toolname) {
execlp("man", "man", manpage, NULL);
}
- } else {
- if (waitpid(pid, &status, 0) == -1) {
+ }
+
+ if (pid != 0) {
+ int status;
+ bool is_child_process_incomplete = (waitpid(pid, &status, 0) == -1);
+ if (is_child_process_incomplete) {
LOG_ERR("Waiting for child process that executes man failed, error:"
" %s", strerror(errno));
return false;
@@ -524,7 +537,10 @@ tpm2_option_code tpm2_handle_options(int argc, char **argv,
if (!did_manpager) {
tpm2_print_usage(argv[0], tool_opts);
}
- if (tcti_conf_option && strcmp(tcti_conf_option, "none")) {
+
+ bool is_tcti_not_none = tcti_conf_option ?
+ (strcmp(tcti_conf_option, "none") != 0) : false;
+ if (is_tcti_not_none) {
TSS2_TCTI_INFO *info = NULL;
rc_tcti = Tss2_TctiLdr_GetInfo(tcti_conf_option, &info);
if (rc_tcti == TSS2_RC_SUCCESS && info) {