Return-Path: Delivered-To: apmail-commons-issues-archive@locus.apache.org Received: (qmail 61282 invoked from network); 30 Apr 2008 09:22:42 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 30 Apr 2008 09:22:42 -0000 Received: (qmail 71158 invoked by uid 500); 30 Apr 2008 09:22:41 -0000 Delivered-To: apmail-commons-issues-archive@commons.apache.org Received: (qmail 70715 invoked by uid 500); 30 Apr 2008 09:22:40 -0000 Mailing-List: contact issues-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: issues@commons.apache.org Delivered-To: mailing list issues@commons.apache.org Received: (qmail 70679 invoked by uid 99); 30 Apr 2008 09:22:40 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 30 Apr 2008 02:22:40 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 30 Apr 2008 09:22:03 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id E4EE4234C111 for ; Wed, 30 Apr 2008 02:18:55 -0700 (PDT) Message-ID: <443445068.1209547135936.JavaMail.jira@brutus> Date: Wed, 30 Apr 2008 02:18:55 -0700 (PDT) From: "Robert Rodewald (JIRA)" To: issues@commons.apache.org Subject: [jira] Updated: (CODEC-68) isBase64 throws ArrayIndexOutOfBoundsException on some non-BASE64 bytes In-Reply-To: <1878798963.1209547135898.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/CODEC-68?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Robert Rodewald updated CODEC-68: --------------------------------- Description: the following code throws an ArrayIndexOutOfBoundsException although it is perfectly valid (the byte 0x9c should be ignored according to the standard): {code} byte[x] = new byte[] { 'n', 'A', '=', '=', 0x9c }; Base64.decodeBase64(x); {code} The problem is the following method: {code} private static boolean isBase64(byte octect) { if (octect == PAD) { return true; } else if (base64Alphabet[octect] == -1) { return false; } else { return true; } } {code} in Java octect is a *signed* value, so it is not correct to use it as an offset for an array [0..254] which base64Alphabet is. 0x9c is -100! FIX: use base64Alphabet[ 0xff & octect ] in the "else if" block to convert the octet prior using it as an offset for the lookup table was: the following code throws an ArrayIndexOutOfBoundsException although it is perfectly valid (the byte 0x9c should be ignored according to the standard): byte[x] = new byte[] { 'n', 'A', '=', '=', 0x9c }; Base64.decodeBase64(x); The problem is the following method: private static boolean isBase64(byte octect) { if (octect == PAD) { return true; } else if (base64Alphabet[octect] == -1) { return false; } else { return true; } } in Java octect is a *signed* value, so it is not correct to use it as an offset for an array [0..254] which base64Alphabet is. 0x9c is -100! FIX: use base64Alphabet[ 0xff & octect ] in the "else if" block to convert the octet prior using it as an offset for the lookup table > isBase64 throws ArrayIndexOutOfBoundsException on some non-BASE64 bytes > ----------------------------------------------------------------------- > > Key: CODEC-68 > URL: https://issues.apache.org/jira/browse/CODEC-68 > Project: Commons Codec > Issue Type: Bug > Affects Versions: 1.3 > Reporter: Robert Rodewald > Original Estimate: 0.25h > Remaining Estimate: 0.25h > > the following code throws an ArrayIndexOutOfBoundsException although it is perfectly valid (the byte 0x9c should be ignored according to the standard): > {code} > byte[x] = new byte[] { 'n', 'A', '=', '=', 0x9c }; > Base64.decodeBase64(x); > {code} > The problem is the following method: > {code} > private static boolean isBase64(byte octect) { > if (octect == PAD) { > return true; > } else if (base64Alphabet[octect] == -1) { > return false; > } else { > return true; > } > } > {code} > in Java octect is a *signed* value, so it is not correct to use it as an offset for an array [0..254] which base64Alphabet is. 0x9c is -100! > FIX: > use base64Alphabet[ 0xff & octect ] in the "else if" block to convert the octet prior using it as an offset for the lookup table -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.