mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
ensure name is allocated with toSliceClone (#1917)
* ensure name is allocated with `toSliceClone` * shorten toSliceClone
This commit is contained in:
@@ -629,11 +629,10 @@ pub fn ResolveInfoRequest(comptime cares_type: type, comptime type_name: []const
|
||||
pub fn init(
|
||||
cache: DNSResolver.LookupCacheHit(@This()),
|
||||
resolver: ?*DNSResolver,
|
||||
name_str: *const JSC.ZigString.Slice,
|
||||
name: []const u8,
|
||||
globalThis: *JSC.JSGlobalObject,
|
||||
comptime cache_field: []const u8,
|
||||
) !*@This() {
|
||||
const name = name_str.slice();
|
||||
var request = try globalThis.allocator().create(@This());
|
||||
var hasher = std.hash.Wyhash.init(0);
|
||||
hasher.update(name);
|
||||
@@ -643,7 +642,7 @@ pub fn ResolveInfoRequest(comptime cares_type: type, comptime type_name: []const
|
||||
request.* = .{
|
||||
.resolver_for_caching = resolver,
|
||||
.hash = hash,
|
||||
.head = .{ .poll_ref = poll_ref, .globalThis = globalThis, .promise = JSC.JSPromise.Strong.init(globalThis), .allocated = false, .name = name_str },
|
||||
.head = .{ .poll_ref = poll_ref, .globalThis = globalThis, .promise = JSC.JSPromise.Strong.init(globalThis), .allocated = false, .name = name },
|
||||
};
|
||||
request.tail = &request.head;
|
||||
if (cache == .new) {
|
||||
@@ -943,9 +942,9 @@ pub fn CAresLookup(comptime cares_type: type, comptime type_name: []const u8) ty
|
||||
poll_ref: JSC.PollRef,
|
||||
allocated: bool = false,
|
||||
next: ?*@This() = null,
|
||||
name: *const JSC.ZigString.Slice,
|
||||
name: []const u8,
|
||||
|
||||
pub fn init(globalThis: *JSC.JSGlobalObject, allocator: std.mem.Allocator, name: *const JSC.ZigString.Slice) !*@This() {
|
||||
pub fn init(globalThis: *JSC.JSGlobalObject, allocator: std.mem.Allocator, name: []const u8) !*@This() {
|
||||
var this = try allocator.create(@This());
|
||||
var poll_ref = JSC.PollRef.init();
|
||||
poll_ref.ref(globalThis.bunVM());
|
||||
@@ -998,7 +997,7 @@ pub fn CAresLookup(comptime cares_type: type, comptime type_name: []const u8) ty
|
||||
|
||||
pub fn deinit(this: *@This()) void {
|
||||
this.poll_ref.unrefOnNextTick(this.globalThis.bunVM());
|
||||
this.name.deinit();
|
||||
bun.default_allocator.free(this.name);
|
||||
|
||||
if (this.allocated)
|
||||
this.globalThis.allocator().destroy(this);
|
||||
@@ -1529,7 +1528,7 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
@@ -1546,25 +1545,25 @@ pub const DNSResolver = struct {
|
||||
return resolver.doLookup(name.slice(), 0, options, globalThis);
|
||||
},
|
||||
RecordType.CNAME => {
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "cname", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "cname", name.slice(), globalThis);
|
||||
},
|
||||
RecordType.MX => {
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", name.slice(), globalThis);
|
||||
},
|
||||
RecordType.NS => {
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ns", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ns", name.slice(), globalThis);
|
||||
},
|
||||
RecordType.PTR => {
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", name.slice(), globalThis);
|
||||
},
|
||||
RecordType.SOA => {
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", name.slice(), globalThis);
|
||||
},
|
||||
RecordType.SRV => {
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", name.slice(), globalThis);
|
||||
},
|
||||
RecordType.TXT => {
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", name.slice(), globalThis);
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1663,12 +1662,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolveSoa(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1694,12 +1693,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolveCaa(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1725,12 +1724,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_caa_reply, "caa", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_caa_reply, "caa", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolveNs(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1756,12 +1755,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ns", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ns", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolvePtr(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1787,12 +1786,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolveCname(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1818,12 +1817,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "cname", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_hostent, "cname", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolveMx(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1849,12 +1848,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolveNaptr(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1880,12 +1879,12 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_naptr_reply, "naptr", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_naptr_reply, "naptr", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn resolveTxt(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue {
|
||||
@@ -1911,17 +1910,15 @@ pub const DNSResolver = struct {
|
||||
return .zero;
|
||||
}
|
||||
|
||||
const name = name_str.toSlice(globalThis, bun.default_allocator);
|
||||
const name = name_str.toSliceClone(globalThis, bun.default_allocator);
|
||||
|
||||
var vm = globalThis.bunVM();
|
||||
var resolver = vm.rareData().globalDNSResolver(vm);
|
||||
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", &name, globalThis);
|
||||
return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", name.slice(), globalThis);
|
||||
}
|
||||
|
||||
pub fn doResolveCAres(this: *DNSResolver, comptime cares_type: type, comptime type_name: []const u8, name_str: *const JSC.ZigString.Slice, globalThis: *JSC.JSGlobalObject) JSC.JSValue {
|
||||
var name = name_str.slice();
|
||||
|
||||
pub fn doResolveCAres(this: *DNSResolver, comptime cares_type: type, comptime type_name: []const u8, name: []const u8, globalThis: *JSC.JSGlobalObject) JSC.JSValue {
|
||||
var channel: *c_ares.Channel = switch (this.getChannel()) {
|
||||
.result => |res| res,
|
||||
.err => |err| {
|
||||
@@ -1943,7 +1940,7 @@ pub const DNSResolver = struct {
|
||||
var cache = this.getOrPutIntoResolvePendingCache(ResolveInfoRequest(cares_type, type_name), key, cache_name);
|
||||
if (cache == .inflight) {
|
||||
// CAresLookup will have the name ownership
|
||||
var cares_lookup = CAresLookup(cares_type, type_name).init(globalThis, globalThis.allocator(), name_str) catch unreachable;
|
||||
var cares_lookup = CAresLookup(cares_type, type_name).init(globalThis, globalThis.allocator(), name) catch unreachable;
|
||||
cache.inflight.append(cares_lookup);
|
||||
return cares_lookup.promise.value();
|
||||
}
|
||||
@@ -1951,7 +1948,7 @@ pub const DNSResolver = struct {
|
||||
var request = ResolveInfoRequest(cares_type, type_name).init(
|
||||
cache,
|
||||
this,
|
||||
name_str, // CAresLookup will have the ownership
|
||||
name, // CAresLookup will have the ownership
|
||||
globalThis,
|
||||
cache_name,
|
||||
) catch unreachable;
|
||||
|
||||
@@ -368,7 +368,7 @@ pub const ZigString = extern struct {
|
||||
}
|
||||
|
||||
pub fn sliceZ(this: Slice) [:0]const u8 {
|
||||
return this.ptr[0..this.len:0];
|
||||
return this.ptr[0..this.len :0];
|
||||
}
|
||||
|
||||
pub fn toSliceZ(this: Slice, buf: []u8) [:0]const u8 {
|
||||
@@ -386,7 +386,7 @@ pub const ZigString = extern struct {
|
||||
|
||||
std.mem.copy(u8, buf[0..this.len], this.slice());
|
||||
buf[this.len] = 0;
|
||||
return buf[0..this.len:0];
|
||||
return buf[0..this.len :0];
|
||||
}
|
||||
|
||||
pub fn mut(this: Slice) []u8 {
|
||||
@@ -604,7 +604,7 @@ pub const ZigString = extern struct {
|
||||
if (this.len == 0)
|
||||
return Slice.empty;
|
||||
if (is16Bit(&this)) {
|
||||
var buffer = this.toOwnedSlice(allocator) catch unreachable;
|
||||
const buffer = this.toOwnedSlice(allocator) catch unreachable;
|
||||
return Slice{
|
||||
.allocator = NullableAllocator.init(allocator),
|
||||
.ptr = buffer.ptr,
|
||||
@@ -613,7 +613,7 @@ pub const ZigString = extern struct {
|
||||
}
|
||||
|
||||
if (!this.isUTF8() and !strings.isAllASCII(untagged(this.ptr)[0..this.len])) {
|
||||
var buffer = this.toOwnedSlice(allocator) catch unreachable;
|
||||
const buffer = this.toOwnedSlice(allocator) catch unreachable;
|
||||
return Slice{
|
||||
.allocator = NullableAllocator.init(allocator),
|
||||
.ptr = buffer.ptr,
|
||||
@@ -627,6 +627,17 @@ pub const ZigString = extern struct {
|
||||
};
|
||||
}
|
||||
|
||||
pub fn toSliceClone(this: ZigString, allocator: std.mem.Allocator) Slice {
|
||||
if (this.len == 0)
|
||||
return Slice.empty;
|
||||
const buffer = this.toOwnedSlice(allocator) catch unreachable;
|
||||
return Slice{
|
||||
.allocator = NullableAllocator.init(allocator),
|
||||
.ptr = buffer.ptr,
|
||||
.len = @truncate(u32, buffer.len),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn toSliceZ(this: ZigString, allocator: std.mem.Allocator) Slice {
|
||||
if (this.len == 0)
|
||||
return Slice.empty;
|
||||
@@ -1305,6 +1316,7 @@ pub const JSString = extern struct {
|
||||
return out;
|
||||
}
|
||||
|
||||
// doesn't always allocate
|
||||
pub fn toSlice(
|
||||
this: *JSString,
|
||||
global: *JSGlobalObject,
|
||||
@@ -1315,6 +1327,16 @@ pub const JSString = extern struct {
|
||||
return str.toSlice(allocator);
|
||||
}
|
||||
|
||||
pub fn toSliceClone(
|
||||
this: *JSString,
|
||||
global: *JSGlobalObject,
|
||||
allocator: std.mem.Allocator,
|
||||
) ZigString.Slice {
|
||||
var str = ZigString.init("");
|
||||
this.toZigString(global, &str);
|
||||
return str.toSliceClone(allocator);
|
||||
}
|
||||
|
||||
pub fn toSliceZ(
|
||||
this: *JSString,
|
||||
global: *JSGlobalObject,
|
||||
|
||||
@@ -25,7 +25,9 @@ test("dns.resolveSrv (_test._tcp.test.socketify.dev)", (done) => {
|
||||
dns.resolveSrv("_test._tcp.test.socketify.dev", (err, results) => {
|
||||
expect(err).toBeNull();
|
||||
expect(results instanceof Array).toBe(true);
|
||||
expect(results[0].name).toBe("_dc-srv.130c90ab9de1._test._tcp.test.socketify.dev");
|
||||
expect(results[0].name).toBe(
|
||||
"_dc-srv.130c90ab9de1._test._tcp.test.socketify.dev",
|
||||
);
|
||||
expect(results[0].priority).toBe(50);
|
||||
expect(results[0].weight).toBe(50);
|
||||
expect(results[0].port).toBe(80);
|
||||
@@ -50,11 +52,9 @@ test("dns.resolveTxt (txt.socketify.dev)", (done) => {
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
test("dns.resolveSoa (bun.sh)", (done) => {
|
||||
dns.resolveSoa("bun.sh", (err, result) => {
|
||||
expect(err).toBeNull();
|
||||
|
||||
expect(result.serial).toBe(2295878541);
|
||||
expect(result.refresh).toBe(10000);
|
||||
expect(result.retry).toBe(2400);
|
||||
@@ -62,7 +62,6 @@ test("dns.resolveSoa (bun.sh)", (done) => {
|
||||
expect(result.minttl).toBe(3600);
|
||||
expect(result.nsname).toBe("hans.ns.cloudflare.com");
|
||||
expect(result.hostmaster).toBe("dns.cloudflare.com");
|
||||
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
@@ -71,10 +70,10 @@ test("dns.resolveNaptr (naptr.socketify.dev)", (done) => {
|
||||
dns.resolveNaptr("naptr.socketify.dev", (err, results) => {
|
||||
expect(err).toBeNull();
|
||||
expect(results instanceof Array).toBe(true);
|
||||
expect(results[0].flags).toBe('S');
|
||||
expect(results[0].service).toBe('test');
|
||||
expect(results[0].regexp).toBe('');
|
||||
expect(results[0].replacement).toBe('');
|
||||
expect(results[0].flags).toBe("S");
|
||||
expect(results[0].service).toBe("test");
|
||||
expect(results[0].regexp).toBe("");
|
||||
expect(results[0].replacement).toBe("");
|
||||
expect(results[0].order).toBe(1);
|
||||
expect(results[0].preference).toBe(12);
|
||||
done(err);
|
||||
@@ -86,29 +85,27 @@ test("dns.resolveCaa (caa.socketify.dev)", (done) => {
|
||||
expect(err).toBeNull();
|
||||
expect(results instanceof Array).toBe(true);
|
||||
expect(results[0].critical).toBe(0);
|
||||
expect(results[0].issue).toBe('bun.sh');
|
||||
expect(results[0].issue).toBe("bun.sh");
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
test("dns.resolveMx (bun.sh)", (done) => {
|
||||
dns.resolveMx("bun.sh", (err, results) => {
|
||||
expect(err).toBeNull();
|
||||
expect(results instanceof Array).toBe(true);
|
||||
expect(results[0].priority).toBe(10);
|
||||
expect(results[0].exchange).toBe('eforward1.registrar-servers.com');
|
||||
const priority = results[0].priority;
|
||||
expect(priority >= 0 && priority < 65535).toBe(true);
|
||||
expect(results[0].exchange.includes(".registrar-servers.com")).toBe(true);
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
test("dns.resolveNs (bun.sh) ", (done) => {
|
||||
dns.resolveNs("bun.sh", (err, results) => {
|
||||
expect(err).toBeNull();
|
||||
expect(results instanceof Array).toBe(true);
|
||||
expect(results[0]).toBe('hans.ns.cloudflare.com');
|
||||
expect(results[0].includes(".ns.cloudflare.com")).toBe(true);
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
@@ -117,7 +114,7 @@ test("dns.resolvePtr (ptr.socketify.dev)", (done) => {
|
||||
dns.resolvePtr("ptr.socketify.dev", (err, results) => {
|
||||
expect(err).toBeNull();
|
||||
expect(results instanceof Array).toBe(true);
|
||||
expect(results[0]).toBe('bun.sh');
|
||||
expect(results[0]).toBe("bun.sh");
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
@@ -126,12 +123,11 @@ test("dns.resolveCname (cname.socketify.dev)", (done) => {
|
||||
dns.resolveCname("cname.socketify.dev", (err, results) => {
|
||||
expect(err).toBeNull();
|
||||
expect(results instanceof Array).toBe(true);
|
||||
expect(results[0]).toBe('bun.sh');
|
||||
expect(results[0]).toBe("bun.sh");
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
test("dns.lookup (example.com)", (done) => {
|
||||
dns.lookup("example.com", (err, address, family) => {
|
||||
expect(err).toBeNull();
|
||||
@@ -151,4 +147,4 @@ test("dns.lookup (localhost)", (done) => {
|
||||
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user