--- cache.c 2005-10-17 16:27:14.042507000 +0200 +++ cache.new.c 2005-10-17 16:26:58.767829104 +0200 @@ -204,10 +204,9 @@ int cache_lookup(const char *user, const * Get the offset into the hash table and the md5 sum of * the password. **************************************************************/ - strlcpy(userrealmserv, user, sizeof(userrealmserv)); - strlcat(userrealmserv, realm, sizeof(userrealmserv)); - strlcat(userrealmserv, service, sizeof(userrealmserv)); + //DOM strlcat(userrealmserv, realm, sizeof(userrealmserv)); + //DOM strlcat(userrealmserv, service, sizeof(userrealmserv)); hash_offset = cache_pjwhash(userrealmserv); @@ -242,11 +241,20 @@ int cache_lookup(const char *user, const high_bucket = low_bucket + CACHE_MAX_BUCKETS_PER; for (ref_bucket = low_bucket; ref_bucket < high_bucket; ref_bucket++) { - if (strcmp(user, ref_bucket->creds + ref_bucket->user_offt) == 0 && \ - strcmp (realm, ref_bucket->creds + ref_bucket->realm_offt) == 0 && \ - strcmp(service, ref_bucket->creds + ref_bucket->service_offt) == 0) { - read_bucket = ref_bucket; - break; + /* ignore obsolete entry */ + if(ref_bucket->created < epoch_timeout){ + continue; + } + /* Do not compare service just login@realm and passw */ + if (strcmp(user, ref_bucket->creds + ref_bucket->user_offt) == 0 ) { + if (memcmp(pwd_digest, ref_bucket->pwd_digest, 16) == 0) { + if (flags & VERBOSE) + logger(L_DEBUG, L_FUNC, debug, user, realm, service, "found with valid passwd"); + cache_un_lock(hash_offset); + table_stats->hits++; + return CACHE_OK; + } + } } @@ -259,30 +267,10 @@ int cache_lookup(const char *user, const * best bucket to place the new entry (CACHE_FLUSH_WITH_RESCAN). **************************************************************/ - if (read_bucket != NULL && read_bucket->created > epoch_timeout) { - - if (memcmp(pwd_digest, read_bucket->pwd_digest, 16) == 0) { - - if (flags & VERBOSE) - logger(L_DEBUG, L_FUNC, debug, user, realm, service, "found with valid passwd"); - - cache_un_lock(hash_offset); - table_stats->hits++; - return CACHE_OK; - } - - if (flags & VERBOSE) - logger(L_DEBUG, L_FUNC, debug, user, realm, service, "found with invalid passwd, update pending"); - - result->status = CACHE_FLUSH; - - } else { - if (flags & VERBOSE) logger(L_DEBUG, L_FUNC, debug, user, realm, service, "not found, update pending"); result->status = CACHE_FLUSH_WITH_RESCAN; - } result->hash_offset = hash_offset; result->read_bucket = read_bucket; @@ -314,6 +302,7 @@ void cache_commit(struct cache_result *r struct bucket *ref_bucket; struct bucket *low_bucket; struct bucket *high_bucket; + time_t oldest; if (!(flags & CACHE_ENABLED)) return; @@ -338,9 +327,16 @@ void cache_commit(struct cache_result *r high_bucket = low_bucket + CACHE_MAX_BUCKETS_PER; write_bucket = low_bucket; + oldest=write_bucket->created; for (ref_bucket = low_bucket; ref_bucket < high_bucket; ref_bucket++) { - if (ref_bucket->created < write_bucket->created) + if (ref_bucket->created + table_timeout < write_bucket->created) { write_bucket = ref_bucket; + break; + } + if (ref_bucket->created < oldest){ + write_bucket = ref_bucket; + oldest=ref_bucket->created; + } } }