Commit graph

6739 commits

Author SHA1 Message Date
Daniel Stenberg
d516628d14
curl: unify pointer names to global config
Use 'config' for pointing to a OperationConfig

Use 'global' for pointing to GlobalConfig

Bonus: add config_alloc(), an easier way to allocate + init a new
OperationConfig struct.

Closes #17888
2025-07-10 18:23:17 +02:00
Viktor Szakats
7ed9dac2f9
libtests: more header tidy-ups
- make `test*` sources include `first.h`, like all others.
- drop redundant `curlx/*` includes after the above.
- merge `test.h` into `first.h`, now that no other file uses it.
  (and `first.h` had almost no content.)
  To simplify and sync header structure with other tests.

Closes #17875
2025-07-09 20:29:50 +02:00
Viktor Szakats
a47695db33
test1499, 1599: use %LOGDIR
Fixing test 1599 also fixes these warnings in the test log:
```
Use of uninitialized value in join or string at /home/runner/work/curl/curl/tests/runner.pm line 774.
```
https://github.com/curl/curl/actions/runs/16157402085/job/45602590085?pr=17768#step:39:743

Assisted-by: Daniel Stenberg

Fixes #17871
Closes #17874
2025-07-09 13:52:18 +02:00
Viktor Szakats
784c17b7d9
tests: move curlcheck.h to libtest as unitcheck.h
To simplify dependencies, and sync tunits and units builds further.

`curlcheck.h` already depended on logic implemented within libtests:
it referenced a global variable (`unitfail`) defined in `first.c` and
declared in `test.h`.

Also:
- rename to `unitcheck.h` to indicate it's meant for unit tests.
- make `unitcheck.h` include `first.h` instead of `test.h`.
  This brings header use closer to libtests. It also includes
  `curlx/curlx.h` for all unit tests by default now.
- move `unitfail` declaration from `test.h` to `first.h`.
  To match its definition in `first.c`.
- drop now redundant per-test curlx header includes.

Closes #17868
2025-07-09 02:29:25 +02:00
Viktor Szakats
9db9137066
tests: fix 1301, 1308 to fail on error
They were using a macro designed for unit tests. It does not fail when
used in libtests. Make similar macros for these tests, and make them
return a failure.

Also:
- makes these two tests align with the rest of libtests, by including
  `first.h` instead of `curlcheck.h`.
- since libtests no longer need to depend on tests/unit, drop this
  dependency from build scripts.

Closes #17867
2025-07-09 00:55:28 +02:00
Viktor Szakats
8afb623bdd
windows: drop redundant curl_wcsdup_callback callback
This callback was permanently mapped to libcurl's internal
`Curl_wcsdup()`, which always uses the customizable malloc for
allocation, thus making a custom mapping redundant anyway.

To simplify, drop the callback and map `_tcsdup()` in Unicode mode
directly to `Curl_wcsdup()`.

Also fixes:
- `curl_global_init()` which, before this patch, (re)initialized its
  mapping to `_wcsdup()`, returning buffers potentially incompatible
  with a custom allocator.
  Bug: https://github.com/curl/curl/pull/17840#issuecomment-3044361245
  Bug: https://github.com/curl/curl/pull/7540#issuecomment-2380995349
  Co-reported-by: Luca Kellermann

Follow-up to 76e047fc27 #7540
Assisted-by: Jay Satiro

Closes #17843
2025-07-08 13:33:38 +02:00
Daniel Stenberg
8724306e78
runtests: support memory-limits per test
The idea here is to set limits per test how many allocations and maximum
amount of memory it is allowed to use. This is a means to make sure the
number and total size of allocations are kept in check and don't
mistakenly "blow up".

If runtests.pl detects that the given limits have been exceeded it fails
the test case with an error.

The `<verify>` part now supports `<limits>`, and in this section two
limits can be set for each test (verified in debug builds only):

    Allocations: [number of allocation calls]
    Maximum allocated: [maximum concurrent memory allocated]

Default limits (used if nothing is set in the test file):

    Allocations: 1000
    Maximum allocated: 1000000

Closes #17821
2025-07-08 10:14:45 +02:00
Christian Hesse
7d73c712f0
curl.h: make CURL_IPRESOLVE_* symbols defined as longs
... as `curl_easy_setopt()` expects them to be.

Also remove some casting workarounds.

Closes #17790
2025-07-07 14:37:12 +02:00
Carlos Henrique Lima Melara
790153c927
docs,tests: fix english grammar "allow to" -> "allow <something> to"
This was spotted by Debian's lintian tool. It adds an informational
warning at every run, so my OCD was kicking in and I had to fix it :-)

