Skip to content

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

Closed
@freiit

Description

  • 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

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