bozo: Fix problems found by static analysis 76/14676/7
authorCheyenne Wills <cwills@sinenomine.net>
Tue, 31 Aug 2021 14:48:33 +0000 (08:48 -0600)
committerBenjamin Kaduk <kaduk@mit.edu>
Wed, 1 Sep 2021 00:06:10 +0000 (20:06 -0400)
Several static analysis tools have identified various problems:
 - files left open from early exits/returns       (infer)
 - missing checks to ensure *alloc was successful (infer)
 - possible memory leaks                          (scan-build, cppcheck)

To resolve the above problems:
 - close files before exiting/returning
 - add checks to ensure *alloc was successful before using the memory
 - fix possible memory leaks by freeing memory

This commit is a reorganization of commits developed by Pat Riehecky,
who ran the static analysis tools and developed the fixes.

Change-Id: Iabebf46d2d1d8bb3bd2378cf2d1e7e4b94706bfd
Reviewed-on: https://gerrit.openafs.org/14676
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/bozo/bos.c
src/bozo/bosoprocs.c
src/bozo/bosserver.c

index 7d56ce0..28bc343 100644 (file)
@@ -396,6 +396,7 @@ Install(struct cmd_syndesc *as, void *arock)
        if (code) {
            fprintf(stderr, "bos: failed to stat file %s, errno is %d\n", ti->data,
                   errno);
+           close(fd);
            return 1;
        }
        /* compute destination dir */
@@ -408,6 +409,7 @@ Install(struct cmd_syndesc *as, void *arock)
            code = CopyBytes(fd, tcall);
        }
        code = rx_EndCall(tcall, code);
+       close(fd);
        if (code) {
            fprintf(stderr, "bos: failed to install %s (%s)\n", ti->data, em(code));
            return 1;
@@ -1109,7 +1111,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2,
            if ((strlen(tbuffer) + 9 + strlen(partName) + 1 + strlen(aparm2) +
                 1) > BOZO_BSSIZE) {
                fprintf(stderr, "bos: command line too big\n");
-               return (E2BIG);
+               code = E2BIG;
+               goto done;
            }
 
            strcat(tbuffer, " -client ");
@@ -1122,7 +1125,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2,
            if ((strlen(tbuffer) + 1 + strlen(partName) + 1 + strlen(aparm2) +
                 1) > BOZO_BSSIZE) {
                fprintf(stderr, "bos: command line too big\n");
-               return (E2BIG);
+               code = E2BIG;
+               goto done;
            }
 
            strcat(tbuffer, " ");
@@ -1135,7 +1139,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2,
        strncpy(tbuffer, AFSDIR_CANONICAL_SERVER_SALVAGER_FILEPATH, BOZO_BSSIZE);
        if ((strlen(tbuffer) + 4 + strlen(partName) + 1) > BOZO_BSSIZE) {
            fprintf(stderr, "bos: command line too big\n");
-           return (E2BIG);
+           code = E2BIG;
+           goto done;
        }
        strcat(tbuffer, " -force ");
        strcat(tbuffer, partName);
@@ -1151,7 +1156,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2,
        if (parallel != NULL) {
            if ((strlen(tbuffer) + 11 + strlen(parallel) + 1) > BOZO_BSSIZE) {
                fprintf(stderr, "bos: command line too big\n");
-               return (E2BIG);
+               code = E2BIG;
+               goto done;
            }
            strcat(tbuffer, " -parallel ");
            strcat(tbuffer, parallel);
@@ -1161,7 +1167,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2,
        if (atmpDir != NULL) {
            if ((strlen(tbuffer) + 9 + strlen(atmpDir) + 1) > BOZO_BSSIZE) {
                fprintf(stderr, "bos: command line too big\n");
-               return (E2BIG);
+               code = E2BIG;
+               goto done;
            }
            strcat(tbuffer, " -tmpdir ");
            strcat(tbuffer, atmpDir);
@@ -1171,7 +1178,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2,
        if (orphans != NULL) {
            if ((strlen(tbuffer) + 10 + strlen(orphans) + 1) > BOZO_BSSIZE) {
                fprintf(stderr, "bos: command line too big\n");
-               return (E2BIG);
+               code = E2BIG;
+               goto done;
            }
            strcat(tbuffer, " -orphans ");
            strcat(tbuffer, orphans);
@@ -1180,7 +1188,8 @@ DoSalvage(struct rx_connection * aconn, char * aparm1, char * aparm2,
        if (dodirs) {
            if (strlen(tbuffer) + 14 > BOZO_BSSIZE) {
                fprintf(stderr, "bos: command line too big\n");
-               return (E2BIG);
+               code = E2BIG;
+               goto done;
            }
            strcat(tbuffer, " -salvagedirs");
        }
index bbf5c33..5c00176 100644 (file)
@@ -430,12 +430,10 @@ SBOZO_GetCellName(struct rx_call *acall, char **aname)
     char tname[MAXCELLCHARS];
 
     code = afsconf_GetLocalCell(bozo_confdir, tname, sizeof(tname));
-    if (code) {
-       /* must set output parameters even if aborting */
-       *aname = malloc(1);
-       **aname = 0;
-    } else {
+    if (code == 0) {
        *aname = strdup(tname);
+       if (*aname == NULL)
+           code = ENOMEM;
     }
 
     return code;
index b6a4a32..d7e6d00 100644 (file)
@@ -168,13 +168,14 @@ MakeDirParents(const char *adir, int areqPerm)
 
     tdir = strdup(adir);
     if (!tdir) {
-       return ENOMEM;
+       error = ENOMEM;
+       goto done;
     }
 
     /* strip trailing slashes */
     len = strlen(tdir);
     if (!len) {
-       return 0;
+       goto done;
     }
     p = tdir + len - 1;
     while (p != tdir && *p == PATH_DELIM) {