Closes #17787
2025-07-07 09:05:17 +02:00
Stefan Eissing
51f933801e
scorecard: flame graphs and documentation
Add `--flame` option to scorecard.py for generating flame graphs.
Add documentation in docs/internal/SCORECARD.md on how to use this.

Closes #17792
2025-07-07 09:04:22 +02:00
Stefan Eissing
2db8ae480f
quic: implement CURLINFO_TLS_SSL_PTR
Replace the old Curl_ssl_get_internals() with a new connection filter
query to retrieve the information. Implement that filter query for TCP
and QUIC TLS filter types.

Add tests in client tls_session_reuse to use the info option and check
that pointers are returned.

Reported-by: Larry Campbell
Fixes #17801
Closes #17809
2025-07-06 20:29:54 +02:00
Daniel Stenberg
81693c77be
unit3214: verify struct sizes
This test makes sure that a number of internal and public structs are
within their maximum allowed size limits.

The public structs can only grow in controlled ways, while the internal
ones may be allowed to grow if deemed right.

The idea here is to control, to know and make sure all important struct
growth is intentional.

Closes #17823
2025-07-06 20:28:21 +02:00
Daniel Stenberg
beb64e6f3f
tests: make all names < 75 characters long
- no need to make them long and complicated
- increases the chances of them looking better in terminal outputs

Closes #17824
2025-07-06 10:56:08 +02:00
Daniel Stenberg
9b61f81149
tests/http/requirements: remove multipart
This is not actually used.

Reported-by: defnull
URL: https://chaos.social/@defnull/114801392456999379

Closes #17825
2025-07-05 18:13:29 +02:00
Daniel Stenberg
bed49a0462
test1499: verify two chunked responses on reused connection
It triggered a memory leak back in 7.88.1

Closes #17815
2025-07-04 11:23:25 +02:00
Viktor Szakats
5fb10b5476
tool1621: drop unused internal libcurl headers
Closes #17811
2025-07-04 05:48:30 +02:00
Viktor Szakats
7ad985cad5
tests/unit: hook up unitprotos to the units-clang-tidy target
To make `ninja units-clang-tidy` target work without manually building
core components first.

Also rename the clang-tidy test target generator macro to align its name
with the built-in `add_custom_target()` function.

Follow-up to c9bb9cd165 #17750

Closes #17810
2025-07-03 23:49:25 +02:00
Viktor Szakats
73840836a5
tests: move GSS-API dynamic stub into debug-mode libcurl
Replace the `libstubgss.so`-based overload solution with one built into
libcurl at compile-time.

The previous, `LD_PRELOAD`-based, solution was non-portable, allowlisted
for Linux, BSD and Solaris. It also required non-debug builds, which
turned out to be an accidental condition:
7d342c723c. It also required a curl tool
built against a shared libcurl. Detecting this condition wasn't always
accurate, e.g. with certain cmake configurations.

The overload solution also didn't work on macOS, though it theoretically
should have:
- #17653
- #2394

Experiments on making the overload solution work in more envs:
- #17759
  That revealed that it also did not work on NetBSD, in CI.

The replacement solution is overloading the necessary GSS-API functions
for test 2056 and 2057 at compile time. It requires a debug-enabled curl
build (due to its insecure nature).

This makes these tests run on all platforms. Including most GSS jobs in
CI, that are running tests. (the exception is old-linux, non-debug jobs,
where it felt overkill to enable debug for this.)

The refactored GSS stub code needs to overload less than before because
it's free to use the official GSS API. (This didn't work with
the overload solution on Alpine for example). It can also use libcurl
functions, allowing to replace `snprintf()` with `msnprintf()`.

OS/400 is also overloading GSS API functions. I haven't tested how this
works after this PR. In theory it should, because this PR doesn't rely
on preprocessor overrides.

Note that for future GSS tests, it may be necessary to stub these GSS
API functions: `gss_inquire_context()`, `gss_unwrap()`, `gss_wrap()`.
They are on codepaths not (yet) touched by tests.

Also:
- stub-gss: check for token buffer overrun.
- stub-gss: replace size macros with `sizeof()`.
- GHA: enable debug for some jobs with GSS.
- GHA/linux: ignore results for 2056 and 2057 in the valgrind job.
  They leak the same way as seen with 2077 and 2078.
  Ref: 7020ba7979 #17462
  Ref: 146759716c #14430
- GHA/linux: fix to ignore `gss_import_name()` leaks in valgrind builds.
  only.
