mirror of
https://github.com/curl/curl.git
synced 2026-07-22 01:37:16 +03:00
As reported in the bug: > On a 32-bit architecture (i386): > 1. `chunks * chunk_size` evaluates to `unsigned int` (32-bit > unsigned). > 2. Due to Usual Arithmetic Conversions in C, the signed `-1` (int) > operand of the ternary operator is promoted to `unsigned int`, > yielding `4294967295` (0xFFFFFFFF). > 3. The ternary operator returns `4294967295` as an `unsigned int`. > 4. This unsigned value is then assigned to `r->clength` (apr_off_t, > 64-bit signed). Since the source is unsigned, it is zero-extended, > resulting in `r->clength` becoming `+4294967295`. > 5. The subsequently executed check `if(r->clength >= 0)` evaluates to > true. > 6. Inside the block, `apr_ltoa(r->pool, (long)r->clength)` casts it to > a 32-bit signed `long` (on 32-bit platforms), which truncates it > back to `-1`, formatting it as "-1" and sending the > "Content-Length: -1" header. > > On a 64-bit architecture (amd64), `size_t` is 64-bit, and `-1` (32-bit > int) is promoted to `unsigned long` (64-bit), yielding > `18446744073709551615`. When assigned to `r->clength` (64-bit signed), > it wraps back to `-1`, which correctly skips the Content-Length > generation. > > This type promotion mismatch can be safely fixed by avoiding the > signed/unsigned mixture in the ternary operator. Origin: debian, https://bugs.debian.org/1140793 Bug-Debian: https://bugs.debian.org/1140793 These are standard Debian patches' trailers, I can get rid of then if you prefer. I've tested the fix using [debusine on i386 runner](https://debusine.debian.net/debian/developers/artifact/4083252/raw/log): > 782s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.0] PASSED [ 17%] > 782s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.1] PASSED [ 18%] > 782s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[h2] PASSED [ 18%] Versus the [i386 run in Debian's infrastructure](https://debusine.debian.net/debian/developers/artifact/4084220/raw/log): > 2690s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.0] FAILED [ 17%] > 2690s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[http/1.1] PASSED [ 18%] > 2690s tests/http/test_05_errors.py::TestErrors::test_05_04_unclean_tls_shutdown[h2] PASSED [ 18%] Closes #22210 |
||
|---|---|---|
| .. | ||
| testenv | ||
| .gitignore | ||
| CMakeLists.txt | ||
| config.ini.in | ||
| conftest.py | ||
| Makefile.am | ||
| requirements.txt | ||
| scorecard.py | ||
| test_01_basic.py | ||
| test_02_download.py | ||
| test_03_goaway.py | ||
| test_04_stuttered.py | ||
| test_05_errors.py | ||
| test_06_eyeballs.py | ||
| test_07_upload.py | ||
| test_08_caddy.py | ||
| test_09_push.py | ||
| test_10_proxy.py | ||
| test_11_unix.py | ||
| test_12_reuse.py | ||
| test_13_proxy_auth.py | ||
| test_14_auth.py | ||
| test_15_tracing.py | ||
| test_16_info.py | ||
| test_17_ssl_use.py | ||
| test_18_methods.py | ||
| test_19_shutdown.py | ||
| test_20_websockets.py | ||
| test_21_resolve.py | ||
| test_22_httpsrr.py | ||
| test_30_vsftpd.py | ||
| test_31_vsftpds.py | ||
| test_32_ftps_vsftpd.py | ||
| test_40_socks.py | ||
| test_50_scp.py | ||
| test_51_sftp.py | ||
| test_60_h3_proxy.py | ||