Skip to content

Commit 1d86750

Browse files
committed
add checks for more parameters
1 parent d4a3888 commit 1d86750

2 files changed

Lines changed: 135 additions & 14 deletions

File tree

packages/core/src/codecs/octetstream-codec.ts

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,41 @@ export default class OctetstreamCodec implements ContentCodec {
5959
debug("OctetstreamCodec parsing", bytes);
6060
debug("Parameters", parameters);
6161

62-
const bigEndian = !(parameters.byteSeq?.includes(Endianness.LITTLE_ENDIAN) === true); // default to big endian
63-
let signed = parameters.signed !== "false"; // default to signed
62+
const length =
63+
parameters.length != null
64+
? parseInt(parameters.length)
65+
: (warn("Missing 'length' parameter necessary for write. I'll do my best"), undefined);
66+
67+
if (length !== undefined) {
68+
if (isNaN(length) || length < 0) {
69+
throw new Error("'length' parameter must be a non-negative number");
70+
}
71+
if (length !== bytes.length) {
72+
throw new Error(`Lengths do not match, required: ${length} provided: ${bytes.length}`);
73+
}
74+
}
75+
76+
let signed = true; // default to signed
77+
if (parameters.signed !== undefined) {
78+
if (parameters.signed !== "true" && parameters.signed !== "false") {
79+
throw new Error("'signed' parameter must be 'true' or 'false'");
80+
}
81+
signed = parameters.signed === "true";
82+
}
83+
84+
let bitLength = schema?.["ex:bitLength"] !== undefined ? parseInt(schema["ex:bitLength"]) : bytes.length * 8;
85+
86+
if (isNaN(bitLength) || bitLength < 0) {
87+
throw new Error("'ex:bitLength' must be a non-negative number");
88+
}
89+
6490
const offset = schema?.["ex:bitOffset"] !== undefined ? parseInt(schema["ex:bitOffset"]) : 0;
65-
if (parameters.length != null && parseInt(parameters.length) !== bytes.length) {
66-
throw new Error("Lengths do not match, required: " + parameters.length + " provided: " + bytes.length);
91+
92+
if (isNaN(offset) || offset < 0) {
93+
throw new Error("'ex:bitOffset' must be a non-negative number");
6794
}
68-
let bitLength: number =
69-
schema?.["ex:bitLength"] !== undefined ? parseInt(schema["ex:bitLength"]) : bytes.length * 8;
95+
96+
const bigEndian = !(parameters.byteSeq?.includes(Endianness.LITTLE_ENDIAN) === true); // default to big endian
7097
let dataType: string = schema?.type;
7198

7299
if (!dataType) {
@@ -223,16 +250,38 @@ export default class OctetstreamCodec implements ContentCodec {
223250
valueToBytes(value: unknown, schema?: DataSchema, parameters: { [key: string]: string | undefined } = {}): Buffer {
224251
debug(`OctetstreamCodec serializing '${value}'`);
225252

226-
if (parameters.length == null) {
227-
warn("Missing 'length' parameter necessary for write. I'll do my best");
253+
const bigEndian = !(parameters.byteSeq?.includes(Endianness.LITTLE_ENDIAN) === true); // default to big endian
254+
255+
let signed = true; // default to true
256+
257+
if (parameters.signed !== undefined) {
258+
if (parameters.signed !== "true" && parameters.signed !== "false") {
259+
throw new Error("'signed' parameter must be 'true' or 'false'");
260+
}
261+
signed = parameters.signed === "true";
262+
}
263+
264+
let length =
265+
parameters.length != null
266+
? parseInt(parameters.length)
267+
: (warn("Missing 'length' parameter necessary for write. I'll do my best"), undefined);
268+
269+
if (length !== undefined && (isNaN(length) || length < 0)) {
270+
throw new Error("'length' parameter must be a non-negative number");
228271
}
229272

230-
const bigEndian = !(parameters.byteSeq?.includes(Endianness.LITTLE_ENDIAN) === true); // default to big endian
231-
let signed = parameters.signed !== "false"; // default to signed
232-
// byte length of the buffer to be returned
233-
let length = parameters.length != null ? parseInt(parameters.length) : undefined;
234273
let bitLength = schema?.["ex:bitLength"] !== undefined ? parseInt(schema["ex:bitLength"]) : undefined;
274+
275+
if (bitLength !== undefined && (isNaN(bitLength) || bitLength < 0)) {
276+
throw new Error("'ex:bitLength' must be a non-negative number");
277+
}
278+
235279
const offset = schema?.["ex:bitOffset"] !== undefined ? parseInt(schema["ex:bitOffset"]) : 0;
280+
281+
if (isNaN(offset) || offset < 0) {
282+
throw new Error("'ex:bitOffset' must be a non-negative number");
283+
}
284+
236285
let dataType: string = schema?.type ?? undefined;
237286

238287
if (value === undefined) {
@@ -547,11 +596,11 @@ export default class OctetstreamCodec implements ContentCodec {
547596
const offset = schema["ex:bitOffset"] !== undefined ? parseInt(schema["ex:bitOffset"]) : 0;
548597

549598
if (isNaN(offset) || offset < 0) {
550-
throw new Error("ex:bitOffset must be a non-negative number");
599+
throw new Error("'ex:bitOffset' must be a non-negative number");
551600
}
552601

553602
if (offset > length * 8) {
554-
throw new Error(`ex:bitOffset ${offset} exceeds length ${length}`);
603+
throw new Error(`'ex:bitOffset' ${offset} exceeds 'length' ${length}`);
555604
}
556605

557606
result = result ?? Buffer.alloc(length);

packages/core/test/ContentSerdesTest.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,55 @@ class SerdesOctetTests {
584584
{ type: "uint8" }
585585
)
586586
).to.throw(Error, "Type is unsigned but 'signed' is true");
587+
588+
expect(() =>
589+
ContentSerdes.contentToValue(
590+
{ type: `application/octet-stream;length=test`, body: Buffer.from([0x36]) },
591+
{ type: "integer" }
592+
)
593+
).to.throw(Error, "'length' parameter must be a non-negative number");
594+
595+
expect(() =>
596+
ContentSerdes.contentToValue(
597+
{ type: `application/octet-stream;length=-1`, body: Buffer.from([0x36]) },
598+
{ type: "integer" }
599+
)
600+
).to.throw(Error, "'length' parameter must be a non-negative number");
601+
602+
expect(() =>
603+
ContentSerdes.contentToValue(
604+
{ type: `application/octet-stream;signed=invalid`, body: Buffer.from([0x36]) },
605+
{ type: "integer" }
606+
)
607+
).to.throw(Error, "'signed' parameter must be 'true' or 'false'");
608+
609+
expect(() =>
610+
ContentSerdes.contentToValue(
611+
{ type: `application/octet-stream`, body: Buffer.from([0x36]) },
612+
{ type: "integer", "ex:bitOffset": "invalid" }
613+
)
614+
).to.throw(Error, "'ex:bitOffset' must be a non-negative number");
615+
616+
expect(() =>
617+
ContentSerdes.contentToValue(
618+
{ type: `application/octet-stream`, body: Buffer.from([0x36]) },
619+
{ type: "integer", "ex:bitOffset": -1 }
620+
)
621+
).to.throw(Error, "'ex:bitOffset' must be a non-negative number");
622+
623+
expect(() =>
624+
ContentSerdes.contentToValue(
625+
{ type: `application/octet-stream`, body: Buffer.from([0x36]) },
626+
{ type: "integer", "ex:bitLength": "invalid" }
627+
)
628+
).to.throw(Error, "'ex:bitLength' must be a non-negative number");
629+
630+
expect(() =>
631+
ContentSerdes.contentToValue(
632+
{ type: `application/octet-stream`, body: Buffer.from([0x36]) },
633+
{ type: "integer", "ex:bitLength": -1 }
634+
)
635+
).to.throw(Error, "'ex:bitLength' must be a non-negative number");
587636
}
588637

589638
@test async "value to OctetStream"() {
@@ -937,6 +986,29 @@ class SerdesOctetTests {
937986
Error,
938987
"Missing 'type' property in schema"
939988
);
989+
expect(() => ContentSerdes.valueToContent(10, { type: "int8" }, "application/octet-stream;signed=8")).to.throw(
990+
Error,
991+
"'signed' parameter must be 'true' or 'false'"
992+
);
993+
expect(() =>
994+
ContentSerdes.valueToContent(10, { type: "int8" }, "application/octet-stream;length=-1;")
995+
).to.throw(Error, "'length' parameter must be a non-negative number");
996+
expect(() => ContentSerdes.valueToContent(10, { type: "int8" }, "application/octet-stream;length=x;")).to.throw(
997+
Error,
998+
"'length' parameter must be a non-negative number"
999+
);
1000+
expect(() =>
1001+
ContentSerdes.valueToContent(10, { type: "integer", "ex:bitOffset": -16 }, "application/octet-stream")
1002+
).to.throw(Error, "'ex:bitOffset' must be a non-negative number");
1003+
expect(() =>
1004+
ContentSerdes.valueToContent(10, { type: "integer", "ex:bitOffset": "foo" }, "application/octet-stream")
1005+
).to.throw(Error, "'ex:bitOffset' must be a non-negative number");
1006+
expect(() =>
1007+
ContentSerdes.valueToContent(10, { type: "integer", "ex:bitLength": -8 }, "application/octet-stream")
1008+
).to.throw(Error, "'ex:bitLength' must be a non-negative number");
1009+
expect(() =>
1010+
ContentSerdes.valueToContent(10, { type: "integer", "ex:bitLength": "foo" }, "application/octet-stream")
1011+
).to.throw(Error, "'ex:bitLength' must be a non-negative number");
9401012
}
9411013
}
9421014

0 commit comments

Comments
 (0)