提交 16781b7a 编写于 作者: S sherman

6728376: Wrong error handling in Java_java_util_zip_Deflater_deflateBytes...

6728376: Wrong error handling in Java_java_util_zip_Deflater_deflateBytes leads to size 0 if compress fails
6735255: ZipFile.close() does not close ZipFileInputStreams, contrary to the API document
Summary: Throws OOM when malloc failed. Closes all outstanding streams when closing
Reviewed-by: alanb
上级 cb29af1f
......@@ -32,6 +32,8 @@ import java.io.File;
import java.nio.charset.Charset;
import java.util.Vector;
import java.util.Enumeration;
import java.util.Set;
import java.util.HashSet;
import java.util.NoSuchElementException;
import static java.util.zip.ZipConstants64.*;
......@@ -277,6 +279,9 @@ class ZipFile implements ZipConstants {
// freeEntry releases the C jzentry struct.
private static native void freeEntry(long jzfile, long jzentry);
// the outstanding inputstreams that need to be closed.
private Set<ZipFileInputStream> streams = new HashSet<ZipFileInputStream>();
/**
* Returns an input stream for reading the contents of the specified
* zip file entry.
......@@ -308,6 +313,7 @@ class ZipFile implements ZipConstants {
return null;
}
in = new ZipFileInputStream(jzentry);
streams.add(in);
}
final ZipFileInputStream zfin = in;
switch (getEntryMethod(jzentry)) {
......@@ -323,7 +329,7 @@ class ZipFile implements ZipConstants {
public void close() throws IOException {
if (!isClosed) {
releaseInflater(inf);
releaseInflater(inf);
this.in.close();
isClosed = true;
}
......@@ -497,6 +503,13 @@ class ZipFile implements ZipConstants {
synchronized (this) {
closeRequested = true;
if (streams.size() !=0) {
Set<ZipFileInputStream> copy = streams;
streams = new HashSet<ZipFileInputStream>();
for (ZipFileInputStream is: copy)
is.close();
}
if (jzfile != 0) {
// Close the zip file
long zf = this.jzfile;
......@@ -631,9 +644,9 @@ class ZipFile implements ZipConstants {
freeEntry(ZipFile.this.jzfile, jzentry);
jzentry = 0;
}
streams.remove(this);
}
}
}
......
......@@ -138,6 +138,7 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this,
in_buf = (jbyte *) malloc(this_len);
if (in_buf == 0) {
JNU_ThrowOutOfMemoryError(env, 0);
return 0;
}
(*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf);
......@@ -145,6 +146,7 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this,
out_buf = (jbyte *) malloc(len);
if (out_buf == 0) {
free(in_buf);
JNU_ThrowOutOfMemoryError(env, 0);
return 0;
}
......@@ -179,6 +181,7 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this,
in_buf = (jbyte *) malloc(this_len);
if (in_buf == 0) {
JNU_ThrowOutOfMemoryError(env, 0);
return 0;
}
(*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf);
......@@ -186,6 +189,7 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this,
out_buf = (jbyte *) malloc(len);
if (out_buf == 0) {
free(in_buf);
JNU_ThrowOutOfMemoryError(env, 0);
return 0;
}
......
......@@ -125,6 +125,7 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this,
in_buf = (jbyte *) malloc(this_len);
if (in_buf == 0) {
JNU_ThrowOutOfMemoryError(env, 0);
return 0;
}
(*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf);
......@@ -132,6 +133,7 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this,
out_buf = (jbyte *) malloc(len);
if (out_buf == 0) {
free(in_buf);
JNU_ThrowOutOfMemoryError(env, 0);
return 0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册