Skip to content

Commit 41aa969

Browse files
Hanaasagipaperclover
authored andcommitted
fix(node:dns): fix the crash. (oven-sh#5200)
1 parent 78db802 commit 41aa969

File tree

3 files changed

+66
-15
lines changed

3 files changed

+66
-15
lines changed

src/bun.js/api/bun/dns_resolver.zig

-10
Original file line numberDiff line numberDiff line change
@@ -1977,11 +1977,6 @@ pub const DNSResolver = struct {
19771977
return .zero;
19781978
};
19791979

1980-
if (name_str.length() == 0) {
1981-
globalThis.throwInvalidArgumentType("resolveSoa", "hostname", "non-empty string");
1982-
return .zero;
1983-
}
1984-
19851980
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
19861981

19871982
var vm = globalThis.bunVM();
@@ -2039,11 +2034,6 @@ pub const DNSResolver = struct {
20392034
return .zero;
20402035
};
20412036

2042-
if (name_str.length() == 0) {
2043-
globalThis.throwInvalidArgumentType("resolveNs", "hostname", "non-empty string");
2044-
return .zero;
2045-
}
2046-
20472037
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
20482038

20492039
var vm = globalThis.bunVM();

src/deps/c_ares.zig

+5-4
Original file line numberDiff line numberDiff line change
@@ -524,11 +524,12 @@ pub const Channel = opaque {
524524
}
525525

526526
pub fn resolve(this: *Channel, name: []const u8, comptime lookup_name: []const u8, comptime Type: type, ctx: *Type, comptime cares_type: type, comptime callback: cares_type.Callback(Type)) void {
527+
if (name.len >= 1023 or (name.len == 0 and !(bun.strings.eqlComptime(lookup_name, "ns") or bun.strings.eqlComptime(lookup_name, "soa")))) {
528+
return cares_type.callbackWrapper(lookup_name, Type, callback).?(ctx, ARES_EBADNAME, 0, null, 0);
529+
}
530+
527531
var name_buf: [1024]u8 = undefined;
528-
const name_ptr: ?[*:0]const u8 = brk: {
529-
if (name.len == 0 or name.len >= 1023) {
530-
break :brk null;
531-
}
532+
const name_ptr: [*:0]const u8 = brk: {
532533
const len = @min(name.len, name_buf.len - 1);
533534
@memcpy(name_buf[0..len], name[0..len]);
534535

test/js/node/dns/node-dns.test.js

+61-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { expect, test } from "bun:test";
1+
import { describe, expect, test, it } from "bun:test";
22
import * as dns from "node:dns";
33
import * as dns_promises from "node:dns/promises";
44
import * as fs from "node:fs";
@@ -102,6 +102,15 @@ test("dns.resolveSoa (bun.sh)", done => {
102102
});
103103
});
104104

105+
test("dns.resolveSoa (empty string)", done => {
106+
dns.resolveSoa("", (err, result) => {
107+
expect(err).toBeNull();
108+
// one of root server
109+
expect(result).not.toBeUndefined();
110+
done(err);
111+
});
112+
});
113+
105114
test("dns.resolveNaptr (naptr.socketify.dev)", done => {
106115
dns.resolveNaptr("naptr.socketify.dev", (err, results) => {
107116
expect(err).toBeNull();
@@ -146,6 +155,32 @@ test("dns.resolveNs (bun.sh) ", done => {
146155
});
147156
});
148157

158+
test("dns.resolveNs (empty string) ", done => {
159+
dns.resolveNs("", (err, results) => {
160+
expect(err).toBeNull();
161+
expect(results instanceof Array).toBe(true);
162+
// root servers
163+
expect(results.sort()).toStrictEqual(
164+
[
165+
"e.root-servers.net",
166+
"h.root-servers.net",
167+
"l.root-servers.net",
168+
"i.root-servers.net",
169+
"a.root-servers.net",
170+
"d.root-servers.net",
171+
"c.root-servers.net",
172+
"b.root-servers.net",
173+
"j.root-servers.net",
174+
"k.root-servers.net",
175+
"g.root-servers.net",
176+
"m.root-servers.net",
177+
"f.root-servers.net",
178+
].sort(),
179+
);
180+
done(err);
181+
});
182+
});
183+
149184
test("dns.resolvePtr (ptr.socketify.dev)", done => {
150185
dns.resolvePtr("ptr.socketify.dev", (err, results) => {
151186
expect(err).toBeNull();
@@ -268,3 +303,28 @@ test("dns.promises.reverse", async () => {
268303
expect(hostnames).toContain("one.one.one.one");
269304
}
270305
});
306+
307+
describe("test invalid arguments", () => {
308+
it.each([
309+
// TODO: dns.resolveAny is not implemented yet
310+
["dns.resolveCname", dns.resolveCname],
311+
["dns.resolveCaa", dns.resolveCaa],
312+
["dns.resolveMx", dns.resolveMx],
313+
["dns.resolveNaptr", dns.resolveNaptr],
314+
["dns.resolveNs", dns.resolveNs],
315+
["dns.resolvePtr", dns.resolvePtr],
316+
["dns.resolveSoa", dns.resolveSoa],
317+
["dns.resolveSrv", dns.resolveSrv],
318+
["dns.resolveTxt", dns.resolveTxt],
319+
])("%s", (_, fn, done) => {
320+
fn("a".repeat(2000), (err, results) => {
321+
try {
322+
expect(err).not.toBeNull();
323+
expect(results).toBeUndefined();
324+
done();
325+
} catch (e) {
326+
done(e);
327+
}
328+
});
329+
});
330+
});

0 commit comments

Comments
 (0)