diff options
author | 2023-06-20 21:17:32 -0700 | |
---|---|---|
committer | 2023-06-20 21:17:32 -0700 | |
commit | f81c7f10f68097e1dd3a7c65e82af63d65d678f9 (patch) | |
tree | 02d3d3f40b8e19a6800117a4ae2b695d87dfc7a1 | |
parent | b9c950bfb7a15d0801216d8985ed8bb73f726528 (diff) | |
download | bun-f81c7f10f68097e1dd3a7c65e82af63d65d678f9.tar.gz bun-f81c7f10f68097e1dd3a7c65e82af63d65d678f9.tar.zst bun-f81c7f10f68097e1dd3a7c65e82af63d65d678f9.zip |
Fix crash with .env files that are exactly 159 bytes long (#3369)
* Fix crash with .env files that are exactly 158 bytes and a newline character
* Update env_loader.zig
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
-rw-r--r-- | src/env_loader.zig | 15 | ||||
-rw-r--r-- | test/cli/run/env.test.ts | 23 |
2 files changed, 32 insertions, 6 deletions
diff --git a/src/env_loader.zig b/src/env_loader.zig index 7d506a04e..8a3838101 100644 --- a/src/env_loader.zig +++ b/src/env_loader.zig @@ -884,18 +884,21 @@ pub const Loader = struct { defer file.close(); const stat = try file.stat(); - if (stat.size == 0) { + const end = stat.size; + + if (end == 0) { @field(this, base) = logger.Source.initPathString(base, ""); return; } - var buf = try this.allocator.allocSentinel(u8, stat.size, 0); + var buf = try this.allocator.alloc(u8, end + 1); errdefer this.allocator.free(buf); - var contents = try file.readAll(buf); + const amount_read = try file.readAll(buf[0..end]); + + // The null byte here is mostly for debugging purposes. + buf[end] = 0; - // always sentinel - buf.ptr[contents + 1] = 0; - const source = logger.Source.initPathString(base, buf.ptr[0..contents :0]); + const source = logger.Source.initPathString(base, buf[0..amount_read]); Parser.parse( &source, diff --git a/test/cli/run/env.test.ts b/test/cli/run/env.test.ts index 03d24e93f..ddc316f05 100644 --- a/test/cli/run/env.test.ts +++ b/test/cli/run/env.test.ts @@ -194,6 +194,29 @@ describe("dotenv priority", () => { }); }); +test(".env doesnt crash with 159 bytes", () => { + const dir = tempDirWithFiles("dotenv-159", { + ".env": + "123456789=1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678" + + "\n", + "index.ts": "console.log(process.env['123456789']);", + "package.json": `{ + "name": "foo", + "devDependencies": { + "conditional-type-checks": "1.0.6", + "prettier": "2.8.8", + "tsd": "0.22.0", + "typescript": "5.0.4" + } + }`, + }); + + const { stdout } = bunRun(`${dir}/index.ts`); + expect(stdout.trim()).toBe( + `1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678`, + ); +}); + test.todo(".env space edgecase (issue #411)", () => { const dir = tempDirWithFiles("dotenv-issue-411", { ".env": "VARNAME=A B", |