- lib/vauth/krb5_gssapi: reduce variable scope.
- lib/vauth/spnego_gssapi: reduce variable scope.
- tests/libtest: drop code and build logic dealing with `libstubgss`.
- runtests:
  - drop `ld_preload` feature.
  - drop special handling of `LD_PRELOAD` env in tests.
  - drop logic dealing with shared curl tool detection.
  - drop `LD_PRELOAD` envs from tests.

Follow-up to 56d949d31a #1687

Closes #17752
2025-07-01 00:17:15 +02:00
Daniel Stenberg
c9bb9cd165
unit tests: extract "private" prototypes at build time
In order to do unit tests for private functions, functions that are
marked UNITTEST but without a global scope in the library, functions
that do not have prototypes in their corresponding header file, unit
tests previously brought their own private prototype *copy* into the
unit test.

This was error-prone when the internal function changes but the change
might be missed in the unit test which then uses an outdated prototype
copy for testing.

This change removes the private prototypes from unit tests and instead
introduces a C file parser that parses the specific C files and extracts
the necessary unit test prototypes into a generated header file for unit
tests to use. This geneated lib/unitprotos.h header is then included by
unit tests that need private prototypes.

Assisted-by: Viktor Szakats
Closes #17750
2025-06-30 23:16:40 +02:00
Stefan Eissing
21ecc7e376
cf-socket: make socket data_pending a nop
Eliminating the socket readability check in the socket connection
filters for the 'data_pending' callback. Improves performance of
handling of transfers, up to ~30%, depending on parallelism and response
size.

Whatever `data_pending()` once was, its semantics are now:
"Is there anything buffered in the connection filters that needs
 receive?"
Any checks of the socket's readability are done via `multi_wait()`
and friends.

Fix the one place in HTTP/1 proxy code that checked `data_pending()` and
did an early return if false. Remove that check and actually try to
receive data every time.

