summaryrefslogtreecommitdiff
path: root/ext/net/01_net.js
diff options
context:
space:
mode:
authorseb <sebastian.messier@gmail.com>2024-08-20 14:25:41 -0700
committerGitHub <noreply@github.com>2024-08-20 21:25:41 +0000
commita3a54bc747abe8ca4cd7b0bdbb3e5276a062e914 (patch)
treeb19daffbd66872fd00ce54e7a87da6c02d34e3a8 /ext/net/01_net.js
parent37279e0b0a4300318da472bf0a8bdb894746537f (diff)
fix(ext/net): validate port in Deno.{connect,serve,listen} (#24399)
Co-authored-by: Will Leach <4619280+melbourne2991@users.noreply.github.com> Co-authored-by: Luca Casonato <hello@lcas.dev> Co-authored-by: David Sherret <dsherret@gmail.com>
Diffstat (limited to 'ext/net/01_net.js')
-rw-r--r--ext/net/01_net.js31
1 files changed, 28 insertions, 3 deletions
diff --git a/ext/net/01_net.js b/ext/net/01_net.js
index 536f79bbf..a41a27543 100644
--- a/ext/net/01_net.js
+++ b/ext/net/01_net.js
@@ -33,9 +33,12 @@ const UDP_DGRAM_MAXSIZE = 65507;
const {
Error,
Number,
+ NumberIsNaN,
+ NumberIsInteger,
ObjectPrototypeIsPrototypeOf,
ObjectDefineProperty,
PromiseResolve,
+ RangeError,
SafeSet,
SetPrototypeAdd,
SetPrototypeDelete,
@@ -531,10 +534,11 @@ const listenOptionApiName = Symbol("listenOptionApiName");
function listen(args) {
switch (args.transport ?? "tcp") {
case "tcp": {
+ const port = validatePort(args.port);
const { 0: rid, 1: addr } = op_net_listen_tcp(
{
hostname: args.hostname ?? "0.0.0.0",
- port: Number(args.port),
+ port,
},
args.reusePort,
args.loadBalanced ?? false,
@@ -558,14 +562,33 @@ function listen(args) {
}
}
+function validatePort(maybePort) {
+ if (typeof maybePort !== "number" && typeof maybePort !== "string") {
+ throw new TypeError(`Invalid port (expected number): ${maybePort}`);
+ }
+ if (maybePort === "") throw new TypeError("Invalid port: ''");
+ const port = Number(maybePort);
+ if (!NumberIsInteger(port)) {
+ if (NumberIsNaN(port) && !NumberIsNaN(maybePort)) {
+ throw new TypeError(`Invalid port: '${maybePort}'`);
+ } else {
+ throw new TypeError(`Invalid port: ${maybePort}`);
+ }
+ } else if (port < 0 || port > 65535) {
+ throw new RangeError(`Invalid port (out of range): ${maybePort}`);
+ }
+ return port;
+}
+
function createListenDatagram(udpOpFn, unixOpFn) {
return function listenDatagram(args) {
switch (args.transport) {
case "udp": {
+ const port = validatePort(args.port);
const { 0: rid, 1: addr } = udpOpFn(
{
hostname: args.hostname ?? "127.0.0.1",
- port: args.port,
+ port,
},
args.reuseAddress ?? false,
args.loopback ?? false,
@@ -590,10 +613,11 @@ function createListenDatagram(udpOpFn, unixOpFn) {
async function connect(args) {
switch (args.transport ?? "tcp") {
case "tcp": {
+ const port = validatePort(args.port);
const { 0: rid, 1: localAddr, 2: remoteAddr } = await op_net_connect_tcp(
{
hostname: args.hostname ?? "127.0.0.1",
- port: args.port,
+ port,
},
);
localAddr.transport = "tcp";
@@ -626,4 +650,5 @@ export {
shutdown,
TcpConn,
UnixConn,
+ validatePort,
};