Description
Consider the following code:
const archiver = require('archiver');
const archive = archiver('zip');
archive.append('hello, world!', { name: '\\' });
This is meant to add a file named \
to the archive. According to the specification (https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT), this should be allowed, and it's certainly allowed by standard implementations of the zip
command (that is, touch '\' && zip -r test.zip '\'
works as expected and produces an archive containing a single file \
).
However, what happens in practice is that this fails with the following error message:
ArchiverError: entry name must be a non-empty string value
This happens because of the following line:
Line 310 in 2050cfa
Which in turn runs this:
sanitizePath
transforms \
into the empty string.
The same underlying problem causes a different issue with the following code:
archive.append('hello, world!', { name: 'testing/\\' });
In this case, the name is transformed to testing/
, which incorrectly results in the creation of a directory instead of a file with the specified contents.
One more example:
archive.append('hello, world!', { name: 'testing/foo\\bar.txt' });
This actually creates testing/foo/bar.txt
, which is not at all what was intended.