提交 9bb6aa63 编写于 作者: C coffeys

8029020: Check src/share/native/java/util/zip code for JNI pending exceptions

Reviewed-by: alanb, chegar
上级 df383657
/* /*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -49,13 +49,21 @@ JNIEXPORT void JNICALL ...@@ -49,13 +49,21 @@ JNIEXPORT void JNICALL
Java_java_util_zip_Deflater_initIDs(JNIEnv *env, jclass cls) Java_java_util_zip_Deflater_initIDs(JNIEnv *env, jclass cls)
{ {
levelID = (*env)->GetFieldID(env, cls, "level", "I"); levelID = (*env)->GetFieldID(env, cls, "level", "I");
CHECK_NULL(levelID);
strategyID = (*env)->GetFieldID(env, cls, "strategy", "I"); strategyID = (*env)->GetFieldID(env, cls, "strategy", "I");
CHECK_NULL(strategyID);
setParamsID = (*env)->GetFieldID(env, cls, "setParams", "Z"); setParamsID = (*env)->GetFieldID(env, cls, "setParams", "Z");
CHECK_NULL(setParamsID);
finishID = (*env)->GetFieldID(env, cls, "finish", "Z"); finishID = (*env)->GetFieldID(env, cls, "finish", "Z");
CHECK_NULL(finishID);
finishedID = (*env)->GetFieldID(env, cls, "finished", "Z"); finishedID = (*env)->GetFieldID(env, cls, "finished", "Z");
CHECK_NULL(finishedID);
bufID = (*env)->GetFieldID(env, cls, "buf", "[B"); bufID = (*env)->GetFieldID(env, cls, "buf", "[B");
CHECK_NULL(bufID);
offID = (*env)->GetFieldID(env, cls, "off", "I"); offID = (*env)->GetFieldID(env, cls, "off", "I");
CHECK_NULL(offID);
lenID = (*env)->GetFieldID(env, cls, "len", "I"); lenID = (*env)->GetFieldID(env, cls, "len", "I");
CHECK_NULL(lenID);
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
...@@ -137,14 +145,14 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -137,14 +145,14 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr,
in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0); in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0);
if (in_buf == NULL) { if (in_buf == NULL) {
// Throw OOME only when length is not zero // Throw OOME only when length is not zero
if (this_len != 0) if (this_len != 0 && (*env)->ExceptionOccurred(env) == NULL)
JNU_ThrowOutOfMemoryError(env, 0); JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0); out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0);
if (out_buf == NULL) { if (out_buf == NULL) {
(*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0);
if (len != 0) if (len != 0 && (*env)->ExceptionOccurred(env) == NULL)
JNU_ThrowOutOfMemoryError(env, 0); JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
...@@ -163,7 +171,7 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -163,7 +171,7 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr,
this_off += this_len - strm->avail_in; this_off += this_len - strm->avail_in;
(*env)->SetIntField(env, this, offID, this_off); (*env)->SetIntField(env, this, offID, this_off);
(*env)->SetIntField(env, this, lenID, strm->avail_in); (*env)->SetIntField(env, this, lenID, strm->avail_in);
return len - strm->avail_out; return (jint) (len - strm->avail_out);
case Z_BUF_ERROR: case Z_BUF_ERROR:
(*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE); (*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE);
return 0; return 0;
......
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -50,10 +50,15 @@ JNIEXPORT void JNICALL ...@@ -50,10 +50,15 @@ JNIEXPORT void JNICALL
Java_java_util_zip_Inflater_initIDs(JNIEnv *env, jclass cls) Java_java_util_zip_Inflater_initIDs(JNIEnv *env, jclass cls)
{ {
needDictID = (*env)->GetFieldID(env, cls, "needDict", "Z"); needDictID = (*env)->GetFieldID(env, cls, "needDict", "Z");
CHECK_NULL(needDictID);
finishedID = (*env)->GetFieldID(env, cls, "finished", "Z"); finishedID = (*env)->GetFieldID(env, cls, "finished", "Z");
CHECK_NULL(finishedID);
bufID = (*env)->GetFieldID(env, cls, "buf", "[B"); bufID = (*env)->GetFieldID(env, cls, "buf", "[B");
CHECK_NULL(bufID);
offID = (*env)->GetFieldID(env, cls, "off", "I"); offID = (*env)->GetFieldID(env, cls, "off", "I");
CHECK_NULL(offID);
lenID = (*env)->GetFieldID(env, cls, "len", "I"); lenID = (*env)->GetFieldID(env, cls, "len", "I");
CHECK_NULL(lenID);
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
...@@ -127,14 +132,14 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -127,14 +132,14 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr,
in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0); in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0);
if (in_buf == NULL) { if (in_buf == NULL) {
if (this_len != 0) if (this_len != 0 && (*env)->ExceptionOccurred(env) == NULL)
JNU_ThrowOutOfMemoryError(env, 0); JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0); out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0);
if (out_buf == NULL) { if (out_buf == NULL) {
(*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0);
if (len != 0) if (len != 0 && (*env)->ExceptionOccurred(env) == NULL)
JNU_ThrowOutOfMemoryError(env, 0); JNU_ThrowOutOfMemoryError(env, 0);
return 0; return 0;
} }
...@@ -154,7 +159,7 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -154,7 +159,7 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr,
this_off += this_len - strm->avail_in; this_off += this_len - strm->avail_in;
(*env)->SetIntField(env, this, offID, this_off); (*env)->SetIntField(env, this, offID, this_off);
(*env)->SetIntField(env, this, lenID, strm->avail_in); (*env)->SetIntField(env, this, lenID, strm->avail_in);
return len - strm->avail_out; return (jint) (len - strm->avail_out);
case Z_NEED_DICT: case Z_NEED_DICT:
(*env)->SetBooleanField(env, this, needDictID, JNI_TRUE); (*env)->SetBooleanField(env, this, needDictID, JNI_TRUE);
/* Might have consumed some input here! */ /* Might have consumed some input here! */
......
/* /*
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -71,11 +71,13 @@ ThrowZipException(JNIEnv *env, const char *msg) ...@@ -71,11 +71,13 @@ ThrowZipException(JNIEnv *env, const char *msg)
if (msg != NULL) { if (msg != NULL) {
s = JNU_NewStringPlatform(env, msg); s = JNU_NewStringPlatform(env, msg);
} }
x = JNU_NewObjectByName(env, if (s != NULL) {
x = JNU_NewObjectByName(env,
"java/util/zip/ZipException", "java/util/zip/ZipException",
"(Ljava/lang/String;)V", s); "(Ljava/lang/String;)V", s);
if (x != NULL) { if (x != NULL) {
(*env)->Throw(env, x); (*env)->Throw(env, x);
}
} }
} }
...@@ -363,8 +365,10 @@ Java_java_util_jar_JarFile_getMetaInfEntryNames(JNIEnv *env, jobject obj) ...@@ -363,8 +365,10 @@ Java_java_util_jar_JarFile_getMetaInfEntryNames(JNIEnv *env, jobject obj)
/* If some names were found then build array of java strings */ /* If some names were found then build array of java strings */
if (count > 0) { if (count > 0) {
jclass cls = (*env)->FindClass(env, "java/lang/String"); jclass cls = JNU_ClassString(env);
CHECK_NULL_RETURN(cls, NULL);
result = (*env)->NewObjectArray(env, count, cls, 0); result = (*env)->NewObjectArray(env, count, cls, 0);
CHECK_NULL_RETURN(result, NULL);
if (result != 0) { if (result != 0) {
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
jstring str = (*env)->NewStringUTF(env, zip->metanames[i]); jstring str = (*env)->NewStringUTF(env, zip->metanames[i]);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册