From 6f22e163a5e79df4ce96d7234a634fc717fa1e4a Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Sun, 18 Apr 2004 07:13:47 +0000 Subject: [PATCH] memory-leak-fixes-20040417 Fix some memory leaks. --- src/afs/afs_pioctl.c | 33 ++++++++++++++++++++++----------- src/libacl/aclprocs.c | 8 ++++++-- src/ptserver/db_verify.c | 1 + src/ptserver/ptutils.c | 1 + src/ptserver/readgroup.c | 1 + src/ptserver/readpwd.c | 1 + src/rx/rx.c | 1 + src/rxkad/rxkad_client.c | 8 ++++++-- src/vol/volume.c | 1 + 9 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index 8586d014b..f9555d02a 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -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) { diff --git a/src/libacl/aclprocs.c b/src/libacl/aclprocs.c index febd634a8..cf97e73a1 100644 --- a/src/libacl/aclprocs.c +++ b/src/libacl/aclprocs.c @@ -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++; } diff --git a/src/ptserver/db_verify.c b/src/ptserver/db_verify.c index 6fd341e78..205b2fe6c 100644 --- a/src/ptserver/db_verify.c +++ b/src/ptserver/db_verify.c @@ -1447,6 +1447,7 @@ CheckPrDatabase(misc) misc->nforeigns, misc->ngroups); } + free(map); return code; } diff --git a/src/ptserver/ptutils.c b/src/ptserver/ptutils.c index 6b4de58c7..ce7157768 100644 --- a/src/ptserver/ptutils.c +++ b/src/ptserver/ptutils.c @@ -457,6 +457,7 @@ CreateEntry(at, aname, aid, idflag, flag, oid, creator) strcpy(cellGroup, AUTHUSER_GROUP); strcat(cellGroup, atsign); pos = FindByName(at, cellGroup, ¢ry); + free(cellGroup); if (!pos) return PRBADNAM; code = pr_Read(at, 0, pos, ¢ry, sizeof(centry)); diff --git a/src/ptserver/readgroup.c b/src/ptserver/readgroup.c index 60ac69e20..59965ba20 100644 --- a/src/ptserver/readgroup.c +++ b/src/ptserver/readgroup.c @@ -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); diff --git a/src/ptserver/readpwd.c b/src/ptserver/readpwd.c index 08cd5f5f0..764a85126 100644 --- a/src/ptserver/readpwd.c +++ b/src/ptserver/readpwd.c @@ -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); diff --git a/src/rx/rx.c b/src/rx/rx.c index 32b57713f..bfb4ddf59 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -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 diff --git a/src/rxkad/rxkad_client.c b/src/rxkad/rxkad_client.c index 447b007ef..61d0d06bc 100644 --- a/src/rxkad/rxkad_client.c +++ b/src/rxkad/rxkad_client.c @@ -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++; diff --git a/src/vol/volume.c b/src/vol/volume.c index 87138fca2..c12bc7e2d 100644 --- a/src/vol/volume.c +++ b/src/vol/volume.c @@ -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) { -- 2.39.5