8193262: JNI array not released in libsunmscapi convertToLittleEndian
Reviewed-by: ascarpino
This commit is contained in:
parent
50484af54b
commit
254138139f
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2018, 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
|
||||||
@ -1598,38 +1598,47 @@ JNIEXPORT jbyteArray JNICALL Java_sun_security_mscapi_RSAPublicKey_getModulus
|
|||||||
* Convert an array in big-endian byte order into little-endian byte order.
|
* Convert an array in big-endian byte order into little-endian byte order.
|
||||||
*/
|
*/
|
||||||
int convertToLittleEndian(JNIEnv *env, jbyteArray source, jbyte* destination,
|
int convertToLittleEndian(JNIEnv *env, jbyteArray source, jbyte* destination,
|
||||||
int destinationLength) {
|
int destinationLength) {
|
||||||
|
|
||||||
int sourceLength = env->GetArrayLength(source);
|
int result = -1;
|
||||||
|
jbyte* sourceBytes = NULL;
|
||||||
|
|
||||||
jbyte* sourceBytes = env->GetByteArrayElements(source, 0);
|
__try {
|
||||||
if (sourceBytes == NULL) {
|
int sourceLength = env->GetArrayLength(source);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int copyLen = sourceLength;
|
sourceBytes = env->GetByteArrayElements(source, 0);
|
||||||
if (sourceLength > destinationLength) {
|
if (sourceBytes == NULL) {
|
||||||
// source might include an extra sign byte
|
__leave;
|
||||||
if (sourceLength == destinationLength + 1 && sourceBytes[0] == 0) {
|
}
|
||||||
copyLen--;
|
|
||||||
} else {
|
int copyLen = sourceLength;
|
||||||
return -1;
|
if (sourceLength > destinationLength) {
|
||||||
|
// source might include an extra sign byte
|
||||||
|
if (sourceLength == destinationLength + 1 && sourceBytes[0] == 0) {
|
||||||
|
copyLen--;
|
||||||
|
} else {
|
||||||
|
__leave;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy bytes from the end of the source array to the beginning of the
|
||||||
|
// destination array (until the destination array is full).
|
||||||
|
// This ensures that the sign byte from the source array will be excluded.
|
||||||
|
for (int i = 0; i < copyLen; i++) {
|
||||||
|
destination[i] = sourceBytes[sourceLength - 1 - i];
|
||||||
|
}
|
||||||
|
if (copyLen < destinationLength) {
|
||||||
|
memset(destination + copyLen, 0, destinationLength - copyLen);
|
||||||
|
}
|
||||||
|
result = destinationLength;
|
||||||
|
} __finally {
|
||||||
|
// Clean up.
|
||||||
|
if (sourceBytes) {
|
||||||
|
env->ReleaseByteArrayElements(source, sourceBytes, JNI_ABORT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy bytes from the end of the source array to the beginning of the
|
return result;
|
||||||
// destination array (until the destination array is full).
|
|
||||||
// This ensures that the sign byte from the source array will be excluded.
|
|
||||||
for (int i = 0; i < copyLen; i++) {
|
|
||||||
destination[i] = sourceBytes[sourceLength - 1 - i];
|
|
||||||
}
|
|
||||||
if (copyLen < destinationLength) {
|
|
||||||
memset(destination + copyLen, 0, destinationLength - copyLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
env->ReleaseByteArrayElements(source, sourceBytes, JNI_ABORT);
|
|
||||||
|
|
||||||
return destinationLength;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user