From 4b780a3499edc795b8edddac2e3b91792d7721d1 Mon Sep 17 00:00:00 2001 From: Michael McConville Date: Sat, 5 Mar 2016 23:38:12 -0500 Subject: [PATCH] A few more OpenBSD fixes Namely: o use malloc where an xCalloc slipped in o safeguard against an empty arg list - I don't think it's possible, but it would be potentially exploitable o we need to initialize the arg string to an empty string because we no longer use strlcpy(3) o annotate a tricky use of strlcpy(3)'s truncation --- openbsd/OpenBSDProcessList.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openbsd/OpenBSDProcessList.c b/openbsd/OpenBSDProcessList.c index b1060367..548a1eea 100644 --- a/openbsd/OpenBSDProcessList.c +++ b/openbsd/OpenBSDProcessList.c @@ -161,7 +161,7 @@ char *OpenBSDProcessList_readProcessName(kvm_t* kd, struct kinfo_proc* kproc, in * (argv[0]) if we fail to construct the full command. */ arg = kvm_getargv(kd, kproc, 500); - if (arg == NULL) { + if (arg == NULL || *arg == NULL) { *basenameEnd = strlen(kproc->p_comm); return xStrdup(kproc->p_comm); } @@ -169,18 +169,23 @@ char *OpenBSDProcessList_readProcessName(kvm_t* kd, struct kinfo_proc* kproc, in len += strlen(arg[i]) + 1; /* room for arg and trailing space or NUL */ } /* don't use xMalloc here - we want to handle huge argv's gracefully */ - if ((s = xCalloc(len, 1)) == NULL) { + if ((s = malloc(len)) == NULL) { *basenameEnd = strlen(kproc->p_comm); return xStrdup(kproc->p_comm); } + + *s = '\0'; + for (i = 0; arg[i] != NULL; i++) { n = strlcat(s, arg[i], len); if (i == 0) { /* TODO: rename all basenameEnd to basenameLen, make size_t */ *basenameEnd = MINIMUM(n, len-1); } + /* the trailing space should get truncated anyway */ strlcat(s, " ", len); } + return s; }