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 */