Closes #17785
2025-06-30 13:44:24 +02:00
Viktor Szakats
f9656445ba
checksrc: reduce exceptions, apply again to curlx
- tests/libtest: move exception to `stub_gssapi.h`.
- tests/libtest: move remaining exception to `testtrace.c`.
- tests/server: drop obsolete exception.
- docs/examples: move `BANNEDFUNC` exceptions to local files (3 lines).
- docs/examples: move `ERRNOVAR` exception to `ephiperfifo.c`.
- docs/examples: drop `typedef struct` (8 files).
- lib/curlx: add `.checksrc` with banned funcs copied from lib.
- checksrc: ban `strncpy`, `strtok_r`, `strtoul` by default.
  Drop local bans. Add exception for `strtoul` to `tests/server'.
- lib, src: sync banned funcs.

Also:
- REUSE: drop `stunnel.pem`, it no longer exists.
- docs/examples: formatting.
- docs/examples: simplify some `sizeof()`s.

Closes #17764
2025-06-27 17:33:35 +02:00
Viktor Szakats
3f36e1e502
lib2082: drop typedef struct
To not need the checksrc exception `disable TYPEDEFSTRUCT`.

Follow-up to a517378de5 #7477

Closes #17763
2025-06-27 14:16:30 +02:00
Viktor Szakats
344ccb077c
tests/libtest: drop a checksrc exception
Follow-up to a0a1df5af9 #17414

Closes #17762
2025-06-27 14:16:21 +02:00
Stefan Eissing
d4983ffc13
bufq: change read/write signatures
Change the signature of `bufq` functions from

* `ssize_t Curl_bufq_*(..., CURLcode *err)` to
* `CURLcode Curl_bufq_*(..., size_t *pn)`

This allows us to write slightly less code and avoids the ssize_t/size_t
conversions in many cases. Also, it gets the function in line with all
the other send/recv signatures.

Added helper functions in `cfilters.h` for sending from/receving into
a bufq.

Fuzzer now fails to build due to these changes and its testing of
the bufq API.

Closes #17396
2025-06-27 14:16:21 +02:00
Viktor Szakats
7b0b03c057
runtests: fix LD_PRELOAD detection for cmake-built curl binaries
CMake builds by default don't include a triplet in the `curl -V` output,
but a CMake-specific OS string, which is usually capitalized or stylized,
e.g. "Linux", or "FreeBSD". Make the regexp expression case-insensitive
to handle this.

Follow-up to 171b623759 #17653

Closes #17756
2025-06-27 00:24:13 +02:00
Viktor Szakats
f37d5f42f2
tests: fix BUNDLE variable references in Makefile.am
Bug: https://github.com/curl/curl/pull/17750/files#diff-0c866a04cf144e1595f64820c652daaa923358d4de1b30ca8baf85c70ec12a2dR83

Closes #17751
2025-06-26 10:55:47 +02:00
Viktor Szakats
1679802b3a
tests: use %b64[] to base64 data in 2056, 2057
Follow-up to 63011ac638 #17721

Closes #17748
2025-06-26 10:20:43 +02:00
Viktor Szakats
53c88435d8
build: split .c and .h file lists in tests
It allows to pass `.h` files only where they are really needed, which is
`EXTRA_DIST` (or `*SOURCES`) for autotools.

Also:
- rename variables to be shorter and consistent.
- drop references to non-local headers. We don't need to pass them as
  dist sources.
- drop empty variables and references, after the above.
- server: add placeholder `UTIL_H`.

Closes #17745
2025-06-26 10:20:41 +02:00
Daniel Stenberg
d22057d78b
lib: address singleuse issues
- markup some functions UNITTEST, so that they are static unless in a
  unit test build

- make some functions #ifdef UNITTESTS as they are only used from unit
  tests

- adjusted unit tests accordingly to use local prototypes for functions
  not global in the library

Closes #17734
2025-06-25 11:46:26 +02:00
Daniel Stenberg
b5593a6fe0
urlapi: use uppercase hex encoding
For consistency. RFC 3986 section 2.1 says:

  "URI producers and normalizers should use uppercase hexadecimal digits
  for all percent-encodings."

Reported-by: Jeroen Ooms
Fixes #17685
Closes #17739
2025-06-25 11:44:13 +02:00
Daniel Stenberg
4c5672774f
runtests.pl: fix sprintf() using one too many %s
Closes #17740
2025-06-25 11:27:32 +02:00
Viktor Szakats
26326c5297
build: stubgss tidy-ups (in tests)
- cmake: avoid running clang-tidy twice.
- autotools: do not pass curl/libtest-specific macros.

Also:
- autotools: drop `CFLAG_CURL_SYMBOL_HIDING` from libtests.
   Unused since 09437d8cd4 #14695

Closes #17738
2025-06-25 09:57:06 +02:00
Viktor Szakats
f4649425f2
build: fix libcurltool with cmake and tunits, related tidy-ups
Sync how libcurltool is built in different modes and build systems.

cmake:
- build libcurltool with curlx when building shared libcurl.
  To make it possible to use standard libcurl when linking tunits.
  Also syncing this with autotools.
  The remaining difference is that cmake allows to select shared or
  static for curl tool and tests/examples independently.
- fix to link with libcurl instead of libcurlu.
  To sync with autotools and to link with the standard libcurl for
  tool unit tests.
- fix `source_group()` to always include curlx sources.
- add missing 'curlx header files' source group.

autotools:
- build libcurltool without curlx when building static libcurl in
  non-unity builds.
  To avoid double compilation, just to be thrown away at link time.
  Also to sync with unity builds.

both:
- sync source order between autotools and cmake.
- make sure to pass all headers with both autotools and cmake.
  This is a no-op with cmake. Maybe a future patch should make sure
  to not pass those to remove that noise.

Ref: #17696

Closes #17727
2025-06-25 09:57:06 +02:00
Viktor Szakats
1ec0da0149
tests: constify, make consts static
- lib509: constify an input string.
- add `static` to const data, where missing.
- tool1394: fix indentation.

Closes #17736
2025-06-25 09:57:06 +02:00
Viktor Szakats
db512ee267
tests/server: move memory init to memptr.c
To sync with tests/libtest.

Closes #17735
2025-06-25 01:37:56 +02:00
Viktor Szakats
04e90d4814
mk-lib1521: replace printf with curl_mprintf
Ref: #17731

Closes #17732
2025-06-25 01:37:56 +02:00
Stefan Eissing
e80c893254
multi: xfer table/bitset, handle limits
* calculate capacity growth on multi's xfer table and bitsets to
  work correctly when approaching UINT_MAX
* uint-bset: track the first 64bit slot used. This avoids slot scans
  on empty sets.
* uint-tbl: remove restriction to grow ot UINT_MAX, it is multi's
  job to enforce limits suitable for its use
* test751: use curl_mfprintf() for error messages

Closes #17731
2025-06-24 15:02:52 +02:00
Daniel Stenberg
65f8253336
bufq: remove the unused Curl_bufq_unwrite function
Follow-up to 02edae54e8

Closes #17730
2025-06-24 10:56:54 +02:00
Viktor Szakats
c4f9487089
tidy-up: replace <memdebug.h> with "memdebug.h" (src, units)
Closes #17722
2025-06-24 09:44:28 +02:00
Daniel Stenberg
c0cb3485fe
unit1302: expand the base64 encode/decode tests
Closes #17726
2025-06-24 07:55:16 +02:00
Viktor Szakats
bb50dee510
tests/server: de-dupe/merge three sockdaemon() clones into one
Also: tidy up `if()` expressions here and there.

Follow-up to f4f25505df #15000

Closes #17719
2025-06-23 17:02:43 +02:00
Viktor Szakats
1a70977a83
build: drop explicit curlx from hdr paths, refer headers with curlx/ prefix
To make all src and test code refer to curlx headers the same way.

Also:
- src: move `curlx.h` include to `tool_setup.h`.
- src/tool_setup.h: drop stray `curlx/timeval.h`.
- servers: de-duplicate `curlx.h` and `curl_setup.h` includes.
- libtests, units: drop stray curlx sub-headers in favor of
  `<curlx/curlx.h>`.
- tests: include `curlx.h` with `<>` instead of `""`. To match
  other parts of the codebase.

Closes #17680
2025-06-23 17:02:43 +02:00
Daniel Stenberg
63011ac638
tests: use %b64[] to base64 data
... instead of storing the data base64 encoded.

Closes #17721
2025-06-23 16:47:14 +02:00
Viktor Szakats
2636828eee
tests: drop unused or redundant includes
Closes #17717
2025-06-23 13:49:03 +02:00
Stefan Eissing
c7a6319698
multi: clear the dirty set of transfers no longer processing
When a transfer is no longer processed, it might still apear in the
dirty bitset. Clear the dirty bit when this condition is encountered.

Closes #17718
2025-06-23 13:36:33 +02:00
Viktor Szakats
6425ce47df
tests/libtest: use curltime from curlx
Replacing the local implementation.

Closes #17716
2025-06-23 11:29:41 +02:00
Viktor Szakats
a2de3f08e3
tests/libtest: call curlx_now_init() for unit 1399, 2600 (Windows)
Follow-up to 35d0c047ce #17641

Closes #17714
2025-06-23 10:55:31 +02:00
Daniel Stenberg
aed828cc51
tests/dnsd: read config from file
Make the <dns> tag in a test case control what is stored there. Also
documented. Make test 2102 and 2103 use the new tag.

Lets the test case config the A and AAAA contents the server replies
with. Initial work for the HTTPS RR exists, but does not yet work.

Closes #17543
2025-06-23 08:24:09 +02:00
Viktor Szakats
85bf8b19ac
cmake: sync tests scripts with each other and autotools (more)
Closes #17711
2025-06-22 23:42:14 +02:00
Viktor Szakats
e088e10454
cmake: replace the way clang-tidy verifies tests, fix issues found
Replace existing `mk-unity.pl` `--embed` workaround with running
`clang-tidy` manually on individual test source instead. This aligns
with how clang-tidy works and removes `mk-unity.pl` from the solution.

Also:
- mqttd: fix potentially uninitialized buffer by zero filling it.
  ```
  tests/server/mqttd.c:484:41: error: The left operand of '<<' is a garbage value
    [clang-analyzer-core.UndefinedBinaryOperatorResult,-warnings-as-errors]
    484 |       payload_len = (size_t)(buffer[10] << 8) | buffer[11];
        |                                         ^
  [...]
  tests/server/mqttd.c:606:45: error: The left operand of '<<' is a garbage value
    [clang-analyzer-core.UndefinedBinaryOperatorResult,-warnings-as-errors]
    606 |       topiclen = (size_t)(buffer[1 + bytes] << 8) | buffer[2 + bytes];
        |                                             ^
  ```
- sockfilt: fix potential out-of-bound pointer:
  ```
  tests/server/sockfilt.c:1128:33: error: The 2nd argument to 'send' is a buffer
     with size 17010 but should be a buffer with size equal to or greater than
     the value of the 3rd argument (which is 18446744073709551615)
     [clang-analyzer-unix.StdCLibraryFunctions,-warnings-as-errors]
   1128 |         ssize_t bytes_written = swrite(sockfd, buffer, buffer_len);
        |                                 ^
  ```
- clang-tidy: suppress bogus `bzero()` warnings that happens
  inside the notorious `FD_ZERO()` macros, on macOS.

Ref: https://github.com/curl/curl/pull/17680#issuecomment-2991730158

Closes #17705
2025-06-22 23:08:46 +02:00