summaryrefslogtreecommitdiffstats
path: root/generic/tclZipfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclZipfs.c')
-rw-r--r--generic/tclZipfs.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c
index aac5659..0f4d268 100644
--- a/generic/tclZipfs.c
+++ b/generic/tclZipfs.c
@@ -5896,34 +5896,39 @@ ZipFSFileAttrsGetProc(
path = TclGetStringFromObj(pathPtr, &len);
ReadLock();
z = ZipFSLookup(path);
- if (!z) {
+ if (!z && !ContainsMountPoint(path, -1)) {
Tcl_SetErrno(ENOENT);
ZIPFS_POSIX_ERROR(interp, "file not found");
ret = TCL_ERROR;
goto done;
}
+ /* z == NULL for intermediate directories that are ancestors of mounts */
switch (index) {
case ZIP_ATTR_UNCOMPSIZE:
- TclNewIntObj(*objPtrRef, z->numBytes);
+ TclNewIntObj(*objPtrRef, z ? z->numBytes : 0);
break;
case ZIP_ATTR_COMPSIZE:
- TclNewIntObj(*objPtrRef, z->numCompressedBytes);
+ TclNewIntObj(*objPtrRef, z ? z->numCompressedBytes : 0);
break;
case ZIP_ATTR_OFFSET:
- TclNewIntObj(*objPtrRef, z->offset);
+ TclNewIntObj(*objPtrRef, z ? z->offset : 0);
break;
case ZIP_ATTR_MOUNT:
- *objPtrRef = Tcl_NewStringObj(z->zipFilePtr->mountPoint,
- z->zipFilePtr->mountPointLen);
+ if (z) {
+ *objPtrRef = Tcl_NewStringObj(z->zipFilePtr->mountPoint,
+ z->zipFilePtr->mountPointLen);
+ } else {
+ *objPtrRef = Tcl_NewStringObj("", 0);
+ }
break;
case ZIP_ATTR_ARCHIVE:
- *objPtrRef = Tcl_NewStringObj(z->zipFilePtr->name, -1);
+ *objPtrRef = Tcl_NewStringObj(z ? z->zipFilePtr->name : "", -1);
break;
case ZIP_ATTR_PERMISSIONS:
*objPtrRef = Tcl_NewStringObj("0o555", -1);
break;
case ZIP_ATTR_CRC:
- TclNewIntObj(*objPtrRef, z->crc32);
+ TclNewIntObj(*objPtrRef, z ? z->crc32 : 0);
break;
default:
ZIPFS_ERROR(interp, "unknown attribute");