altsvc: cap the list at 5,000 entries

Avoid never-ending growth.

When adding more entries, it now deletes the first entry in the list,
which is the oldest added entry still held in memory. I decided to avoid
a Least Recently Used concept as I suspect with a list with this many
entries most entries have not been used, and we don't save the timestamp
of recent use anyway.

The net effect might (no matter what) be that the removed entry might
feel a bit "random" in the eyes of the user.

Verify with test 1669.

Reported-by: Geeknik Labs
Fixes #21183
Closes #21189
This commit is contained in:
Daniel Stenberg 2026-04-01 09:53:42 +02:00
parent c1963e2d2c
commit 0805ec043e
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
6 changed files with 118 additions and 7 deletions

View file

@ -41,7 +41,7 @@ TESTS_C = \
unit1636.c \
unit1650.c unit1651.c unit1652.c unit1653.c unit1654.c unit1655.c unit1656.c \
unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c \
unit1666.c unit1667.c unit1668.c \
unit1666.c unit1667.c unit1668.c unit1669.c \
unit1979.c unit1980.c \
unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c \
unit3200.c unit3205.c \

58
tests/unit/unit1669.c Normal file
View file

@ -0,0 +1,58 @@
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at https://curl.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* SPDX-License-Identifier: curl
*
***************************************************************************/
#include "unitcheck.h"
#include "urldata.h"
#include "altsvc.h"
static CURLcode test_unit1669(const char *arg)
{
UNITTEST_BEGIN_SIMPLE
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_ALTSVC)
char outname[256];
CURL *curl;
CURLcode result;
struct altsvcinfo *asi = Curl_altsvc_init();
abort_if(!asi, "Curl_altsvc_init");
result = Curl_altsvc_load(asi, arg);
fail_if(result, "Curl_altsvc_load");
if(result)
goto fail;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
fail_if(!curl, "curl_easy_init");
if(!curl)
goto fail;
fail_unless(Curl_llist_count(&asi->list) == MAX_ALTSVC_ENTRIES,
"wrong number of entries");
curl_msnprintf(outname, sizeof(outname), "%s-out", arg);
curl_easy_cleanup(curl);
fail:
Curl_altsvc_cleanup(&asi);
#endif
UNITTEST_END(curl_global_cleanup())
}