summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew G. Morgan <morgan@kernel.org>2021-04-21 20:08:50 -0700
committerAndrew G. Morgan <morgan@kernel.org>2021-04-21 20:09:23 -0700
commit954a5ce4fdf195e062909f2c921d8f915d2905b9 (patch)
treeae6d766701e5eded4187d7a17666af5539117a39
parent3f1f067e609fc99342734b2b1ad099aae2b5e4fd (diff)
downloadlibcap2-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.c9
-rw-r--r--progs/capsh.c30
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[])