Skip to content

Commit 300177f

Browse files
authored
fix(util-body-length-node): restrict fs calls to fs.ReadStream objects (#1735)
1 parent e0a3280 commit 300177f

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

.changeset/odd-rats-reflect.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@smithy/util-body-length-node": patch
3+
---
4+
5+
restrict fs calls to fs.ReadStream instances

packages/util-body-length-node/src/calculateBodyLength.spec.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,9 @@ describe(calculateBodyLength.name, () => {
8484

8585
it("should handle stream created using fd.createReadStream", async () => {
8686
const fd = await fs.promises.open(__filename, "r");
87-
if ((fd as any).createReadStream) {
88-
const fdReadStream = (fd as any).createReadStream();
89-
expect(calculateBodyLength(fdReadStream)).toEqual(fileSize);
90-
fdReadStream.close();
91-
}
87+
const fdReadStream = fd.createReadStream();
88+
expect(calculateBodyLength(fdReadStream)).toEqual(fileSize);
89+
fdReadStream.close();
9290
});
9391
});
9492

packages/util-body-length-node/src/calculateBodyLength.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { fstatSync, lstatSync } from "fs";
1+
import { fstatSync, lstatSync, ReadStream } from "node:fs";
2+
3+
/**
4+
* @internal
5+
*/
6+
type HasFileDescriptor = {
7+
fd: number;
8+
};
29

310
/**
411
* @internal
@@ -16,12 +23,13 @@ export const calculateBodyLength = (body: any): number | undefined => {
1623
return body.size;
1724
} else if (typeof body.start === "number" && typeof body.end === "number") {
1825
return body.end + 1 - body.start;
19-
} else if (typeof body.path === "string" || Buffer.isBuffer(body.path)) {
20-
// handles fs readable streams
21-
return lstatSync(body.path).size;
22-
} else if (typeof body.fd === "number") {
23-
// handles fd readable streams
24-
return fstatSync(body.fd).size;
26+
} else if (body instanceof ReadStream) {
27+
// the previous use case where start and end are numbers is also potentially a ReadStream.
28+
if (body.path != null) {
29+
return lstatSync(body.path).size;
30+
} else if (typeof (body as ReadStream & HasFileDescriptor).fd === "number") {
31+
return fstatSync((body as ReadStream & HasFileDescriptor).fd).size;
32+
}
2533
}
2634
throw new Error(`Body Length computation failed for ${body}`);
2735
};

0 commit comments

Comments
 (0)