From: Amos Jeffries Date: Sun, 11 Apr 2010 11:29:02 +0000 (+1200) Subject: Resolve assert in cacheCleanup X-Git-Tag: SQUID_3_2_0_1~167^2~29 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4ee6f98475f2f3f7993a6d900b5d0c73bcf9f3ed;p=thirdparty%2Fsquid.git Resolve assert in cacheCleanup --- diff --git a/src/auth/Gadgets.h b/src/auth/Gadgets.h index 96da2c09a8..bad1fe726d 100644 --- a/src/auth/Gadgets.h +++ b/src/auth/Gadgets.h @@ -46,19 +46,18 @@ class AuthUser; * This is used to link auth_users into the username cache. * Because some schemes may link in aliases to a user, * the link is not part of the AuthUser structure itself. - * - \todo Inheritance in a struct? this should be a class. */ -struct AuthUserHashPointer : public hash_link { +class AuthUserHashPointer : public hash_link { /* first two items must be same as hash_link */ public: - static void removeFromCache(void *anAuthUserHashPointer); MEMPROXY_CLASS(AuthUserHashPointer); - AuthUserHashPointer(AuthUser::Pointer ); + AuthUserHashPointer(AuthUser::Pointer); + ~AuthUserHashPointer() { auth_user = NULL; }; AuthUser::Pointer user() const; + static void removeFromCache(void *anAuthUserHashPointer); private: AuthUser::Pointer auth_user; diff --git a/src/auth/User.cc b/src/auth/User.cc index 0b1a8d8e2a..d8732ea09f 100644 --- a/src/auth/User.cc +++ b/src/auth/User.cc @@ -165,12 +165,9 @@ AuthUser::~AuthUser() assert(RefCountCount() == 0); /* were they linked in by username ? */ - if (usernamehash) { - assert(usernamehash->user() == this); debugs(29, 5, "AuthUser::~AuthUser: removing usernamehash entry '" << usernamehash << "'"); - hash_remove_link(proxy_auth_username_cache, - (hash_link *) usernamehash); + hash_remove_link(proxy_auth_username_cache, (hash_link *) usernamehash); /* don't free the key as we use the same user string as the auth_user * structure */ delete usernamehash; @@ -274,6 +271,9 @@ AuthUser::cacheCleanup(void *datanotused) * and re-using current valid credentials. */ hash_remove_link(proxy_auth_username_cache, usernamehash); + /* resolve the circular references of AuthUserHashPointer<->AuthUser by cutting before deleting. */ + if(auth_user->usernamehash == usernamehash) + auth_user->usernamehash = NULL; delete usernamehash; } }