From 4ddc8483e090f0f5adadf3553ae520897f6cee41 Mon Sep 17 00:00:00 2001 From: Matthew Jason Benson Date: Fri, 6 May 2005 18:36:10 +0000 Subject: [PATCH] Base64 conversion of userid:password was (always) broken. The length of the result was calculated correctly, but was translating two bytes to four instead of three. This would obviously cause buffer overruns. PR: 34734 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278231 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tools/ant/taskdefs/Get.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/Get.java b/src/main/org/apache/tools/ant/taskdefs/Get.java index 1f89a08b3..a72313264 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Get.java +++ b/src/main/org/apache/tools/ant/taskdefs/Get.java @@ -363,48 +363,51 @@ public class Get extends Task { int bits24; int bits6; - StringBuffer buf = new StringBuffer(); + char[] out = new char[((octetString.length - 1) / 3 + 1) * 4]; + int outIndex = 0; int i = 0; while ((i + 3) <= octetString.length) { // store the octets bits24 = (octetString[i++] & 0xFF) << 16; bits24 |= (octetString[i++] & 0xFF) << 8; + bits24 |= octetString[i++]; bits6 = (bits24 & 0x00FC0000) >> 18; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; bits6 = (bits24 & 0x0003F000) >> 12; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; bits6 = (bits24 & 0x00000FC0) >> 6; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; bits6 = (bits24 & 0x0000003F); - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; } if (octetString.length - i == 2) { // store the octets bits24 = (octetString[i] & 0xFF) << 16; bits24 |= (octetString[i + 1] & 0xFF) << 8; bits6 = (bits24 & 0x00FC0000) >> 18; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; bits6 = (bits24 & 0x0003F000) >> 12; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; bits6 = (bits24 & 0x00000FC0) >> 6; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; // padding - buf.append('='); + out[outIndex++] = '='; } else if (octetString.length - i == 1) { // store the octets bits24 = (octetString[i] & 0xFF) << 16; bits6 = (bits24 & 0x00FC0000) >> 18; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; bits6 = (bits24 & 0x0003F000) >> 12; - buf.append(alphabet[bits6]); + out[outIndex++] = alphabet[bits6]; // padding - buf.append("=="); + out[outIndex++] = '='; + out[outIndex++] = '='; } - return buf.toString(); + return new String(out); } }