summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.fossil-settings/binary-glob1
-rw-r--r--generic/tcl.decls7
-rw-r--r--generic/tclPlatDecls.h27
-rw-r--r--generic/tclStubInit.c7
-rw-r--r--generic/tclZipfs.c164
-rw-r--r--tools/empty.zipbin0 -> 22 bytes
-rw-r--r--unix/Makefile.in1
-rw-r--r--win/Makefile.in1
8 files changed, 121 insertions, 87 deletions
diff --git a/.fossil-settings/binary-glob b/.fossil-settings/binary-glob
index ec574be..5eebf07 100644
--- a/.fossil-settings/binary-glob
+++ b/.fossil-settings/binary-glob
@@ -4,6 +4,7 @@ compat/zlib/win64/zdll.lib
compat/zlib/win64/zlib1.dll
compat/zlib/win64/libz.dll.a
compat/zlib/zlib.3.pdf
+tools/empty.zip
*.bmp
*.gif
*.png \ No newline at end of file
diff --git a/generic/tcl.decls b/generic/tcl.decls
index 1fa9a04..92e87d6 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -2330,8 +2330,6 @@ declare 631 {
ClientData callbackData)
}
-# ----- BASELINE -- FOR -- 8.7.0 ----- #
-
# TIP #430
declare 632 {
int TclZipfs_Mount(
@@ -2354,6 +2352,9 @@ declare 635 {
size_t datalen,
int copy)
}
+
+# ----- BASELINE -- FOR -- 8.7.0 ----- #
+
##############################################################################
# Define the platform specific public Tcl interface. These functions are only
@@ -2364,7 +2365,7 @@ interface tclPlat
################################
# Unix specific functions
# (none)
-declare 0 unix {
+declare 2 unix {
int TclZipfs_AppHook(int *argc, char ***argv)
}
diff --git a/generic/tclPlatDecls.h b/generic/tclPlatDecls.h
index e746a6d..ac3f921 100644
--- a/generic/tclPlatDecls.h
+++ b/generic/tclPlatDecls.h
@@ -51,7 +51,9 @@ extern "C" {
*/
#if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(MAC_OSX_TCL) /* UNIX */
-/* 0 */
+/* Slot 0 is reserved */
+/* Slot 1 is reserved */
+/* 2 */
EXTERN int TclZipfs_AppHook(int *argc, char ***argv);
#endif /* UNIX */
#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */
@@ -66,13 +68,17 @@ EXTERN int TclZipfs_AppHook(int *argc, TCHAR ***argv);
#endif /* WIN */
#ifdef MAC_OSX_TCL /* MACOSX */
/* 0 */
-EXTERN int TclZipfs_AppHook(int *argc, char ***argv);
+EXTERN int Tcl_MacOSXOpenBundleResources(Tcl_Interp *interp,
+ const char *bundleName, int hasResourceFile,
+ int maxPathLen, char *libraryPath);
/* 1 */
EXTERN int Tcl_MacOSXOpenVersionedBundleResources(
Tcl_Interp *interp, const char *bundleName,
const char *bundleVersion,
int hasResourceFile, int maxPathLen,
char *libraryPath);
+/* 2 */
+EXTERN int TclZipfs_AppHook(int *argc, char ***argv);
#endif /* MACOSX */
typedef struct TclPlatStubs {
@@ -80,7 +86,9 @@ typedef struct TclPlatStubs {
void *hooks;
#if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(MAC_OSX_TCL) /* UNIX */
- int (*tclZipfs_AppHook) (int *argc, char ***argv); /* 0 */
+ void (*reserved0)(void);
+ void (*reserved1)(void);
+ int (*tclZipfs_AppHook) (int *argc, char ***argv); /* 2 */
#endif /* UNIX */
#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */
TCHAR * (*tcl_WinUtfToTChar) (const char *str, int len, Tcl_DString *dsPtr); /* 0 */
@@ -88,8 +96,9 @@ typedef struct TclPlatStubs {
int (*tclZipfs_AppHook) (int *argc, TCHAR ***argv); /* 2 */
#endif /* WIN */
#ifdef MAC_OSX_TCL /* MACOSX */
- int (*tclZipfs_AppHook) (int *argc, char ***argv); /* 0 */
+ int (*tcl_MacOSXOpenBundleResources) (Tcl_Interp *interp, const char *bundleName, int hasResourceFile, int maxPathLen, char *libraryPath); /* 0 */
int (*tcl_MacOSXOpenVersionedBundleResources) (Tcl_Interp *interp, const char *bundleName, const char *bundleVersion, int hasResourceFile, int maxPathLen, char *libraryPath); /* 1 */
+ int (*tclZipfs_AppHook) (int *argc, char ***argv); /* 2 */
#endif /* MACOSX */
} TclPlatStubs;
@@ -106,8 +115,10 @@ extern const TclPlatStubs *tclPlatStubsPtr;
*/
#if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(MAC_OSX_TCL) /* UNIX */
+/* Slot 0 is reserved */
+/* Slot 1 is reserved */
#define TclZipfs_AppHook \
- (tclPlatStubsPtr->tclZipfs_AppHook) /* 0 */
+ (tclPlatStubsPtr->tclZipfs_AppHook) /* 2 */
#endif /* UNIX */
#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */
#define Tcl_WinUtfToTChar \
@@ -118,10 +129,12 @@ extern const TclPlatStubs *tclPlatStubsPtr;
(tclPlatStubsPtr->tclZipfs_AppHook) /* 2 */
#endif /* WIN */
#ifdef MAC_OSX_TCL /* MACOSX */
-#define TclZipfs_AppHook \
- (tclPlatStubsPtr->tclZipfs_AppHook) /* 0 */
+#define Tcl_MacOSXOpenBundleResources \
+ (tclPlatStubsPtr->tcl_MacOSXOpenBundleResources) /* 0 */
#define Tcl_MacOSXOpenVersionedBundleResources \
(tclPlatStubsPtr->tcl_MacOSXOpenVersionedBundleResources) /* 1 */
+#define TclZipfs_AppHook \
+ (tclPlatStubsPtr->tclZipfs_AppHook) /* 2 */
#endif /* MACOSX */
#endif /* defined(USE_TCL_STUBS) */
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index 93ec08a..bf3a8d1 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -838,7 +838,9 @@ static const TclPlatStubs tclPlatStubs = {
TCL_STUB_MAGIC,
0,
#if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(MAC_OSX_TCL) /* UNIX */
- TclZipfs_AppHook, /* 0 */
+ 0, /* 0 */
+ 0, /* 1 */
+ TclZipfs_AppHook, /* 2 */
#endif /* UNIX */
#if defined(_WIN32) || defined(__CYGWIN__) /* WIN */
Tcl_WinUtfToTChar, /* 0 */
@@ -846,8 +848,9 @@ static const TclPlatStubs tclPlatStubs = {
TclZipfs_AppHook, /* 2 */
#endif /* WIN */
#ifdef MAC_OSX_TCL /* MACOSX */
- TclZipfs_AppHook, /* 0 */
+ Tcl_MacOSXOpenBundleResources, /* 0 */
Tcl_MacOSXOpenVersionedBundleResources, /* 1 */
+ TclZipfs_AppHook, /* 2 */
#endif /* MACOSX */
};
diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c
index b6c8a00..55b854b 100644
--- a/generic/tclZipfs.c
+++ b/generic/tclZipfs.c
@@ -172,23 +172,23 @@ typedef struct ZipFile {
char is_membuf; /* When true, not a file but a memory buffer */
Tcl_Channel chan; /* Channel handle or NULL */
unsigned char *data; /* Memory mapped or malloc'ed file */
- long length; /* Length of memory mapped file */
+ size_t length; /* Length of memory mapped file */
unsigned char *tofree; /* Non-NULL if malloc'ed file */
- int nfiles; /* Number of files in archive */
- unsigned long baseoffs; /* Archive start */
- long baseoffsp; /* Password start */
- unsigned long centoffs; /* Archive directory start */
- unsigned char pwbuf[264]; /* Password buffer */
+ size_t nfiles; /* Number of files in archive */
+ size_t baseoffs; /* Archive start */
+ size_t baseoffsp; /* Password start */
+ size_t centoffs; /* Archive directory start */
+ unsigned char pwbuf[264]; /* Password buffer */
#if defined(_WIN32) || defined(_WIN64)
HANDLE mh;
#endif
- unsigned long nopen; /* Number of open files on archive */
+ size_t nopen; /* Number of open files on archive */
struct ZipEntry *entries; /* List of files in archive */
struct ZipEntry *topents; /* List of top-level dirs in archive */
#if HAS_DRIVES
- int mntdrv; /* Drive letter of mount point */
+ int mntdrv; /* Drive letter of mount point */
#endif
- int mntptlen;
+ size_t mntptlen;
char *mntpt; /* Mount point */
} ZipFile;
@@ -199,7 +199,7 @@ typedef struct ZipFile {
typedef struct ZipEntry {
char *name; /* The full pathname of the virtual file */
ZipFile *zipfile; /* The ZIP file holding this virtual file */
- long offset; /* Data offset into memory mapped ZIP file */
+ Tcl_WideInt offset; /* Data offset into memory mapped ZIP file */
int nbyte; /* Uncompressed size of the virtual file */
int nbytecompr; /* Compressed size of the virtual file */
int cmeth; /* Compress method */
@@ -220,12 +220,12 @@ typedef struct ZipEntry {
typedef struct ZipChannel {
ZipFile *zipfile; /* The ZIP file holding this channel */
ZipEntry *zipentry; /* Pointer back to virtual file */
- unsigned long nmax; /* Max. size for write */
- unsigned long nbyte; /* Number of bytes of uncompressed data */
- unsigned long nread; /* Pos of next byte to be read from the channel */
+ size_t nmax; /* Max. size for write */
+ size_t nbyte; /* Number of bytes of uncompressed data */
+ size_t nread; /* Pos of next byte to be read from the channel */
unsigned char *ubuf; /* Pointer to the uncompressed data */
int iscompr; /* True if data is compressed */
- int isdir; /* Set to 1 if directory, or -1 if root */
+ int isdir; /* Set to 1 if directory, or -1 if root */
int isenc; /* True if data is encrypted */
int iswr; /* True if open for writing */
unsigned long keys[3]; /* Key for decryption */
@@ -907,7 +907,7 @@ ZipFSCloseArchive(Tcl_Interp *interp, ZipFile *zf)
static int
ZipFS_Find_TOC(Tcl_Interp *interp, int needZip, ZipFile *zf)
{
- int i;
+ size_t i;
unsigned char *p, *q;
p = zf->data + zf->length - ZIP_CENTRAL_END_LEN;
while (p >= zf->data) {
@@ -1012,7 +1012,7 @@ error:
static int
ZipFSOpenArchive(Tcl_Interp *interp, const char *zipname, int needZip, ZipFile *zf)
{
- int i;
+ size_t i;
ClientData handle;
zf->namelen=0;
zf->is_membuf=0;
@@ -1039,7 +1039,7 @@ ZipFSOpenArchive(Tcl_Interp *interp, const char *zipname, int needZip, ZipFile *
goto error;
}
zf->length = Tcl_Seek(zf->chan, 0, SEEK_END);
- if ((zf->length <= 0) || (zf->length > 64 * 1024 * 1024)) {
+ if ((zf->length - ZIP_CENTRAL_END_LEN) > (64 * 1024 * 1024 - ZIP_CENTRAL_END_LEN)) {
ZIPFS_ERROR(interp,"illegal file size");
goto error;
}
@@ -1058,9 +1058,15 @@ ZipFSOpenArchive(Tcl_Interp *interp, const char *zipname, int needZip, ZipFile *
zf->chan = NULL;
} else {
#if defined(_WIN32) || defined(_WIN64)
+# ifdef _WIN64
+ i = GetFileSizeEx((HANDLE) handle, (PLARGE_INTEGER)&zf->length);
+ if (
+ (i == 0) ||
+# else
zf->length = GetFileSize((HANDLE) handle, 0);
if (
- (zf->length == INVALID_FILE_SIZE) ||
+ (zf->length == (size_t)INVALID_FILE_SIZE) ||
+# endif
(zf->length < ZIP_CENTRAL_END_LEN)
) {
ZIPFS_ERROR(interp,"invalid file size");
@@ -1078,15 +1084,15 @@ ZipFSOpenArchive(Tcl_Interp *interp, const char *zipname, int needZip, ZipFile *
goto error;
}
#else
- zf->length = lseek((int) (long) handle, 0, SEEK_END);
- if ((zf->length == -1) || (zf->length < ZIP_CENTRAL_END_LEN)) {
+ zf->length = lseek(PTR2INT(handle), 0, SEEK_END);
+ if ((zf->length == (size_t)-1) || (zf->length < ZIP_CENTRAL_END_LEN)) {
ZIPFS_ERROR(interp,"invalid file size");
goto error;
}
- lseek((int) (long) handle, 0, SEEK_SET);
+ lseek(PTR2INT(handle), 0, SEEK_SET);
zf->data = (unsigned char *) mmap(0, zf->length, PROT_READ,
MAP_FILE | MAP_PRIVATE,
- (int) (long) handle, 0);
+ PTR2INT(handle), 0);
if (zf->data == MAP_FAILED) {
ZIPFS_ERROR(interp,"file mapping failed");
goto error;
@@ -1118,15 +1124,13 @@ error:
static int
ZipFS_Catalogue_Filesystem(Tcl_Interp *interp, ZipFile *zf0, const char *mntpt, const char *passwd, const char *zipname)
{
- int i, pwlen, isNew;
+ int pwlen, isNew;
+ size_t i;
ZipFile *zf;
ZipEntry *z;
Tcl_HashEntry *hPtr;
Tcl_DString ds, dsm, fpBuf;
unsigned char *q;
-#if HAS_DRIVES
- int drive = 0;
-#endif
WriteLock();
pwlen = 0;
@@ -1220,7 +1224,8 @@ ZipFS_Catalogue_Filesystem(Tcl_Interp *interp, ZipFile *zf0, const char *mntpt,
q = zf->data + zf->centoffs;
Tcl_DStringInit(&fpBuf);
for (i = 0; i < zf->nfiles; i++) {
- int pathlen, comlen, extra, isdir = 0, dosTime, dosDate, nbcompr, offs;
+ int extra, isdir = 0, dosTime, dosDate, nbcompr;
+ size_t offs, pathlen, comlen;
unsigned char *lq, *gq = NULL;
char *fullpath, *path;
@@ -1914,8 +1919,10 @@ ZipAddFile(
ZipEntry *z;
z_stream stream;
const char *zpath;
- int nbyte, nbytecompr, len, crc, flush, pos[3], zpathlen, olen;
- int mtime = 0, isNew, align = 0, cmeth;
+ int crc, flush, zpathlen, olen;
+ size_t nbyte, nbytecompr, len, align = 0;
+ Tcl_WideInt pos[3];
+ int mtime = 0, isNew, cmeth;
unsigned long keys[3], keys0[3];
char obuf[4096];
@@ -1959,11 +1966,11 @@ ZipAddFile(
Tcl_ResetResult(interp);
crc = 0;
nbyte = nbytecompr = 0;
- while ((len = Tcl_Read(in, buf, bufsize)) > 0) {
+ while ((len = Tcl_Read(in, buf, bufsize)) + 1 > 1) {
crc = crc32(crc, (unsigned char *) buf, len);
nbyte += len;
}
- if (len == -1) {
+ if (len == (size_t)-1) {
if (nbyte == 0) {
if (strcmp("illegal operation on a directory",
Tcl_PosixError(interp)) == 0) {
@@ -1986,7 +1993,7 @@ ZipAddFile(
memset(buf, '\0', ZIP_LOCAL_HEADER_LEN);
memcpy(buf + ZIP_LOCAL_HEADER_LEN, zpath, zpathlen);
len = zpathlen + ZIP_LOCAL_HEADER_LEN;
- if (Tcl_Write(out, buf, len) != len) {
+ if ((size_t)Tcl_Write(out, buf, len) != len) {
wrerr:
Tcl_AppendResult(interp, "write error", (char *) NULL);
Tcl_Close(interp, in);
@@ -2003,7 +2010,7 @@ wrerr:
zip_write_short(abuf, 0xffff);
zip_write_short(abuf + 2, align - 4);
zip_write_int(abuf + 4, 0x03020100);
- if (Tcl_Write(out, (const char *)abuf, align) != align) {
+ if ((size_t)Tcl_Write(out, (const char *)abuf, align) != align) {
goto wrerr;
}
}
@@ -2058,7 +2065,7 @@ wrerr:
}
do {
len = Tcl_Read(in, buf, bufsize);
- if (len == -1) {
+ if (len == (size_t)-1) {
Tcl_AppendResult(interp, "read error on \"", path, "\"",
(char *) NULL);
deflateEnd(&stream);
@@ -2072,7 +2079,7 @@ wrerr:
stream.avail_out = sizeof (obuf);
stream.next_out = (unsigned char *) obuf;
len = deflate(&stream, flush);
- if (len == Z_STREAM_ERROR) {
+ if (len == (size_t)Z_STREAM_ERROR) {
Tcl_AppendResult(interp, "deflate error on \"", path, "\"",
(char *) NULL);
deflateEnd(&stream);
@@ -2104,10 +2111,10 @@ wrerr:
* Compressed file larger than input,
* write it again uncompressed.
*/
- if ((int) Tcl_Seek(in, 0, SEEK_SET) != 0) {
+ if (Tcl_Seek(in, 0, SEEK_SET) != 0) {
goto seekErr;
}
- if ((int) Tcl_Seek(out, pos[2], SEEK_SET) != pos[2]) {
+ if (Tcl_Seek(out, pos[2], SEEK_SET) != pos[2]) {
seekErr:
Tcl_Close(interp, in);
Tcl_AppendResult(interp, "seek error", (char *) NULL);
@@ -2116,7 +2123,7 @@ seekErr:
nbytecompr = (passwd != NULL) ? 12 : 0;
while (1) {
len = Tcl_Read(in, buf, bufsize);
- if (len == -1) {
+ if (len == (size_t)-1) {
Tcl_AppendResult(interp, "read error on \"", path, "\"",
(char *) NULL);
Tcl_Close(interp, in);
@@ -2125,13 +2132,14 @@ seekErr:
break;
}
if (passwd != NULL) {
- int i, tmp;
+ size_t i;
+ int tmp;
for (i = 0; i < len; i++) {
buf[i] = (char) zencode(keys0, crc32tab, buf[i], tmp);
}
}
- if (Tcl_Write(out, buf, len) != len) {
+ if ((size_t)Tcl_Write(out, buf, len) != len) {
Tcl_AppendResult(interp, "write error", (char *) NULL);
Tcl_Close(interp, in);
return TCL_ERROR;
@@ -2185,7 +2193,7 @@ seekErr:
zip_write_int(buf + ZIP_LOCAL_UNCOMPLEN_OFFS, z->nbyte);
zip_write_short(buf + ZIP_LOCAL_PATHLEN_OFFS, zpathlen);
zip_write_short(buf + ZIP_LOCAL_EXTRALEN_OFFS, align);
- if ((int) Tcl_Seek(out, pos[0], SEEK_SET) != pos[0]) {
+ if (Tcl_Seek(out, pos[0], SEEK_SET) != pos[0]) {
Tcl_DeleteHashEntry(hPtr);
Tcl_Free((char *) z);
Tcl_AppendResult(interp, "seek error", (char *) NULL);
@@ -2198,7 +2206,7 @@ seekErr:
return TCL_ERROR;
}
Tcl_Flush(out);
- if ((int) Tcl_Seek(out, pos[1], SEEK_SET) != pos[1]) {
+ if (Tcl_Seek(out, pos[1], SEEK_SET) != pos[1]) {
Tcl_DeleteHashEntry(hPtr);
Tcl_Free((char *) z);
Tcl_AppendResult(interp, "seek error", (char *) NULL);
@@ -2231,7 +2239,9 @@ ZipFSMkZipOrImgObjCmd(ClientData clientData, Tcl_Interp *interp,
int isImg, int isList, int objc, Tcl_Obj *const objv[])
{
Tcl_Channel out;
- int len = 0, pwlen = 0, slen = 0, i, count, ret = TCL_ERROR, lobjc, pos[3];
+ int pwlen = 0, count, ret = TCL_ERROR, lobjc;
+ size_t len, slen = 0, i = 0;
+ Tcl_WideInt pos[3];
Tcl_Obj **lobjv, *list = NULL;
ZipEntry *z;
Tcl_HashEntry *hPtr;
@@ -2358,8 +2368,7 @@ ZipFSMkZipOrImgObjCmd(ClientData clientData, Tcl_Interp *interp,
}
if (isMounted ||
(ZipFSOpenArchive(interp, imgName, 0, zf) == TCL_OK)) {
- i = Tcl_Write(out, (char *) zf->data, zf->baseoffsp);
- if (i != zf->baseoffsp) {
+ if ((size_t)Tcl_Write(out, (char *) zf->data, zf->baseoffsp) != zf->baseoffsp) {
memset(pwbuf, 0, sizeof (pwbuf));
Tcl_DecrRefCount(list);
Tcl_SetObjResult(interp, Tcl_NewStringObj("write error", -1));
@@ -2381,7 +2390,8 @@ ZipFSMkZipOrImgObjCmd(ClientData clientData, Tcl_Interp *interp,
Unlock();
}
} else {
- int k, m, n;
+ size_t k;
+ int m, n;
Tcl_Channel in;
const char *errMsg = "seek error";
@@ -2401,7 +2411,7 @@ ZipFSMkZipOrImgObjCmd(ClientData clientData, Tcl_Interp *interp,
Tcl_SetChannelOption(interp, in, "-translation", "binary");
Tcl_SetChannelOption(interp, in, "-encoding", "binary");
i = Tcl_Seek(in, 0, SEEK_END);
- if (i == -1) {
+ if (i == (size_t)-1) {
cperr:
memset(pwbuf, 0, sizeof (pwbuf));
Tcl_DecrRefCount(list);
@@ -2452,7 +2462,7 @@ cperr:
strip = Tcl_GetString(objv[3]);
slen = strlen(strip);
}
- for (i = 0; i < lobjc; i += (isList ? 2 : 1)) {
+ for (i = 0; i < (size_t)lobjc; i += (isList ? 2 : 1)) {
const char *path, *name;
path = Tcl_GetString(lobjv[i]);
@@ -2481,7 +2491,7 @@ cperr:
}
pos[1] = Tcl_Tell(out);
count = 0;
- for (i = 0; i < lobjc; i += (isList ? 2 : 1)) {
+ for (i = 0; i < (size_t)lobjc; i += (isList ? 2 : 1)) {
const char *path, *name;
path = Tcl_GetString(lobjv[i]);
@@ -2528,7 +2538,7 @@ cperr:
zip_write_int(buf + ZIP_CENTRAL_LOCALHDR_OFFS, z->offset - pos[0]);
if (
(Tcl_Write(out, buf, ZIP_CENTRAL_HEADER_LEN) != ZIP_CENTRAL_HEADER_LEN)
- || (Tcl_Write(out, z->name, len) != len)
+ || ((size_t)Tcl_Write(out, z->name, len) != len)
) {
Tcl_SetObjResult(interp, Tcl_NewStringObj("write error", -1));
goto done;
@@ -2766,9 +2776,9 @@ ZipFSInfoObjCmd(
Tcl_ListObjAppendElement(interp, result,
Tcl_NewStringObj(z->zipfile->name, -1));
- Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj(z->nbyte));
- Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj(z->nbytecompr));
- Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj(z->offset));
+ Tcl_ListObjAppendElement(interp, result, Tcl_NewWideIntObj(z->nbyte));
+ Tcl_ListObjAppendElement(interp, result, Tcl_NewWideIntObj(z->nbytecompr));
+ Tcl_ListObjAppendElement(interp, result, Tcl_NewWideIntObj(z->offset));
}
Unlock();
return TCL_OK;
@@ -2888,7 +2898,11 @@ Tcl_Obj *TclZipfs_TclLibrary(void) {
} else {
Tcl_Obj *vfsinitscript;
int found=0;
-
+#if defined(_WIN32) || defined(_WIN64)
+ HMODULE hModule = TclWinGetTclInstance();
+ WCHAR wName[MAX_PATH + LIBRARY_SIZE];
+ char dllname[(MAX_PATH + LIBRARY_SIZE) * TCL_UTF_MAX];
+#endif
/* Look for the library file system within the executable */
vfsinitscript=Tcl_NewStringObj(ZIPFS_APP_MOUNT "/tcl_library/init.tcl",-1);
Tcl_IncrRefCount(vfsinitscript);
@@ -2899,10 +2913,6 @@ Tcl_Obj *TclZipfs_TclLibrary(void) {
return Tcl_NewStringObj(zipfs_literal_tcl_library,-1);
}
#if defined(_WIN32) || defined(_WIN64)
- HMODULE hModule = TclWinGetTclInstance();
- WCHAR wName[MAX_PATH + LIBRARY_SIZE];
- char dllname[(MAX_PATH + LIBRARY_SIZE) * TCL_UTF_MAX];
-
if (GetModuleFileNameW(hModule, wName, MAX_PATH) == 0) {
GetModuleFileNameA(hModule, dllname, MAX_PATH);
} else {
@@ -3570,7 +3580,7 @@ cerror:
}
}
wrapchan:
- sprintf(cname, "zipfs_%lx_%d", (unsigned long) z->offset, ZipFS.idCount++);
+ sprintf(cname, "zipfs_%" TCL_LL_MODIFIER "x_%d", z->offset, ZipFS.idCount++);
z->zipfile->nopen++;
Unlock();
return Tcl_CreateChannel(&ZipChannelType, cname, (ClientData) info, flags);
@@ -3774,7 +3784,8 @@ Zip_FSMatchInDirectoryProc(Tcl_Interp* interp, Tcl_Obj *result,
Tcl_HashEntry *hPtr;
Tcl_HashSearch search;
Tcl_Obj *normPathPtr;
- int scnt, len, l, dirOnly = -1, prefixLen, strip = 0;
+ int scnt, l, dirOnly = -1, prefixLen, strip = 0;
+ size_t len;
char *pat, *prefix, *path;
Tcl_DString dsPref;
@@ -3788,7 +3799,8 @@ Zip_FSMatchInDirectoryProc(Tcl_Interp* interp, Tcl_Obj *result,
prefix = Tcl_GetStringFromObj(pathPtr, &prefixLen);
/* the (normalized) path we're searching */
- path = Tcl_GetStringFromObj(normPathPtr, &len);
+ path = Tcl_GetString(normPathPtr);
+ len = normPathPtr->length;
Tcl_DStringInit(&dsPref);
Tcl_DStringAppend(&dsPref, prefix, prefixLen);
@@ -3821,7 +3833,7 @@ Zip_FSMatchInDirectoryProc(Tcl_Interp* interp, Tcl_Obj *result,
if (zf->mntptlen == 0) {
ZipEntry *z = zf->topents;
while (z != NULL) {
- int lenz = strlen(z->name);
+ size_t lenz = strlen(z->name);
if (
(lenz > len + 1)
&& (strncmp(z->name, path, len) == 0)
@@ -3954,17 +3966,18 @@ Zip_FSPathInFilesystemProc(Tcl_Obj *pathPtr, ClientData *clientDataPtr)
Tcl_HashEntry *hPtr;
Tcl_HashSearch search;
ZipFile *zf;
- int ret = -1, len;
+ int ret = -1;
+ size_t len;
char *path;
if (!(pathPtr = Tcl_FSGetNormalizedPath(NULL, pathPtr))) return -1;
- path = Tcl_GetStringFromObj(pathPtr, &len);
+ path = Tcl_GetString(pathPtr);
if(strncmp(path,ZIPFS_VOLUME,ZIPFS_VOLUME_LEN)!=0) {
return -1;
}
- len = strlen(path);
+ len = pathPtr->length;
ReadLock();
hPtr = Tcl_FindHashEntry(&ZipFS.fileHash, path);
@@ -3978,7 +3991,7 @@ Zip_FSPathInFilesystemProc(Tcl_Obj *pathPtr, ClientData *clientDataPtr)
if (zf->mntptlen == 0) {
ZipEntry *z = zf->topents;
while (z != NULL) {
- int lenz = strlen(z->name);
+ size_t lenz = strlen(z->name);
if (
(len >= lenz) && (strncmp(path, z->name, lenz) == 0)
) {
@@ -4091,13 +4104,13 @@ Zip_FSFileAttrsGetProc(Tcl_Interp *interp, int index, Tcl_Obj *pathPtr,
}
switch (index) {
case 0:
- *objPtrRef = Tcl_NewIntObj(z->nbyte);
+ *objPtrRef = Tcl_NewWideIntObj(z->nbyte);
goto done;
case 1:
- *objPtrRef= Tcl_NewIntObj(z->nbytecompr);
+ *objPtrRef = Tcl_NewWideIntObj(z->nbytecompr);
goto done;
case 2:
- *objPtrRef= Tcl_NewLongObj(z->offset);
+ *objPtrRef= Tcl_NewWideIntObj(z->offset);
goto done;
case 3:
*objPtrRef= Tcl_NewStringObj(z->zipfile->mntpt, z->zipfile->mntptlen);
@@ -4310,14 +4323,15 @@ TclZipfs_Init(Tcl_Interp *interp)
Unlock();
if(interp != NULL) {
static const EnsembleImplMap initMap[] = {
- {"mount", ZipFSMountObjCmd, NULL, NULL, NULL, 0},
- {"mount_data", ZipFSMountBufferObjCmd, NULL, NULL, NULL, 0},
- {"unmount", ZipFSUnmountObjCmd, NULL, NULL, NULL, 0},
- {"mkkey", ZipFSMkKeyObjCmd, NULL, NULL, NULL, 0},
{"mkimg", ZipFSMkImgObjCmd, NULL, NULL, NULL, 0},
{"mkzip", ZipFSMkZipObjCmd, NULL, NULL, NULL, 0},
{"lmkimg", ZipFSLMkImgObjCmd, NULL, NULL, NULL, 0},
{"lmkzip", ZipFSLMkZipObjCmd, NULL, NULL, NULL, 0},
+ /* The 4 entries above are not available in safe interpreters */
+ {"mount", ZipFSMountObjCmd, NULL, NULL, NULL, 0},
+ {"mount_data", ZipFSMountBufferObjCmd, NULL, NULL, NULL, 0},
+ {"unmount", ZipFSUnmountObjCmd, NULL, NULL, NULL, 0},
+ {"mkkey", ZipFSMkKeyObjCmd, NULL, NULL, NULL, 0},
{"exists", ZipFSExistsObjCmd, NULL, NULL, NULL, 1},
{"info", ZipFSInfoObjCmd, NULL, NULL, NULL, 1},
{"list", ZipFSListObjCmd, NULL, NULL, NULL, 1},
@@ -4348,7 +4362,7 @@ TclZipfs_Init(Tcl_Interp *interp)
"}\n";
Tcl_EvalEx(interp, findproc, -1, TCL_EVAL_GLOBAL);
Tcl_LinkVar(interp, "::tcl::zipfs::wrmax", (char *) &ZipFS.wrmax,TCL_LINK_INT);
- TclMakeEnsemble(interp, "zipfs", initMap);
+ TclMakeEnsemble(interp, "zipfs", Tcl_IsSafe(interp) ? (initMap+4) : initMap);
Tcl_PkgProvide(interp, "zipfs", "2.0");
}
return TCL_OK;
@@ -4399,7 +4413,7 @@ int TclZipfs_AppHook(int *argc, char ***argv)
*/
char *archive;
- Tcl_FindExecutable(*argv[0]);
+ Tcl_FindExecutable((*argv)[0]);
archive=(char *)Tcl_GetNameOfExecutable();
TclZipfs_Init(NULL);
/*
diff --git a/tools/empty.zip b/tools/empty.zip
new file mode 100644
index 0000000..15cb0ec
--- /dev/null
+++ b/tools/empty.zip
Binary files differ
diff --git a/unix/Makefile.in b/unix/Makefile.in
index cdf7378..1028ead 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -712,6 +712,7 @@ ${TCL_EXE}: ${TCLSH_OBJS} ${TCL_LIB_FILE} ${TCL_STUB_LIB_FILE}
${CC} ${CFLAGS} ${LDFLAGS} ${TCLSH_OBJS} \
@TCL_BUILD_LIB_SPEC@ ${TCL_STUB_LIB_FILE} ${LIBS} @EXTRA_TCLSH_LIBS@ \
${CC_SEARCH_FLAGS} -o ${TCL_EXE}
+ cat ${TOOL_DIR}/empty.zip >> ${TCL_EXE}
# Must be empty so it doesn't conflict with rule for ${TCL_EXE} above
${NATIVE_TCLSH}:
diff --git a/win/Makefile.in b/win/Makefile.in
index a7be485..1d9c522 100644
--- a/win/Makefile.in
+++ b/win/Makefile.in
@@ -492,6 +492,7 @@ $(TCLSH): $(TCLSH_OBJS) @LIBRARIES@ $(TCL_STUB_LIB_FILE) tclsh.$(RES)
$(CC) $(CFLAGS) $(TCLSH_OBJS) $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE) $(LIBS) \
tclsh.$(RES) $(CC_EXENAME) $(LDFLAGS_CONSOLE)
@VC_MANIFEST_EMBED_EXE@
+ cat ${TOOL_DIR}/empty.zip >> ${TCLSH}
cat32.$(OBJEXT): cat.c
$(CC) -c $(CC_SWITCHES) @DEPARG@ $(CC_OBJNAME)