git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@677514 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -54,6 +54,10 @@ Changes that could break older environments: | |||||
| however the configuration-from-String behavior remains equivalent, rendering | however the configuration-from-String behavior remains equivalent, rendering | ||||
| a FileResource. | a FileResource. | ||||
| * CBZip2InputStream will now throw an IOException if | |||||
| passed in a null or empty InputStream to read from. | |||||
| Bugzilla Report 32200 | |||||
| Fixed bugs: | Fixed bugs: | ||||
| ----------- | ----------- | ||||
| @@ -112,6 +116,10 @@ Fixed bugs: | |||||
| * <scp> creates remoteToDir if it doesn't exist. | * <scp> creates remoteToDir if it doesn't exist. | ||||
| Bugzilla Report 42781 | Bugzilla Report 42781 | ||||
| * CBZip2OutputStream threw an exception if it was closed prior to | |||||
| writing anything. | |||||
| Bugzilla Report 32200 | |||||
| Other changes: | Other changes: | ||||
| -------------- | -------------- | ||||
| @@ -23,8 +23,9 @@ | |||||
| */ | */ | ||||
| package org.apache.tools.bzip2; | package org.apache.tools.bzip2; | ||||
| import java.io.InputStream; | |||||
| import java.io.ByteArrayInputStream; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | |||||
| /** | /** | ||||
| * An input stream that decompresses from the BZip2 format (without the file | * An input stream that decompresses from the BZip2 format (without the file | ||||
| @@ -223,6 +224,12 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { | |||||
| } | } | ||||
| private void init() throws IOException { | private void init() throws IOException { | ||||
| if (null == in) { | |||||
| throw new IOException("No InputStream"); | |||||
| } | |||||
| if (in.available() == 0) { | |||||
| throw new IOException("Empty InputStream"); | |||||
| } | |||||
| int magic2 = this.in.read(); | int magic2 = this.in.read(); | ||||
| if (magic2 != 'h') { | if (magic2 != 'h') { | ||||
| throw new IOException("Stream is not BZip2 formatted: expected 'h'" | throw new IOException("Stream is not BZip2 formatted: expected 'h'" | ||||
| @@ -503,7 +503,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| code[i] = vec; | code[i] = vec; | ||||
| vec++; | vec++; | ||||
| } | } | ||||
| }; | |||||
| } | |||||
| vec <<= 1; | vec <<= 1; | ||||
| } | } | ||||
| } | } | ||||
| @@ -703,7 +703,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| bc = cost[t]; | bc = cost[t]; | ||||
| bt = t; | bt = t; | ||||
| } | } | ||||
| }; | |||||
| } | |||||
| totc += bc; | totc += bc; | ||||
| fave[bt]++; | fave[bt]++; | ||||
| selector[nSelectors] = (char) bt; | selector[nSelectors] = (char) bt; | ||||
| @@ -1047,7 +1047,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| ltLo++; | ltLo++; | ||||
| unLo++; | unLo++; | ||||
| continue; | continue; | ||||
| }; | |||||
| } | |||||
| if (n > 0) { | if (n > 0) { | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -1066,7 +1066,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| gtHi--; | gtHi--; | ||||
| unHi--; | unHi--; | ||||
| continue; | continue; | ||||
| }; | |||||
| } | |||||
| if (n < 0) { | if (n < 0) { | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -1131,6 +1131,15 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| */ | */ | ||||
| // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" ); | // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" ); | ||||
| // set last to zero in case it's never been set before | |||||
| // see bug#32200, initBlock is the real culprit | |||||
| // setting last to -1, but not sure if this -1 is important | |||||
| // in normal scheme | |||||
| if (last < 0) { | |||||
| last = 0; | |||||
| } | |||||
| for (i = 0; i < NUM_OVERSHOOT_BYTES; i++) { | for (i = 0; i < NUM_OVERSHOOT_BYTES; i++) { | ||||
| block[last + i + 2] = block[(i % (last + 1)) + 1]; | block[last + i + 2] = block[(i % (last + 1)) + 1]; | ||||
| } | } | ||||
| @@ -1360,7 +1369,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| origPtr = i; | origPtr = i; | ||||
| break; | break; | ||||
| } | } | ||||
| }; | |||||
| } | |||||
| if (origPtr == -1) { | if (origPtr == -1) { | ||||
| panic(); | panic(); | ||||
| @@ -1478,11 +1487,11 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| if (i1 > last) { | if (i1 > last) { | ||||
| i1 -= last; | i1 -= last; | ||||
| i1--; | i1--; | ||||
| }; | |||||
| } | |||||
| if (i2 > last) { | if (i2 > last) { | ||||
| i2 -= last; | i2 -= last; | ||||
| i2--; | i2--; | ||||
| }; | |||||
| } | |||||
| k -= 4; | k -= 4; | ||||
| workDone++; | workDone++; | ||||
| @@ -1565,7 +1574,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| tmp2 = tmp; | tmp2 = tmp; | ||||
| tmp = yy[j]; | tmp = yy[j]; | ||||
| yy[j] = tmp2; | yy[j] = tmp2; | ||||
| }; | |||||
| } | |||||
| yy[0] = tmp; | yy[0] = tmp; | ||||
| if (j == 0) { | if (j == 0) { | ||||
| @@ -1585,12 +1594,12 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| wr++; | wr++; | ||||
| mtfFreq[RUNB]++; | mtfFreq[RUNB]++; | ||||
| break; | break; | ||||
| }; | |||||
| } | |||||
| if (zPend < 2) { | if (zPend < 2) { | ||||
| break; | break; | ||||
| } | } | ||||
| zPend = (zPend - 2) / 2; | zPend = (zPend - 2) / 2; | ||||
| }; | |||||
| } | |||||
| zPend = 0; | zPend = 0; | ||||
| } | } | ||||
| szptr[wr] = (short) (j + 1); | szptr[wr] = (short) (j + 1); | ||||
| @@ -1627,6 +1636,4 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { | |||||
| nMTF = wr; | nMTF = wr; | ||||
| } | } | ||||
| } | |||||
| } | |||||
| @@ -0,0 +1,42 @@ | |||||
| /* | |||||
| * Licensed to the Apache Software Foundation (ASF) under one or more | |||||
| * contributor license agreements. See the NOTICE file distributed with | |||||
| * this work for additional information regarding copyright ownership. | |||||
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
| * (the "License"); you may not use this file except in compliance with | |||||
| * the License. You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.bzip2; | |||||
| import java.io.ByteArrayInputStream; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.IOException; | |||||
| import junit.framework.TestCase; | |||||
| public class CBZip2StreamTest extends TestCase { | |||||
| public void testNullPointer() throws IOException { | |||||
| try { | |||||
| CBZip2InputStream cb = new CBZip2InputStream(new ByteArrayInputStream(new byte[0])); | |||||
| fail("expected an exception"); | |||||
| } catch (IOException e) { | |||||
| // expected | |||||
| } | |||||
| } | |||||
| public void testDivisionByZero() throws IOException { | |||||
| CBZip2OutputStream cb = new CBZip2OutputStream(new ByteArrayOutputStream()); | |||||
| cb.close(); | |||||
| // expected no exception | |||||
| } | |||||
| } | |||||