Browse Source

More sanity in CBZip2*Stream if the streams are empty. PR 32200. Submitted by Kevin Jackson.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@677514 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 17 years ago
parent
commit
c51d1ce61f
4 changed files with 78 additions and 14 deletions
  1. +8
    -0
      WHATSNEW
  2. +8
    -1
      src/main/org/apache/tools/bzip2/CBZip2InputStream.java
  3. +20
    -13
      src/main/org/apache/tools/bzip2/CBZip2OutputStream.java
  4. +42
    -0
      src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java

+ 8
- 0
WHATSNEW View File

@@ -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:
-------------- --------------




+ 8
- 1
src/main/org/apache/tools/bzip2/CBZip2InputStream.java View File

@@ -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'"


+ 20
- 13
src/main/org/apache/tools/bzip2/CBZip2OutputStream.java View File

@@ -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;
} }
}


}

+ 42
- 0
src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java View File

@@ -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
}
}

Loading…
Cancel
Save