From: Jeffrey Altman Date: Fri, 2 Feb 2007 15:44:12 +0000 (+0000) Subject: DEVEL15-windows-afsd-volume-ref-leak-20070202 X-Git-Tag: openafs-devel-1_5_15~49 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=5811b9a12638ae891ac85522b9c070f6f664a705;p=packages%2Fo%2Fopenafs.git 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) --- 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; }