Skip to content

[v18.x] Wrong path returned by fs.readdir withFileTypes=true #52441

Closed
@H4ad

Description

@H4ad

Version

18.20.1

Platform

Linux h4ad 6.5.0-27-generic #28~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 15 10:51:06 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

Subsystem

fs/promise

What steps will reproduce the bug?

You can reproduce the issue by running the following commands:

$ mkdir fs-issue
$ cd fs-issue
$ touch issue.txt
$ node -e "require('fs/promises').readdir('.', { withFileTypes: true, encoding: 'utf-8', }).then(console.log)" 

How often does it reproduce? Is there a required condition?

Always

What is the expected behavior? Why is that the expected behavior?

The path should be ..

[
  Dirent {
    name: 'issue.txt',
    parentPath: '.',
    path: '.',
    [Symbol(type)]: 1
  }
]

What do you see instead?

The path is different:

[
  Dirent {
    name: 'issue.txt',
    parentPath: '.',
    path: 'issue.txt',
    [Symbol(type)]: 1
  }
]

This issue only happens on fs/promises, on readdirSync, we don't see this issue:

$ node --print "require('fs').readdirSync('.', { withFileTypes: true, encoding: 'utf-8', })"
[
  Dirent {
    name: 'issue.txt',
    parentPath: '.',
    path: '.',
    [Symbol(type)]: 1
  }
]

Also, if we include recursive, we don't see the issue:

$ node -e "require('fs/promises').readdir('.', { recursive:true, withFileTypes: true, encoding: 'utf-8', }).then(console.log)"
[
  Dirent {
    name: 'issue.txt',
    parentPath: '.',
    path: '.',
    [Symbol(type)]: 1
  }
]

Additional information

This bug was first introduced at 18.20.0, on 18.19.1 the behavior is correct.
On latest version of node, 21.7.2 and 20.12.1, we don't see this issue.

This bug was found by @wraithgar at npm/cli#7352 (comment)

Metadata

Metadata

Assignees

No one assigned

    Labels

    confirmed-bugIssues with confirmed bugs.fsIssues and PRs related to the fs subsystem / file system.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions