Zip file with embedded relative path throws exception
-----------------------------------------------------
Key: VFS-219
URL: https://issues.apache.org/jira/browse/VFS-219
Project: Commons VFS
Issue Type: Bug
Affects Versions: 1.0
Reporter: Zachary Bedell
Priority: Minor
Attempting to open a ZIP file with an embedded relative path causes an
exception.
To create a sample zip:
mkdir dir
echo "foo" > dir/test.txt
mkdir test
cd test
zip test.zip ../dir/test.txt
test.zip will now contain a path with a relative path that ascends above the
root of the zip. unzip -l output will look something like:
4 10-15-05 12:24 ../dir/test.txt
The ZIP was created with InfoZIP: Zip 2.32 (June 19th 2006).
When the file is accessed programatically with:
VFS.getManager().resolveFile("zip:///path/to/test/test.zip");
The following exception occurs:
org.apache.commons.vfs.FileSystemException: Invalid relative file name.
at
org.apache.commons.vfs.provider.UriParser.normalisePath(UriParser.java:154)
at
org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveName(DefaultFileSystemManager.java:731)
at
org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveName(DefaultFileSystemManager.java:684)
at
org.apache.commons.vfs.provider.zip.ZipFileSystem.init(ZipFileSystem.java:88)
at
org.apache.commons.vfs.provider.AbstractVfsContainer.addComponent(AbstractVfsContainer.java:53)
at
org.apache.commons.vfs.provider.AbstractFileProvider.addFileSystem(AbstractFileProvider.java:96)
at
org.apache.commons.vfs.provider.AbstractLayeredFileProvider.createFileSystem(AbstractLayeredFileProvider.java:80)
at
org.apache.commons.vfs.provider.AbstractLayeredFileProvider.findFile(AbstractLayeredFileProvider.java:59)
at
org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:641)
at
org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:602)
at
org.apache.commons.vfs.impl.DefaultFileSystemManager.resolveFile(DefaultFileSystemManager.java:570)
UriParser.normalisePath() contains the following code:
if (elemLen == 1 && path.charAt(startElem) == '.')
{
// A '.' element - axe it
path.delete(startElem, endElem + 1);
maxlen = path.length();
continue;
}
if (elemLen == 2 && path.charAt(startElem) == '.'
&& path.charAt(startElem + 1) == '.')
{
// A '..' element - remove the previous element
if (startElem == startFirstElem)
{
// Previous element is missing
throw new FileSystemException(
"vfs.provider/invalid-relative-path.error");
}
// Find start of previous element
int pos = startElem - 2;
for (; pos >= 0 && path.charAt(pos) != SEPARATOR_CHAR; pos--)
{
}
startElem = pos + 1;
path.delete(startElem, endElem + 1);
maxlen = path.length();
continue;
}
// A regular element
startElem = endElem + 1;
}
I think it would be appropriate to change the throw in the middle to 'continue'
as in the case for a single dot above.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.