src/share/native/java/util/zip/Deflater.c

Print this page

        

*** 127,164 **** jbyte *out_buf; int res; if ((*env)->GetBooleanField(env, this, setParamsID)) { int level = (*env)->GetIntField(env, this, levelID); int strategy = (*env)->GetIntField(env, this, strategyID); ! ! in_buf = (jbyte *) malloc(this_len); ! if (in_buf == 0) { // Throw OOME only when length is not zero if (this_len != 0) JNU_ThrowOutOfMemoryError(env, 0); return 0; } ! (*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf); ! out_buf = (jbyte *) malloc(len); ! if (out_buf == 0) { ! free(in_buf); if (len != 0) JNU_ThrowOutOfMemoryError(env, 0); return 0; } ! strm->next_in = (Bytef *) in_buf; ! strm->next_out = (Bytef *) out_buf; strm->avail_in = this_len; strm->avail_out = len; res = deflateParams(strm, level, strategy); ! ! if (res == Z_OK) { ! (*env)->SetByteArrayRegion(env, b, off, len - strm->avail_out, out_buf); ! } ! free(out_buf); ! free(in_buf); switch (res) { case Z_OK: (*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE); this_off += this_len - strm->avail_in; --- 127,158 ---- jbyte *out_buf; int res; if ((*env)->GetBooleanField(env, this, setParamsID)) { int level = (*env)->GetIntField(env, this, levelID); int strategy = (*env)->GetIntField(env, this, strategyID); ! in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0); ! if (in_buf == NULL) { // Throw OOME only when length is not zero if (this_len != 0) JNU_ThrowOutOfMemoryError(env, 0); return 0; } ! out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0); ! if (out_buf == NULL) { ! (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); if (len != 0) JNU_ThrowOutOfMemoryError(env, 0); return 0; } ! strm->next_in = (Bytef *) (in_buf + this_off); ! strm->next_out = (Bytef *) (out_buf + off); strm->avail_in = this_len; strm->avail_out = len; res = deflateParams(strm, level, strategy); ! (*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0); ! (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); switch (res) { case Z_OK: (*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE); this_off += this_len - strm->avail_in;
*** 172,208 **** JNU_ThrowInternalError(env, strm->msg); return 0; } } else { jboolean finish = (*env)->GetBooleanField(env, this, finishID); ! in_buf = (jbyte *) malloc(this_len); ! if (in_buf == 0) { if (this_len != 0) JNU_ThrowOutOfMemoryError(env, 0); return 0; } ! (*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf); ! ! out_buf = (jbyte *) malloc(len); ! if (out_buf == 0) { ! free(in_buf); if (len != 0) JNU_ThrowOutOfMemoryError(env, 0); return 0; } ! strm->next_in = (Bytef *) in_buf; ! strm->next_out = (Bytef *) out_buf; strm->avail_in = this_len; strm->avail_out = len; res = deflate(strm, finish ? Z_FINISH : flush); ! ! if (res == Z_STREAM_END || res == Z_OK) { ! (*env)->SetByteArrayRegion(env, b, off, len - strm->avail_out, out_buf); ! } ! free(out_buf); ! free(in_buf); switch (res) { case Z_STREAM_END: (*env)->SetBooleanField(env, this, finishedID, JNI_TRUE); /* fall through */ --- 166,197 ---- JNU_ThrowInternalError(env, strm->msg); return 0; } } else { jboolean finish = (*env)->GetBooleanField(env, this, finishID); ! in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0); ! if (in_buf == NULL) { if (this_len != 0) JNU_ThrowOutOfMemoryError(env, 0); return 0; } ! out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0); ! if (out_buf == NULL) { ! (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); if (len != 0) JNU_ThrowOutOfMemoryError(env, 0); + return 0; } ! strm->next_in = (Bytef *) (in_buf + this_off); ! strm->next_out = (Bytef *) (out_buf + off); strm->avail_in = this_len; strm->avail_out = len; res = deflate(strm, finish ? Z_FINISH : flush); ! (*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0); ! (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); switch (res) { case Z_STREAM_END: (*env)->SetBooleanField(env, this, finishedID, JNI_TRUE); /* fall through */