memory-leak-fixes-20040417
authorNickolai Zeldovich <kolya@mit.edu>
Sun, 18 Apr 2004 07:13:47 +0000 (07:13 +0000)
committerNickolai Zeldovich <kolya@mit.edu>
Sun, 18 Apr 2004 07:13:47 +0000 (07:13 +0000)
Fix some memory leaks.

src/afs/afs_pioctl.c
src/libacl/aclprocs.c
src/ptserver/db_verify.c
src/ptserver/ptutils.c
src/ptserver/readgroup.c
src/ptserver/readpwd.c
src/rx/rx.c
src/rxkad/rxkad_client.c
src/vol/volume.c

index 8586d01..f9555d0 100644 (file)
@@ -1573,32 +1573,43 @@ DECL_PIOCTL(PSetVolumeStatus)
     XSTATS_DECLS;
 
     AFS_STATCNT(PSetVolumeStatus);
-    if (!avc)
-       return EINVAL;
+    if (!avc) {
+       code = EINVAL;
+       goto out;
+    }
 
     tvp = afs_GetVolume(&avc->fid, areq, READ_LOCK);
     if (tvp) {
        if (tvp->states & (VRO | VBackup)) {
            afs_PutVolume(tvp, READ_LOCK);
-           return EROFS;
+           code = EROFS;
+           goto out;
        }
        afs_PutVolume(tvp, READ_LOCK);
-    } else
-       return ENODEV;
+    } else {
+       code = ENODEV;
+       goto out;
+    }
     /* Copy the junk out, using cp as a roving pointer. */
     cp = ain;
     memcpy((char *)&volstat, cp, sizeof(AFSFetchVolumeStatus));
     cp += sizeof(AFSFetchVolumeStatus);
-    if (strlen(cp) >= sizeof(volName))
-       return E2BIG;
+    if (strlen(cp) >= sizeof(volName)) {
+       code = E2BIG;
+       goto out;
+    }
     strcpy(volName, cp);
     cp += strlen(volName) + 1;
-    if (strlen(cp) >= sizeof(offLineMsg))
-       return E2BIG;
+    if (strlen(cp) >= sizeof(offLineMsg)) {
+       code = E2BIG;
+       goto out;
+    }
     strcpy(offLineMsg, cp);
     cp += strlen(offLineMsg) + 1;
-    if (strlen(cp) >= sizeof(motd))
-       return E2BIG;
+    if (strlen(cp) >= sizeof(motd)) {
+       code = E2BIG;
+       goto out;
+    }
     strcpy(motd, cp);
     storeStat.Mask = 0;
     if (volstat.MinQuota != -1) {
index febd634..cf97e73 100644 (file)
@@ -276,8 +276,10 @@ acl_Internalize(elist, acl)
     nextc++;                   /* now at the beginning of the entry list */
     for (i = 0; i < (*acl)->positive; i++) {
        int k;
-       if (sscanf(nextc, "%s\t%d\n", lnames.namelist_val[i], &k) != 2)
+       if (sscanf(nextc, "%s\t%d\n", lnames.namelist_val[i], &k) != 2) {
+           free(lnames.namelist_val);
            return (-1);
+       }
        (*acl)->entries[i].rights = k;
        nextc = strchr(nextc, '\n');
        nextc++;                /* 1 + index can cast ptr to integer */
@@ -287,8 +289,10 @@ acl_Internalize(elist, acl)
         i--, j++) {
        if (sscanf
            (nextc, "%s\t%d\n", lnames.namelist_val[j],
-            &((*acl)->entries[j].rights)) != 2)
+            &((*acl)->entries[j].rights)) != 2) {
+           free(lnames.namelist_val);
            return (-1);
+       }
        nextc = strchr(nextc, '\n');
        nextc++;
     }
index 6fd341e..205b2fe 100644 (file)
@@ -1447,6 +1447,7 @@ CheckPrDatabase(misc)
               misc->nforeigns, misc->ngroups);
     }
 
+    free(map);
     return code;
 }
 
index 6b4de58..ce71577 100644 (file)
@@ -457,6 +457,7 @@ CreateEntry(at, aname, aid, idflag, flag, oid, creator)
        strcpy(cellGroup, AUTHUSER_GROUP);
        strcat(cellGroup, atsign);
        pos = FindByName(at, cellGroup, &centry);
+       free(cellGroup);
        if (!pos)
            return PRBADNAM;
        code = pr_Read(at, 0, pos, &centry, sizeof(centry));
index 60ac69e..59965ba 100644 (file)
@@ -100,6 +100,7 @@ main(argc, argv)
        }
     }
     code = pr_Initialize(2, AFSDIR_CLIENT_ETC_DIRPATH, cellname);
+    free(cellname);
     if (code) {
        fprintf(stderr, "pr_Initialize failed .. exiting.\n");
        fprintf(stderr, "%s (%d).\n", pr_ErrorMsg(code), code);
index 08cd5f5..764a851 100644 (file)
@@ -77,6 +77,7 @@ main(argc, argv)
        }
     }
     code = pr_Initialize(2, AFSDIR_CLIENT_ETC_DIRPATH, cellname);
+    free(cellname);
     if (code) {
        fprintf(stderr, "pr_Initialize failed, code %d.\n", code);
        exit(1);
index 32b5771..bfb4ddf 100644 (file)
@@ -1699,6 +1699,7 @@ rx_GetCall(int tno, struct rx_service *cur_service, osi_socket * socketp)
            if (afs_termState == AFSOP_STOP_RXCALLBACK) {
                AFS_RXGUNLOCK();
                USERPRI;
+               rxi_Free(sq, sizeof(struct rx_serverQueueEntry));
                return (struct rx_call *)0;
            }
 #endif
index 447b007..61d0d06 100644 (file)
@@ -189,13 +189,17 @@ rxkad_NewClientSecurityObject(rxkad_level level,
     tcp->type |= rxkad_client;
     tcp->level = level;
     code = fc_keysched(sessionkey, tcp->keysched);
-    if (code)
+    if (code) {
+       rxi_Free(tsc, size);
        return 0;               /* bad key */
+    }
     memcpy((void *)tcp->ivec, (void *)sessionkey, sizeof(tcp->ivec));
     tcp->kvno = kvno;          /* key version number */
     tcp->ticketLen = ticketLen;        /* length of ticket */
-    if (tcp->ticketLen > MAXKTCTICKETLEN)
+    if (tcp->ticketLen > MAXKTCTICKETLEN) {
+       rxi_Free(tsc, size);
        return 0;               /* bad key */
+    }
     memcpy(tcp->ticket, ticket, ticketLen);
 
     LOCK_RXKAD_STATS rxkad_stats_clientObjects++;
index 87138fc..c12bc7e 100644 (file)
@@ -788,6 +788,7 @@ attach2(Error * ec, char *path, register struct VolumeHeader * header,
            vp->specialStatus = 0;
        Log("VAttachVolume: volume salvage flag is ON for %s; volume needs salvage\n", path);
        *ec = VSALVAGE;
+       FreeVolume(vp);
        return NULL;
     }
     if (programType == fileServer) {