src/share/classes/com/sun/crypto/provider/CipherCore.java

Print this page
8027575: b113 causing a lot of memory allocation and regression for wls_webapp_atomics

*** 718,727 **** --- 718,736 ---- + " bytes long"); } int outLen = 0; if (len != 0) { // there is some work to do + if ((input == output) + && (outputOffset <= (inputOffset + buffer.length)) + && (inputOffset <= (outputOffset + buffer.length))) { + // copy 'input' out to avoid its content being + // overwritten prematurely. + input = Arrays.copyOfRange(input, inputOffset, + inputOffset + inputLen); + inputOffset = 0; + } if (len <= buffered) { // all to-be-processed data are from 'buffer' if (decrypting) { outLen = cipher.decrypt(buffer, 0, len, output, outputOffset); } else {
*** 730,770 **** buffered -= len; if (buffered != 0) { System.arraycopy(buffer, len, buffer, 0, buffered); } } else { // len > buffered ! if ((input != output) && (buffered == 0)) { ! // all to-be-processed data are from 'input' ! // however, note that if 'input' and 'output' are the same, ! // then they can't be passed directly to the underlying cipher ! // engine operations as data may be overwritten before they ! // are read. if (decrypting) { ! outLen = cipher.decrypt(input, inputOffset, len, output, outputOffset); } else { ! outLen = cipher.encrypt(input, inputOffset, len, output, outputOffset); } ! inputOffset += len; ! inputLen -= len; ! } else { ! // assemble the data using both 'buffer' and 'input' ! byte[] in = new byte[len]; ! int inConsumed = len - buffered; ! if (buffered != 0) { ! System.arraycopy(buffer, 0, in, 0, buffered); buffered = 0; } ! if (inConsumed != 0) { ! System.arraycopy(input, inputOffset, in, len - inConsumed, inConsumed); ! inputOffset += inConsumed; ! inputLen -= inConsumed; ! } if (decrypting) { ! outLen = cipher.decrypt(in, 0, len, output, outputOffset); } else { ! outLen = cipher.encrypt(in, 0, len, output, outputOffset); } } } // Let's keep track of how many bytes are needed to make // the total input length a multiple of blocksize when // padding is applied --- 739,779 ---- buffered -= len; if (buffered != 0) { System.arraycopy(buffer, len, buffer, 0, buffered); } } else { // len > buffered ! int inputConsumed = len - buffered; ! int temp; ! if (buffered > 0) { ! int bufferCapacity = buffer.length - buffered; ! if (bufferCapacity != 0) { ! temp = Math.min(bufferCapacity, inputConsumed); ! System.arraycopy(input, inputOffset, buffer, buffered, temp); ! inputOffset += temp; ! inputConsumed -= temp; ! inputLen -= temp; ! buffered += temp; ! } ! // process 'buffer' if (decrypting) { ! outLen = cipher.decrypt(buffer, 0, buffered, output, outputOffset); } else { ! outLen = cipher.encrypt(buffer, 0, buffered, output, outputOffset); } ! outputOffset += outLen; buffered = 0; } ! if (inputConsumed > 0) { // still has input to process if (decrypting) { ! outLen += cipher.decrypt(input, inputOffset, inputConsumed, ! output, outputOffset); } else { ! outLen += cipher.encrypt(input, inputOffset, inputConsumed, ! output, outputOffset); } + inputOffset += inputConsumed; + inputLen -= inputConsumed; } } // Let's keep track of how many bytes are needed to make // the total input length a multiple of blocksize when // padding is applied