-
Notifications
You must be signed in to change notification settings - Fork 241
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
| data.name = util.sanitizePath(data.name); |
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.