Commit Graph

13472 Commits

Author SHA1 Message Date
Ciro Spaciari
ccf021fab9 Merge branch 'ciro/fetch-upgrade' into ciro/fetch-upgrade-node-http 2025-09-04 15:22:02 -07:00
Ciro Spaciari
8df4827833 we need to close at some point 2025-09-04 15:21:53 -07:00
Ciro Spaciari
0609fa5122 dont break stuff 2025-09-04 15:21:53 -07:00
Ciro Spaciari
ed21db9414 opsie 2025-09-04 15:21:53 -07:00
Ciro Spaciari
8727416808 more generic 2025-09-04 15:21:53 -07:00
autofix-ci[bot]
c7f6623878 [autofix.ci] apply automated fixes 2025-09-04 15:21:53 -07:00
Ciro Spaciari
1503715c0e ok 2025-09-04 15:21:53 -07:00
Ciro Spaciari
4cbe315002 Merge branch 'ciro/fetch-upgrade' into ciro/fetch-upgrade-node-http 2025-09-04 15:21:38 -07:00
Ciro Spaciari
fbdde3a89c we need to close at some point 2025-09-04 15:21:11 -07:00
Meghan Denny
5b7fd9ed0e node:_http_server: implement Server.prototype.closeIdleConnections (#22234) 2025-09-04 15:18:31 -07:00
autofix-ci[bot]
ed037cece0 [autofix.ci] apply automated fixes 2025-09-04 22:14:29 +00:00
Ciro Spaciari
e2767b970d dont break stuff 2025-09-04 15:07:34 -07:00
Ciro Spaciari
68c5a293eb opsie 2025-09-04 15:07:34 -07:00
Ciro Spaciari
6b5e41a0b3 more generic 2025-09-04 15:07:34 -07:00
autofix-ci[bot]
50bc82a97e [autofix.ci] apply automated fixes 2025-09-04 15:07:34 -07:00
Ciro Spaciari
345666b194 ok 2025-09-04 15:07:34 -07:00
Ciro Spaciari
01785cf3b7 experiment 2025-09-04 15:06:20 -07:00
Jarred Sumner
ed9353f95e gitignore the sources text files (#22408)
### What does this PR do?

### How did you verify your code works?

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-04 14:59:35 -07:00
Jarred Sumner
4573b5b844 run prettier 2025-09-04 14:45:18 -07:00
Marko Vejnovic
5a75bcde13 (#19041): Enable connecting to different databases within Redis (#22385)
### What does this PR do?

Enable connecting to different databases for Redis.

### How did you verify your code works?

Unit tests were added.

### Credits

Thank you very much @HeyItsBATMAN for your original PR. I've made
extremely slight changes to your PR. I apologize for it taking so long
to review and merge your PR.

---------

Co-authored-by: Kai Niebes <kai.niebes@outlook.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-04 14:25:22 -07:00
Meghan Denny
afc5f50237 build: fix ZigSources.txt line endings (#22398) 2025-09-04 14:22:49 -07:00
autofix-ci[bot]
56f1d991cc [autofix.ci] apply automated fixes (attempt 3/3) 2025-09-04 20:05:33 +00:00
autofix-ci[bot]
0853c555b2 [autofix.ci] apply automated fixes (attempt 2/3) 2025-09-04 20:03:03 +00:00
autofix-ci[bot]
ae42b8f045 [autofix.ci] apply automated fixes 2025-09-04 20:01:32 +00:00
Ciro Spaciari
e5abcf45ef dont break stuff 2025-09-04 12:59:30 -07:00
autofix-ci[bot]
0e8f4ba114 [autofix.ci] apply automated fixes (attempt 3/3) 2025-09-04 19:31:15 +00:00
autofix-ci[bot]
efda53ea6f [autofix.ci] apply automated fixes (attempt 2/3) 2025-09-04 19:29:16 +00:00
autofix-ci[bot]
d561b17b46 [autofix.ci] apply automated fixes 2025-09-04 19:27:41 +00:00
Ciro Spaciari
1dc1d4795e opsie 2025-09-04 12:25:02 -07:00
autofix-ci[bot]
1cef7f29e9 [autofix.ci] apply automated fixes (attempt 3/3) 2025-09-04 17:44:24 +00:00
autofix-ci[bot]
c38d674cbf [autofix.ci] apply automated fixes (attempt 2/3) 2025-09-04 17:42:40 +00:00
autofix-ci[bot]
e75b9aa01b [autofix.ci] apply automated fixes 2025-09-04 17:40:37 +00:00
Ciro Spaciari
8ad5f0bb57 more generic 2025-09-04 10:37:51 -07:00
autofix-ci[bot]
f51aed3f40 [autofix.ci] apply automated fixes 2025-09-04 10:37:51 -07:00
Ciro Spaciari
b1990a484f ok 2025-09-04 10:37:51 -07:00
Meghan Denny
ca8d8065ec node: tidy http2 and add missing error codes 2025-09-03 22:17:57 -07:00
Zack Radisic
0bcb3137d3 Fix bundler assertion failure (#22387)
### What does this PR do?

Fixes "panic: Internal assertion failure: total_insertions (N) !=
output_files.items.len (N)"

Fixes #22151
2025-09-03 21:18:00 -07:00
Ciro Spaciari
b79bbfe289 fix(Bun.SQL) fix SSLRequest (#22378)
### What does this PR do?
Fixes https://github.com/oven-sh/bun/issues/22312
Fixes https://github.com/oven-sh/bun/issues/22313

The correct flow for TLS handshaking is:

Server sending
[Protocol::Handshake](https://dev.mysql.com/doc/dev/mysql-server/8.4.5/page_protocol_connection_phase_packets_protocol_handshake.html)
Client replying with
[Protocol::SSLRequest:](https://dev.mysql.com/doc/dev/mysql-server/8.4.5/page_protocol_connection_phase_packets_protocol_ssl_request.html)
The usual SSL exchange leading to establishing SSL connection
Client sends
[Protocol::HandshakeResponse:](https://dev.mysql.com/doc/dev/mysql-server/8.4.5/page_protocol_connection_phase_packets_protocol_handshake_response.html)

<img width="460" height="305" alt="Screenshot 2025-09-03 at 15 02 25"
src="https://github.com/user-attachments/assets/091bbc54-75bc-44ac-98b8-5996e8d69ed8"
/>

Source:
https://dev.mysql.com/doc/dev/mysql-server/8.4.5/page_protocol_connection_phase.html

### How did you verify your code works?
Tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-03 18:59:15 -07:00
robobun
72490281e5 fix: handle empty chunked gzip responses correctly (#22360)
## Summary
Fixes #18413 - Empty chunked gzip responses were causing `Decompression
error: ShortRead`

## The Issue
When a server sends an empty response with `Content-Encoding: gzip` and
`Transfer-Encoding: chunked`, Bun was throwing a `ShortRead` error. This
occurred because the code was checking if `avail_in == 0` (no input
data) and immediately returning an error, without attempting to
decompress what could be a valid empty gzip stream.

## The Fix
Instead of checking `avail_in == 0` before calling `inflate()`, we now:
1. Always call `inflate()` even when `avail_in == 0` 
2. Check the return code from `inflate()`
3. If it returns `BufError` with `avail_in == 0`, then we truly need
more data and return `ShortRead`
4. If it returns `StreamEnd`, it was a valid empty gzip stream and we
finish successfully

This approach correctly distinguishes between "no data yet" and "valid
empty gzip stream".

## Why This Works
- A valid empty gzip stream still has headers and trailers (~20 bytes)
- The zlib `inflate()` function can handle empty streams correctly  
- `BufError` with `avail_in == 0` specifically means "need more input
data"

## Test Plan
 Added regression test in `test/regression/issue/18413.test.ts`
covering:
- Empty chunked gzip response
- Empty non-chunked gzip response  
- Empty chunked response without gzip

 Verified all existing gzip-related tests still pass
 Tested with the original failing case from the issue

🤖 Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-09-03 18:57:39 -07:00
Ciro Spaciari
60ab798991 fix(Bun.SQL) fix timers test and disable describeWithContainer on macos (#22382)
### What does this PR do?
Actually run the Timer/TimerZ tests in CI and disable
describeWithContainer in macos
### How did you verify your code works?
CI

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-03 17:36:03 -07:00
robobun
e1de7563e1 Fix PostgreSQL TIME and TIMETZ binary format handling (#22354)
## Summary
- Fixes binary format handling for PostgreSQL TIME and TIMETZ data types
- Resolves issue where time values were returned as garbled binary data
with null bytes

## Problem
When PostgreSQL returns TIME or TIMETZ columns in binary format, Bun.sql
was not properly converting them from their binary representation
(microseconds since midnight) to readable time strings. This resulted in
corrupted output like `\u0000\u0000\u0000\u0000\u0076` instead of proper
time values like `09:00:00`.

## Solution
Added proper binary format decoding for:
- **TIME (OID 1083)**: Converts 8 bytes of microseconds since midnight
to `HH:MM:SS.ffffff` format
- **TIMETZ (OID 1266)**: Converts 8 bytes of microseconds + 4 bytes of
timezone offset to `HH:MM:SS.ffffff±HH:MM` format

## Changes
- Added binary format handling in `src/sql/postgres/DataCell.zig` for
TIME and TIMETZ types
- Added `InvalidTimeFormat` error to `AnyPostgresError` error set
- Properly formats microseconds with trailing zero removal
- Handles timezone offsets correctly (PostgreSQL uses negative values
for positive UTC offsets)

## Test plan
Added comprehensive tests in `test/js/bun/sql/postgres-time.test.ts`:
- [x] TIME and TIMETZ column values with various formats
- [x] NULL handling
- [x] Array types (TIME[] and TIMETZ[])
- [x] JSONB structures containing time strings
- [x] Verification that no binary/null bytes appear in output

All tests pass locally with PostgreSQL.

🤖 Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-03 15:43:04 -07:00
taylor.fish
3d361c8b49 Static allocator polymorphism (#22227)
* Define a generic allocator interface to enable static polymorphism for
allocators (see `GenericAllocator` in `src/allocators.zig`). Note that
`std.mem.Allocator` itself is considered a generic allocator.
* Add utilities to `bun.allocators` for working with generic allocators.
* Add a new namespace, `bun.memory`, with basic utilities for working
with memory and objects (`create`, `destroy`, `initDefault`, `deinit`).
* Add `bun.DefaultAllocator`, a zero-sized generic allocator type whose
`allocator` method simply returns `bun.default_allocator`.
* Implement the generic allocator interface in `AllocationScope` and
`MimallocArena`.
* Improve `bun.threading.GuardedValue` (now `bun.threading.Guarded`).
* Improve `bun.safety.AllocPtr` (now `bun.safety.CheckedAllocator`).

(For internal tracking: fixes STAB-1085, STAB-1086, STAB-1087,
STAB-1088, STAB-1089, STAB-1090, STAB-1091)
2025-09-03 15:40:44 -07:00
Marko Vejnovic
0759da233f (#22289): Remove misleading type definitions (#22377)
### What does this PR do?

Remove incorrect jsdoc. A user was mislead by the docblocks
in the `ffi.d.ts` file
https://github.com/oven-sh/bun/issues/22289#issuecomment-3250221597 and
this PR attempts to fix that.

### How did you verify your code works?

Tests already appear to exist for all of these types in `ffi.test.js`.
2025-09-03 12:22:13 -07:00
Alistair Smith
9978424177 fix: Return .splitting in the types for Bun.build() (#22362)
### What does this PR do?

Fix #22177

### How did you verify your code works?

bun-types integration test
2025-09-03 10:08:06 -07:00
Jarred Sumner
d42f536a74 update CLAUDE.md 2025-09-03 03:39:31 -07:00
robobun
f78d197523 Fix crypto.verify() with null/undefined algorithm for RSA keys (#22331)
## Summary
Fixes #11029 - `crypto.verify()` now correctly handles null/undefined
algorithm parameter for RSA keys, matching Node.js behavior.

## Problem
When calling `crypto.verify()` with a null or undefined algorithm
parameter, Bun was throwing an error:
```
error: error:06000077:public key routines:OPENSSL_internal:NO_DEFAULT_DIGEST
```

## Root Cause
The issue stems from the difference between OpenSSL (used by Node.js)
and BoringSSL (used by Bun):
- **OpenSSL v3**: Automatically provides SHA256 as the default digest
for RSA keys when NULL is passed
- **BoringSSL**: Returns an error when NULL digest is passed for RSA
keys

## Solution
This fix explicitly sets SHA256 as the default digest for RSA keys when
no algorithm is specified, achieving OpenSSL-compatible behavior.

## OpenSSL v3 Source Code Analysis

I traced through the OpenSSL v3 source code to understand exactly how it
handles null digests:

### 1. Entry Point (`crypto/evp/m_sigver.c`)
When `EVP_DigestSignInit` or `EVP_DigestVerifyInit` is called with NULL
digest:
```c
// Lines 215-220 in do_sigver_init function
if (mdname == NULL && !reinit) {
    if (evp_keymgmt_util_get_deflt_digest_name(tmp_keymgmt, provkey,
                                               locmdname,
                                               sizeof(locmdname)) > 0) {
        mdname = canon_mdname(locmdname);
    }
}
```

### 2. Default Digest Query (`crypto/evp/keymgmt_lib.c`)
```c
// Lines 533-571 in evp_keymgmt_util_get_deflt_digest_name
params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_DEFAULT_DIGEST,
                                            mddefault, sizeof(mddefault));
if (!evp_keymgmt_get_params(keymgmt, keydata, params))
    return 0;
```

### 3. RSA Provider Implementation
(`providers/implementations/keymgmt/rsa_kmgmt.c`)
```c
// Line 54: Define the default
#define RSA_DEFAULT_MD "SHA256"

// Lines 351-355: Return it for RSA keys
if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_DEFAULT_DIGEST)) != NULL
    && (rsa_type != RSA_FLAG_TYPE_RSASSAPSS
        || ossl_rsa_pss_params_30_is_unrestricted(pss_params))) {
    if (!OSSL_PARAM_set_utf8_string(p, RSA_DEFAULT_MD))
        return 0;
}
```

## Implementation Details

The fix includes extensive documentation in the source code explaining:
- The OpenSSL v3 mechanism with specific file paths and line numbers
- Why BoringSSL behaves differently
- Why Ed25519/Ed448 keys are handled differently (they don't need a
digest)

## Test Plan
 Added comprehensive regression test in
`test/regression/issue/11029-crypto-verify-null-algorithm.test.ts`
 Tests cover:
  - RSA keys with null/undefined algorithm
  - Ed25519 keys with null algorithm  
  - Cross-verification between null and explicit SHA256
  - `createVerify()` compatibility
 All tests pass and behavior matches Node.js

## Verification
```bash
# Test with Bun
bun test test/regression/issue/11029-crypto-verify-null-algorithm.test.ts

# Compare with Node.js behavior
node -e "const crypto = require('crypto'); 
const {publicKey, privateKey} = crypto.generateKeyPairSync('rsa', {modulusLength: 2048});
const data = Buffer.from('test');
const sig = crypto.sign(null, data, privateKey);
console.log('Node.js verify with null:', crypto.verify(null, data, publicKey, sig));"
```

🤖 Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-02 23:30:52 -07:00
robobun
80fb7c7375 Fix panic when installing global packages with --trust and existing trusted dependencies (#22303)
## Summary

Fixes index out of bounds panic in `PackageJSONEditor` when removing
duplicate trusted dependencies.

The issue occurred when iterating over
`trusted_deps_to_add_to_package_json.items` with a `for` loop and
calling `swapRemove()` during iteration. The `for` loop captures the
array length at the start, but `swapRemove()` modifies the array length,
causing the loop to access indices that are now out of bounds.

## Root Cause

In `PackageJSONEditor.zig:408`, the code was:

```zig
for (manager.trusted_deps_to_add_to_package_json.items, 0..) |trusted_package_name, i| {
    // ... find duplicate logic ...
    allocator.free(manager.trusted_deps_to_add_to_package_json.swapRemove(i));
}
```

When `swapRemove(i)` is called, it removes the element and decreases the
array length, but the `for` loop continues with the original captured
length, leading to index out of bounds.

## Solution

Changed to iterate backwards using a `while` loop:

```zig
var i: usize = manager.trusted_deps_to_add_to_package_json.items.len;
while (i > 0) {
    i -= 1;
    // ... same logic ...
    allocator.free(manager.trusted_deps_to_add_to_package_json.swapRemove(i));
}
```

Backwards iteration is safe because removing elements doesn't affect
indices we haven't processed yet.

## Test Plan

Manually tested the reproduction case:
```bash
# This command previously panicked, now works
bun install -g --trust @google/gemini-cli
```

Fixes #22261

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
2025-09-02 23:00:02 -07:00
robobun
e2bfeefc9d Fix shell crash when piping assignments into commands (#22336)
## Summary
- Fixes crash when running shell commands with variable assignments
piped to other commands
- Resolves #15714

## Problem
The shell was crashing with "Invalid tag" error when running commands
like:
```bash
bun exec "FOO=bar BAR=baz | echo hi"
```

## Root Cause
In `Pipeline.zig`, the `cmds` array was allocated with the wrong size:
- It used `node.items.len` (which includes assignments)
- But only filled entries for actual commands (assignments are skipped
in pipelines)
- This left uninitialized memory that caused crashes when accessed

## Solution
Changed the allocation to use the correct `cmd_count` instead of
`node.items.len`:
```zig
// Before
this.cmds = if (cmd_count >= 1) bun.handleOom(this.base.allocator().alloc(CmdOrResult, this.node.items.len)) else null;

// After  
this.cmds = if (cmd_count >= 1) bun.handleOom(this.base.allocator().alloc(CmdOrResult, cmd_count)) else null;
```

## Test plan
 Added comprehensive regression test in
`test/regression/issue/15714.test.ts` that:
- Tests the exact case from the issue
- Tests multiple assignments
- Tests single assignment
- Tests assignments in middle of pipeline
- Verified test fails on main branch (exit code 133 = SIGTRAP)
- Verified test passes with fix

🤖 Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Zack Radisic <56137411+zackradisic@users.noreply.github.com>
2025-09-02 22:53:03 -07:00
robobun
cff2c2690b Refactor Buffer.concat to use spans and improve error handling (#22337)
## Summary

This PR refactors the `Buffer.concat` implementation to use modern C++
spans for safer memory operations and adds proper error handling for
oversized buffers.

## Changes

- **Use spans instead of raw pointers**: Replaced pointer arithmetic
with `typedSpan()` and `span()` methods for safer memory access
- **Add MAX_ARRAY_BUFFER_SIZE check**: Added explicit check with a
descriptive error message when attempting to create buffers larger than
JavaScriptCore's limit (4GB)
- **Improve loop logic**: Changed loop counter from `int` to `size_t`
and simplified the iteration using span sizes
- **Enhanced test coverage**: Updated tests to verify the new error
message and added comprehensive test cases for various Buffer.concat
scenarios

## Test Plan

All existing tests pass, plus added new tests:
-  Error handling for oversized buffers
-  Normal buffer concatenation
-  totalLength parameter handling (exact, larger, smaller)
-  Empty array handling
-  Single buffer handling

```bash
./build/debug/bun-debug test test/js/node/buffer-concat.test.ts
# Result: 6 pass, 0 fail
```

🤖 Generated with [Claude Code](https://claude.ai/code)

---------

Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-02 18:49:04 -07:00
Lydia Hallie
d0272d4a98 docs: add callout to Global Cache in bun install (#22351)
Add a better callout linking to the Global Cache docs so users can more
easily discover Bun install's disk efficiency

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-02 18:48:18 -07:00