Index: modules/archive/src/main/java/java/util/zip/ZipFile.java =================================================================== --- modules/archive/src/main/java/java/util/zip/ZipFile.java (revision 542579) +++ modules/archive/src/main/java/java/util/zip/ZipFile.java (working copy) @@ -134,10 +134,10 @@ /** * Closes this ZipFile. */ - public void close() throws IOException { - if (fileName != null) { + public synchronized void close() throws IOException { + if (descriptor != -1 && fileName != null) { // Only close initialized instances - closeZipImpl(); + closeZipImpl(descriptor); if ((mode & OPEN_DELETE) != 0) { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { @@ -147,7 +147,7 @@ }); } } -} + } /** * Answers all of the zip entries contained in this ZipFile. @@ -204,7 +204,7 @@ private synchronized native int openZipImpl(byte[] fileName1); - private synchronized native void closeZipImpl() throws IOException; + private native void closeZipImpl(long descriptor1) throws IOException; private native ZipEntry getEntryImpl(long descriptor1, String entryName); Index: modules/archive/src/main/native/archive/shared/archiveglob.c =================================================================== --- modules/archive/src/main/native/archive/shared/archiveglob.c (revision 542579) +++ modules/archive/src/main/native/archive/shared/archiveglob.c (working copy) @@ -124,6 +124,7 @@ jclZipFile = next; } jclmem_free_memory (env, zipfileHandles); + MUTEX_DESTROY (zipfileHandles->mutex); } /* Free any global references */ Index: modules/archive/src/main/native/archive/shared/zip.c =================================================================== --- modules/archive/src/main/native/archive/shared/zip.c (revision 542579) +++ modules/archive/src/main/native/archive/shared/zip.c (working copy) @@ -96,11 +96,13 @@ * free this on UnLoad if its not already free'd. */ zipfileHandles = JCL_CACHE_GET (env, zipfile_handles); + MUTEX_ENTER (zipfileHandles->mutex); jclZipFile->last = (JCLZipFile *) zipfileHandles; jclZipFile->next = zipfileHandles->next; if (zipfileHandles->next != NULL) zipfileHandles->next->last = jclZipFile; zipfileHandles->next = jclZipFile; + MUTEX_EXIT (zipfileHandles->mutex); (*env)->SetLongField (env, recv, JCL_CACHE_GET (env, @@ -119,6 +121,7 @@ PORT_ACCESS_FROM_ENV (env); I_32 retval; + I_32 extraval; HyZipFile *zipFile; HyZipEntry zipEntry; jobject java_ZipEntry, extra; @@ -161,19 +164,26 @@ extra = NULL; if (zipEntry.extraFieldLength > 0) { + extraval = #ifndef HY_ZIP_API - zip_getZipEntryExtraField (PORTLIB, zipFile, &zipEntry, NULL, + zip_getZipEntryExtraField (PORTLIB, zipFile, &zipEntry, NULL, #else /* HY_ZIP_API */ - zipFuncs->zip_getZipEntryExtraField (VMI, zipFile, &zipEntry, NULL, + zipFuncs->zip_getZipEntryExtraField (VMI, zipFile, &zipEntry, NULL, #endif /* HY_ZIP_API */ zipEntry.extraFieldLength); - if (zipEntry.extraField == NULL) + if (extraval || zipEntry.extraField == NULL) { #ifndef HY_ZIP_API zip_freeZipEntry (PORTLIB, &zipEntry); #else /* HY_ZIP_API */ zipFuncs->zip_freeZipEntry (VMI, &zipEntry); #endif /* HY_ZIP_API */ + if (extraval) + { + char buf[50]; + sprintf (buf, "Error %d getting extra field of zip entry", extraval); + throwNewInternalError (env, buf); + } return (jobject) NULL; } extra = ((*env)->NewByteArray (env, zipEntry.extraFieldLength)); @@ -221,7 +231,7 @@ } JNIEXPORT void JNICALL -Java_java_util_zip_ZipFile_closeZipImpl (JNIEnv * env, jobject recv) +Java_java_util_zip_ZipFile_closeZipImpl (JNIEnv * env, jobject recv, jlong zipPointer) { PORT_ACCESS_FROM_ENV (env); #ifdef HY_ZIP_API @@ -229,14 +239,13 @@ #endif /* HY_ZIP_API */ I_32 retval = 0; - JCLZipFile *jclZipFile; - jfieldID descriptorFID = - JCL_CACHE_GET (env, FID_java_util_zip_ZipFile_descriptor); + jfieldID descriptorFID; + JCLZipFileLink *zipfileHandles; + JCLZipFile *jclZipFile = (JCLZipFile *) (IDATA) zipPointer; #ifdef HY_ZIP_API HyZipFunctionTable *zipFuncs = (*VMI)->GetZipFunctions(VMI); #endif /* HY_ZIP_API */ - jclZipFile = (JCLZipFile *) (IDATA) (*env)->GetLongField (env, recv, descriptorFID); if (jclZipFile != (void *) -1) { retval = @@ -245,13 +254,17 @@ #else /* HY_ZIP_API */ zipFuncs->zip_closeZipFile (VMI, &(jclZipFile->hyZipFile)); #endif /* HY_ZIP_API */ + descriptorFID = JCL_CACHE_GET (env, FID_java_util_zip_ZipFile_descriptor); (*env)->SetLongField (env, recv, descriptorFID, -1); /* Free the zip struct */ + zipfileHandles = JCL_CACHE_GET (env, zipfile_handles); + MUTEX_ENTER (zipfileHandles->mutex); if (jclZipFile->last != NULL) jclZipFile->last->next = jclZipFile->next; if (jclZipFile->next != NULL) jclZipFile->next->last = jclZipFile->last; + MUTEX_EXIT (zipfileHandles->mutex); jclmem_free_memory (env, jclZipFile); if (retval) @@ -323,6 +336,7 @@ return; zipfileHandles->last = NULL; zipfileHandles->next = NULL; + MUTEX_INIT (zipfileHandles->mutex); JCL_CACHE_SET (env, zipfile_handles, zipfileHandles); } @@ -368,6 +382,7 @@ #endif /* HY_ZIP_API */ I_32 retval; + I_32 extraval; HyZipFile *zipFile; HyZipEntry zipEntry; jobject java_ZipEntry, extra; @@ -419,12 +434,28 @@ extra = NULL; if (zipEntry.extraFieldLength > 0) { + extraval = #ifndef HY_ZIP_API - zip_getZipEntryExtraField (PORTLIB, zipFile, &zipEntry, NULL, + zip_getZipEntryExtraField (PORTLIB, zipFile, &zipEntry, NULL, #else /* HY_ZIP_API */ - zipFuncs->zip_getZipEntryExtraField (VMI, zipFile, &zipEntry, NULL, + zipFuncs->zip_getZipEntryExtraField (VMI, zipFile, &zipEntry, NULL, #endif /* HY_ZIP_API */ zipEntry.extraFieldLength); + if (extraval || zipEntry.extraField == NULL) + { +#ifndef HY_ZIP_API + zip_freeZipEntry (PORTLIB, &zipEntry); +#else /* HY_ZIP_API */ + zipFuncs->zip_freeZipEntry (VMI, &zipEntry); +#endif /* HY_ZIP_API */ + if (extraval) + { + char buf[50]; + sprintf (buf, "Error %d getting extra field of zip entry", extraval); + throwNewInternalError (env, buf); + } + return (jobject) NULL; + } extra = ((*env)->NewByteArray (env, zipEntry.extraFieldLength)); if (((*env)->ExceptionCheck (env))) { @@ -432,7 +463,7 @@ #ifndef HY_ZIP_API zip_freeZipEntry (PORTLIB, &zipEntry); #else /* HY_ZIP_API */ - zipFuncs->zip_freeZipEntry (VMI, &zipEntry); + zipFuncs->zip_freeZipEntry (VMI, &zipEntry); //not valid zipEntry (-1) #endif /* HY_ZIP_API */ return NULL; } Index: modules/archive/src/main/native/archive/shared/zip.h =================================================================== --- modules/archive/src/main/native/archive/shared/zip.h (revision 542579) +++ modules/archive/src/main/native/archive/shared/zip.h (working copy) @@ -24,6 +24,8 @@ #include "hyzip.h" #endif /* HY_ZIP_API */ +#include "hymutex.h" + typedef struct JCLZipFile { struct JCLZipFile *last; @@ -36,6 +38,7 @@ { JCLZipFile *last; JCLZipFile *next; + MUTEX mutex; } JCLZipFileLink; #endif /* zip_h */ Index: modules/luni/src/main/native/include/unix/jclprots.h =================================================================== --- modules/luni/src/main/native/include/unix/jclprots.h (revision 542579) +++ modules/luni/src/main/native/include/unix/jclprots.h (working copy) @@ -279,7 +279,7 @@ /* NativesCommonZipFile*/ void throwJavaZIOException PROTOTYPE((JNIEnv * env, const char *message)); void throwNewInternalError PROTOTYPE((JNIEnv * env, const char * message)); -void JNICALL Java_java_util_zip_ZipFile_closeZipImpl PROTOTYPE((JNIEnv * env, jobject recv)); +void JNICALL Java_java_util_zip_ZipFile_closeZipImpl PROTOTYPE((JNIEnv * env, jobject recv, jlong descriptor)); jobject JNICALL Java_java_util_zip_ZipFile_00024ZFEnum_getNextEntry PROTOTYPE((JNIEnv * env, jobject recv, jlong descriptor, jlong nextEntry)); void JNICALL Java_java_util_zip_ZipFile_ntvinit PROTOTYPE((JNIEnv * env, jclass cls)); void throwNewIllegalStateException PROTOTYPE((JNIEnv * env, const char * message)); Index: modules/luni/src/main/native/include/windows/jclprots.h =================================================================== --- modules/luni/src/main/native/include/windows/jclprots.h (revision 542579) +++ modules/luni/src/main/native/include/windows/jclprots.h (working copy) @@ -488,7 +488,7 @@ void throwJavaZIOException PROTOTYPE ((JNIEnv * env, const char *message)); void throwNewInternalError PROTOTYPE ((JNIEnv * env, const char *message)); JNIEXPORT void JNICALL Java_java_util_zip_ZipFile_closeZipImpl - PROTOTYPE ((JNIEnv * env, jobject recv)); + PROTOTYPE ((JNIEnv * env, jobject recv, jlong descriptor)); JNIEXPORT jobject JNICALL Java_java_util_zip_ZipFile_00024ZFEnum_getNextEntry PROTOTYPE ((JNIEnv * env, jobject recv, jlong descriptor, jlong nextEntry));