From 5811b9a12638ae891ac85522b9c070f6f664a705 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 2 Feb 2007 15:44:12 +0000 Subject: [PATCH] DEVEL15-windows-afsd-volume-ref-leak-20070202 When looking up a volume by ID or Name, if the volume server data requires refreshing and the UpdateVolume operation failed, do not leak the refCount. (cherry picked from commit ab294cfdc5fa4108f89b37c4a7da5844872ecacf) --- src/WINNT/afsd/cm_volume.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 83ca3c1ac..261eabffb 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -377,7 +377,7 @@ long cm_GetVolumeByID(cm_cell_t *cellp, long volumeID, cm_user_t *userp, { cm_volume_t *volp; char volNameString[100]; - long code; + long code = 0; lock_ObtainWrite(&cm_volumeLock); for(volp = cm_data.allVolumesp; volp; volp=volp->nextp) { @@ -397,17 +397,18 @@ long cm_GetVolumeByID(cm_cell_t *cellp, long volumeID, cm_user_t *userp, if (volp) { lock_ObtainMutex(&volp->mx); + code = 0; if (volp->flags & CM_VOLUMEFLAG_RESET) { code = cm_UpdateVolume(cellp, userp, reqp, volp); - if (code == 0) { + if (code == 0) volp->flags &= ~CM_VOLUMEFLAG_RESET; - } } - else - code = 0; lock_ReleaseMutex(&volp->mx); - if (code == 0) + if (code == 0) *outVolpp = volp; + else + cm_PutVolume(volp); + return code; } @@ -423,11 +424,8 @@ long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep, long flags, cm_volume_t **outVolpp) { cm_volume_t *volp; - long code; + long code = 0; - /* initialize this */ - code = 0; - lock_ObtainWrite(&cm_volumeLock); for (volp = cm_data.allVolumesp; volp; volp=volp->nextp) { if (cellp == volp->cellp && strcmp(volumeNamep, volp->namep) == 0) { @@ -484,6 +482,9 @@ long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep, if (code == 0) *outVolpp = volp; + else + cm_PutVolume(volp); + lock_ReleaseMutex(&volp->mx); return code; } -- 2.39.5