Skip to content

fsPromise - read files from positions >4GB doesn't work #21121

Closed
@freiit

Description

@freiit
  • node10.3.0:
  • tested on x86_64 GNU/Linux and armv6l GNU/Linux
  • fs / fsPromise

reading files > 4GB doesn't read the correct bytes.
(Maybe related to fix here: #21003)

Code example shows identical code, one with fsPromise, one the old style cb. Example uses sparse file for fast reproduction, but works also with non-sparse files.

let {promises: fs} = require('fs')
let fsOld = require('fs')

let {strict: assert} = require('assert')

const FILE = '/tmp/demo'
const GB = 4
const BUFFER = 2

async function p() {
	let input = Buffer.alloc(BUFFER, '-')

	let fh = await fs.open(FILE, 'w')
	let bytes = await fh.write(input, 0, BUFFER, GB * 1024 * 1024 * 1024)
	console.log('bytes', bytes)
	await fh.close()

	fh = await fs.open(FILE, 'r')
	let buffer = Buffer.allocUnsafe(BUFFER)
	let result = await fh.read(buffer, 0, BUFFER, GB * 1024 * 1024 * 1024)
	await fh.close()

	assert.deepEqual(input, result.buffer) // <-- fails
}

async function cb() {
	let input = Buffer.alloc(BUFFER, '-')

	let fh = await new Promise((res, rej) => fsOld.open(FILE, 'w', (err, data) => err ? rej(err) : res(data)))
	let bytes = await new Promise((res, rej) => fsOld.write(fh, input, 0, BUFFER, GB * 1024 * 1024 * 1024, (err, data) => err ? rej(err) : res(data)))
	console.log('bytes', bytes)
	await new Promise((res, rej) => fsOld.close(fh, e => e ? rej(e) : res()))

	fh = await new Promise((res, rej) => fsOld.open(FILE, 'r', (err, data) => err ? rej(err) : res(data)))
	let buffer = Buffer.allocUnsafe(BUFFER)
	let result = await new Promise((res, rej) => fsOld.read(fh, buffer, 0, BUFFER, GB * 1024 * 1024 * 1024, (err, bytes, buffer) => err ? rej(err) : res({ bytes, buffer })))
	console.log('result', result)
	await new Promise((res, rej) => fsOld.close(fh, e => e ? rej(e) : res()))

	assert.deepEqual(input, result.buffer) // <-- works
}

(async function main() { await cb(); await p() })().catch(e => console.error(e))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions