Module Name: src Committed By: christos Date: Fri Dec 29 00:55:46 UTC 2023
Modified Files: src/external/bsd/fetch/dist/libfetch: common.c Log Message: PR/57179: Christof Meerwald: Fix bugs in fetch_cache_{get,put}. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/external/bsd/fetch/dist/libfetch/common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/fetch/dist/libfetch/common.c diff -u src/external/bsd/fetch/dist/libfetch/common.c:1.4 src/external/bsd/fetch/dist/libfetch/common.c:1.5 --- src/external/bsd/fetch/dist/libfetch/common.c:1.4 Tue Jan 24 03:02:57 2023 +++ src/external/bsd/fetch/dist/libfetch/common.c Thu Dec 28 19:55:46 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: common.c,v 1.4 2023/01/24 08:02:57 mlelstv Exp $ */ +/* $NetBSD: common.c,v 1.5 2023/12/29 00:55:46 christos Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * Copyright (c) 2008, 2010 Joerg Sonnenberger <jo...@netbsd.org> @@ -368,7 +368,9 @@ fetch_cache_get(const struct url *url, i { conn_t *conn, *last_conn = NULL; - for (conn = connection_cache; conn; conn = conn->next_cached) { + for (conn = connection_cache; conn; last_conn = conn, + conn = conn->next_cached) + { if (conn->cache_url->port == url->port && strcmp(conn->cache_url->scheme, url->scheme) == 0 && strcmp(conn->cache_url->host, url->host) == 0 && @@ -395,7 +397,7 @@ fetch_cache_get(const struct url *url, i void fetch_cache_put(conn_t *conn, int (*closecb)(conn_t *)) { - conn_t *iter, *last; + conn_t *iter, *last, *oiter; int global_count, host_count; if (conn->cache_url == NULL || cache_global_limit == 0) { @@ -405,20 +407,25 @@ fetch_cache_put(conn_t *conn, int (*clos global_count = host_count = 0; last = NULL; - for (iter = connection_cache; iter; - last = iter, iter = iter->next_cached) { + for (iter = connection_cache; iter; ) { ++global_count; if (strcmp(conn->cache_url->host, iter->cache_url->host) == 0) ++host_count; if (global_count < cache_global_limit && host_count < cache_per_host_limit) - continue; - --global_count; - if (last != NULL) - last->next_cached = iter->next_cached; - else - connection_cache = iter->next_cached; - (*iter->cache_close)(iter); + oiter = NULL; + else { + --global_count; + if (last != NULL) + last->next_cached = iter->next_cached; + else + connection_cache = iter->next_cached; + oiter = iter; + } + last = iter; + iter = iter->next_cached; + if (oiter) + (*oiter->cache_close)(oiter); } conn->cache_close = closecb;