From ef48d6343d9ac929a4a2ae88184f7801ace1e3d1 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 12 Jun 2008 14:33:36 +0000 Subject: [PATCH] windows-scache-hash-tables-20080612 LICENSE MIT Prevent corruption of the cm_data.scacheHashTablep lists when removing and then re-adding entries to the hash table. The cm_scache_t nextp fields were not being reset to NULL which permitted loops to be created. --- src/WINNT/afsd/cm_freelance.c | 1 + src/WINNT/afsd/cm_scache.c | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c index 873c61391..70290899f 100644 --- a/src/WINNT/afsd/cm_freelance.c +++ b/src/WINNT/afsd/cm_freelance.c @@ -405,6 +405,7 @@ int cm_reInitLocalMountPoints() { lscpp = &tscp->nextp, tscp = tscp->nextp) { if (tscp == scp) { *lscpp = scp->nextp; + scp->nextp = NULL; lock_ObtainWrite(&scp->rw); scp->flags &= ~CM_SCACHEFLAG_INHASH; lock_ReleaseWrite(&scp->rw); diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 9e6d17cfc..610bd08cc 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -68,6 +68,7 @@ void cm_RemoveSCacheFromHashTable(cm_scache_t *scp) lscpp = &tscp->nextp, tscp = tscp->nextp) { if (tscp == scp) { *lscpp = scp->nextp; + scp->nextp = NULL; scp->flags &= ~CM_SCACHEFLAG_INHASH; break; } @@ -749,8 +750,8 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, scp->dotdotFid.vnode=1; scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO); if (!(scp->flags & CM_SCACHEFLAG_INHASH)) { - scp->nextp=cm_data.scacheHashTablep[hash]; - cm_data.scacheHashTablep[hash]=scp; + scp->nextp = cm_data.scacheHashTablep[hash]; + cm_data.scacheHashTablep[hash] = scp; scp->flags |= CM_SCACHEFLAG_INHASH; } scp->refCount = 1; -- 2.39.5