diff options
author | Andrew G. Morgan <morgan@kernel.org> | 2021-04-21 20:08:50 -0700 |
---|---|---|
committer | Andrew G. Morgan <morgan@kernel.org> | 2021-04-21 20:09:23 -0700 |
commit | 954a5ce4fdf195e062909f2c921d8f915d2905b9 (patch) | |
tree | ae6d766701e5eded4187d7a17666af5539117a39 | |
parent | 3f1f067e609fc99342734b2b1ad099aae2b5e4fd (diff) | |
download | libcap2-954a5ce4fdf195e062909f2c921d8f915d2905b9.tar.gz |
Bug fixes identified by static code analysis.
Analysis and much of this commit was contributed by Zoltan
Fridrich of Redhat.
Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
-rw-r--r-- | pam_cap/pam_cap.c | 9 | ||||
-rw-r--r-- | progs/capsh.c | 30 |
2 files changed, 26 insertions, 13 deletions
diff --git a/pam_cap/pam_cap.c b/pam_cap/pam_cap.c index 6927f7b..5b48b06 100644 --- a/pam_cap/pam_cap.c +++ b/pam_cap/pam_cap.c @@ -218,7 +218,7 @@ static int set_capabilities(struct pam_cap_s *cs) if (!cap_set_proc(cap_s)) { ok = 1; } - goto cleanup_cap_s; + goto cleanup_conf; } iab = cap_iab_from_text(conf_caps); @@ -238,10 +238,9 @@ cleanup_conf: _pam_drop(conf_caps); cleanup_cap_s: - if (cap_s) { - cap_free(cap_s); - cap_s = NULL; - } + cap_free(cap_s); + cap_s = NULL; + return ok; } diff --git a/progs/capsh.c b/progs/capsh.c index e3d8341..516ba37 100644 --- a/progs/capsh.c +++ b/progs/capsh.c @@ -338,8 +338,8 @@ static void arg_change_amb(const char *arg_names, cap_flag_value_t set) */ static char *find_self(const char *arg0) { - int i; - char *parts, *dir, *scratch; + int i, status=1; + char *p = NULL, *parts, *dir, *scratch; const char *path; for (i = strlen(arg0)-1; i >= 0 && arg0[i] != '/'; i--); @@ -354,21 +354,35 @@ static char *find_self(const char *arg0) } parts = strdup(path); + if (parts == NULL) { + fprintf(stderr, "insufficient memory for parts of path\n"); + exit(1); + } + scratch = malloc(2+strlen(path)+strlen(arg0)); - if (parts == NULL || scratch == NULL) { + if (scratch == NULL) { fprintf(stderr, "insufficient memory for path building\n"); - exit(1); + goto free_parts; } - for (i=0; (dir = strtok(parts, ":")); parts = NULL) { + for (i=0, p = parts; (dir = strtok(p, ":")); p = NULL) { sprintf(scratch, "%s/%s", dir, arg0); if (access(scratch, X_OK) == 0) { - return scratch; + status = 0; + break; } } + if (status) { + fprintf(stderr, "unable to find executable '%s' in PATH\n", arg0); + free(scratch); + } - fprintf(stderr, "unable to find executable '%s' in PATH\n", arg0); - exit(1); +free_parts: + free(parts); + if (status) { + exit(status); + } + return scratch; } int main(int argc, char *argv[], char *envp[]) |