Skip to content

Link cache collision in write-entry due to erroneous 'ino' #431

Open
@b-gutzmann

Description

I am trying to create an archive with two different files, but one file ends up being (incorrectly) hard linked to the other. I believe this is because node erroneously reports the same 'ino' number for these files. Potentially related to nodejs/node#12115

Here is the code I'm using

            const mfiles = [
                './dist/components/FeatureFilterViewWindow.scss',
                './dist/components/FieldTagsInput.scss'
            ]
            const stream = tar.create(
                {
                    gzip: false,
                    onwarn: (code, message, date) => {
                        console.warn(code, message, date);
                    },
                    filter: (path, stat) => {
                        console.log(path, stat);
                        return true;
                    }
                },
                mfiles
            );

            const writeStream = fs.createWriteStream(packageTarball);
            stream.pipe(writeStream).on('error', (e) => {
                console.error('error', e);
            }).on('finish', () => {
                console.log('finished');
            })

which prints

./dist/components/FeatureFilterViewWindow.scss Stats {
  dev: 204880295,
  mode: 33206,
  nlink: 2,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 9570149211882252,
  size: 667,
  blocks: 8,
  atimeMs: 1737048571848.961,
  mtimeMs: 1724710432427.687,
  ctimeMs: 1736989116749.4336,
  birthtimeMs: 1734560418984.347,
  atime: 2025-01-16T17:29:31.849Z,
  mtime: 2024-08-26T22:13:52.428Z,
  ctime: 2025-01-16T00:58:36.749Z,
  birthtime: 2024-12-18T22:20:18.984Z
}
./dist/components/FieldTagsInput.scss Stats {
  dev: 204880295,
  mode: 33206,
  nlink: 2,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 9570149211882252,
  size: 233,
  blocks: 0,
  atimeMs: 1737047555156.3042,
  mtimeMs: 1736987398798.4736,
  ctimeMs: 1736989157564.605,
  birthtimeMs: 1736987481606.987,
  atime: 2025-01-16T17:12:35.156Z,
  mtime: 2025-01-16T00:29:58.798Z,
  ctime: 2025-01-16T00:59:17.565Z,
  birthtime: 2025-01-16T00:31:21.607Z
}
finished

Note that the 'ino' numbers are identical.

which ends up creating an archive that looks like this in 7-zip
Image

I believe using the bigint option for fs.stat can fix the issue.

            mfiles.forEach(file => {
                console.log(file);
                console.log(fs.statSync(file, { bigint: true }));
            });

prints

./dist/components/FeatureFilterViewWindow.scss
BigIntStats {
  dev: 204880295n,
  mode: 33206n,
  nlink: 2n,
  uid: 0n,
  gid: 0n,
  rdev: 0n,
  blksize: 4096n,
  ino: 9570149211882252n,
  size: 667n,
  blocks: 8n,
  atimeMs: 1737048612767n,
  mtimeMs: 1724710432427n,
  ctimeMs: 1736989116749n,
  birthtimeMs: 1734560418984n,
  atimeNs: 1737048612767570500n,
  mtimeNs: 1724710432427686900n,
  ctimeNs: 1736989116749433700n,
  birthtimeNs: 1734560418984347000n,
  atime: 2025-01-16T17:30:12.767Z,
  mtime: 2024-08-26T22:13:52.427Z,
  ctime: 2025-01-16T00:58:36.749Z,
  birthtime: 2024-12-18T22:20:18.984Z
}
./dist/components/FieldTagsInput.scss
BigIntStats {
  dev: 204880295n,
  mode: 33206n,
  nlink: 2n,
  uid: 0n,
  gid: 0n,
  rdev: 0n,
  blksize: 4096n,
  ino: 9570149211882253n,
  size: 233n,
  blocks: 0n,
  atimeMs: 1737047555156n,
  mtimeMs: 1736987398798n,
  ctimeMs: 1736989157564n,
  birthtimeMs: 1736987481606n,
  atimeNs: 1737047555156304200n,
  mtimeNs: 1736987398798473700n,
  ctimeNs: 1736989157564605000n,
  birthtimeNs: 1736987481606987000n,
  atime: 2025-01-16T17:12:35.156Z,
  mtime: 2025-01-16T00:29:58.798Z,
  ctime: 2025-01-16T00:59:17.564Z,
  birthtime: 2025-01-16T00:31:21.606Z
}

where the 'ino' numbers are no longer identical.

node-tar version 7.4.3
Node v18.20.5
Windows 11 Enterprise 23H2

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions