Skip to content

Commit f68d465

Browse files
committed
make reading from file safer and handle unexpected end of file
1 parent e4a5e59 commit f68d465

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

lib/serialization/FileMiddleware.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,33 @@ const createPointer = (filename, offset, size) => {
229229
});
230230
};
231231

232+
const readFileSectionToBuffer = (fd, buffer, offset, position, callback) => {
233+
const remaining = buffer.length - offset;
234+
fs.read(fd, buffer, offset, remaining, position, (err, bytesRead) => {
235+
if (err) return callback(err);
236+
if (bytesRead === 0) {
237+
return callback(
238+
new Error(
239+
`Unexpected end of file (${remaining} bytes missing at pos ${position}`
240+
)
241+
);
242+
}
243+
if (bytesRead < remaining) {
244+
return readFileSectionToBuffer(
245+
fd,
246+
buffer,
247+
offset + bytesRead,
248+
position + bytesRead,
249+
callback
250+
);
251+
}
252+
return callback();
253+
});
254+
};
255+
232256
const readSection = (filename, file, offset, size, callback) => {
233257
const buffer = Buffer.alloc(size);
234-
fs.read(file, buffer, 0, size, offset, err => {
258+
readFileSectionToBuffer(file, buffer, 0, offset, err => {
235259
if (err) return callback(err);
236260

237261
const result = [];
@@ -345,7 +369,7 @@ class FileMiddleware extends SerializerMiddleware {
345369
false,
346370
(file, callback) => {
347371
const sizeBuf = Buffer.alloc(4);
348-
fs.read(file, sizeBuf, 0, 4, 0, err => {
372+
readFileSectionToBuffer(file, sizeBuf, 0, 0, err => {
349373
if (err) return callback(err);
350374

351375
const rootSize = sizeBuf.readUInt32LE(0);

0 commit comments

Comments
 (0)