The changes for using AccessController/SecurityManager also added a log which now spams a lot if log is enabled in integration-tests, reduce it a bit by not trying to call "cleaner()" on HeapByteBuffer which does not have it for sure

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1746411 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2016-06-01 08:05:07 +00:00
parent e9a1e2987f
commit aad52afa12
3 changed files with 54 additions and 41 deletions

View File

@ -162,22 +162,27 @@ public class FileBackedDataSource extends DataSource {
// unfortunately this might break silently with newer/other Java implementations, // unfortunately this might break silently with newer/other Java implementations,
// but we at least have unit-tests which will indicate this when run on Windows // but we at least have unit-tests which will indicate this when run on Windows
private static void unmap(final ByteBuffer buffer) { private static void unmap(final ByteBuffer buffer) {
AccessController.doPrivileged(new PrivilegedAction<Void>() { // not necessary for HeapByteBuffer, avoid lots of log-output on this class
@Override if(buffer.getClass().getName().endsWith("HeapByteBuffer")) {
@SuppressForbidden("Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works") return;
public Void run() { }
try {
final Method getCleanerMethod = buffer.getClass().getMethod("cleaner"); AccessController.doPrivileged(new PrivilegedAction<Void>() {
getCleanerMethod.setAccessible(true); @Override
final Object cleaner = getCleanerMethod.invoke(buffer); @SuppressForbidden("Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works")
if (cleaner != null) { public Void run() {
cleaner.getClass().getMethod("clean").invoke(cleaner); try {
} final Method getCleanerMethod = buffer.getClass().getMethod("cleaner");
} catch (Exception e) { getCleanerMethod.setAccessible(true);
logger.log(POILogger.WARN, "Unable to unmap memory mapped ByteBuffer.", e); final Object cleaner = getCleanerMethod.invoke(buffer);
} if (cleaner != null) {
return null; // Void cleaner.getClass().getMethod("clean").invoke(cleaner);
} }
}); } catch (Exception e) {
logger.log(POILogger.WARN, "Unable to unmap memory mapped ByteBuffer.", e);
}
return null; // Void
}
});
} }
} }

View File

@ -19,20 +19,14 @@
package org.apache.poi.poifs.nio; package org.apache.poi.poifs.nio;
import java.io.File; import junit.framework.TestCase;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.apache.poi.util.TempFile; import org.apache.poi.util.TempFile;
import junit.framework.TestCase; import java.io.*;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
/** /**
* Tests for the datasource implementations * Tests for the datasource implementations
@ -121,7 +115,7 @@ public class TestDataSource extends TestCase
} }
} }
private void writeDataToFile(File temp) throws FileNotFoundException, IOException { private void writeDataToFile(File temp) throws IOException {
OutputStream str = new FileOutputStream(temp); OutputStream str = new FileOutputStream(temp);
try { try {
InputStream in = data.openResourceAsStream("Notes.ole2"); InputStream in = data.openResourceAsStream("Notes.ole2");
@ -153,11 +147,11 @@ public class TestDataSource extends TestCase
assertEquals(0, bs.position()); assertEquals(0, bs.position());
assertEquals(0xd0 - 256, bs.get(0)); assertEquals(0xd0 - 256, bs.get(0));
assertEquals(0xcf - 256, bs.get(1)); assertEquals(0xcf - 256, bs.get(1));
assertEquals(0x11 - 000, bs.get(2)); assertEquals(0x11, bs.get(2));
assertEquals(0xe0 - 256, bs.get(3)); assertEquals(0xe0 - 256, bs.get(3));
assertEquals(0xd0 - 256, bs.get()); assertEquals(0xd0 - 256, bs.get());
assertEquals(0xcf - 256, bs.get()); assertEquals(0xcf - 256, bs.get());
assertEquals(0x11 - 000, bs.get()); assertEquals(0x11, bs.get());
assertEquals(0xe0 - 256, bs.get()); assertEquals(0xe0 - 256, bs.get());
// Mid way through // Mid way through
@ -179,11 +173,12 @@ public class TestDataSource extends TestCase
// Can't go off the end // Can't go off the end
try { try {
bs = ds.read(4, 8192); ds.read(4, 8192);
if(!writeable) { if(!writeable) {
fail("Shouldn't be able to read off the end of the file"); fail("Shouldn't be able to read off the end of the file");
} }
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
// expected here
} }
} }
@ -228,13 +223,17 @@ public class TestDataSource extends TestCase
try { try {
bs.get(); bs.get();
fail("Shouldn't be able to read off the end"); fail("Shouldn't be able to read off the end");
} catch(BufferUnderflowException e) {} } catch(BufferUnderflowException e) {
// expected here
}
// Past the end // Past the end
try { try {
bs = ds.read(4, 256); ds.read(4, 256);
fail("Shouldn't be able to read off the end"); fail("Shouldn't be able to read off the end");
} catch(IndexOutOfBoundsException e) {} } catch(IndexOutOfBoundsException e) {
// expected here
}
// Overwrite // Overwrite

View File

@ -125,13 +125,12 @@ public class TestHexDump {
} }
} }
obj[17] = chrs.toString(); obj[17] = chrs.toString();
format.append("%18$s"+HexDump.EOL); format.append("%18$s").append(HexDump.EOL);
String str = String.format(LocaleUtil.getUserLocale(), format.toString(), obj); String str = String.format(LocaleUtil.getUserLocale(), format.toString(), obj);
strExp.append(str); strExp.append(str);
} }
byte bytesExp[] = strExp.toString().getBytes(HexDump.UTF8); return strExp.toString().getBytes(HexDump.UTF8);
return bytesExp;
} }
@Test @Test
@ -157,7 +156,7 @@ public class TestHexDump {
assertEquals("FFFF", HexDump.toHex((short)0xFFFF)); assertEquals("FFFF", HexDump.toHex((short)0xFFFF));
assertEquals("00000000000004D2", HexDump.toHex(1234l)); assertEquals("00000000000004D2", HexDump.toHex(1234L));
assertEquals("0xFE", HexDump.byteToHex(-2)); assertEquals("0xFE", HexDump.byteToHex(-2));
assertEquals("0x25", HexDump.byteToHex(37)); assertEquals("0x25", HexDump.byteToHex(37));
@ -185,18 +184,28 @@ public class TestHexDump {
@Test(expected=ArrayIndexOutOfBoundsException.class) @Test(expected=ArrayIndexOutOfBoundsException.class)
public void testDumpToStringOutOfIndex1() throws Exception { public void testDumpToStringOutOfIndex1() throws Exception {
HexDump.dump(new byte[ 1 ], 0, -1); HexDump.dump(new byte[1], 0, -1);
} }
@Test(expected=ArrayIndexOutOfBoundsException.class) @Test(expected=ArrayIndexOutOfBoundsException.class)
public void testDumpToStringOutOfIndex2() throws Exception { public void testDumpToStringOutOfIndex2() throws Exception {
HexDump.dump(new byte[ 1 ], 0, 2); HexDump.dump(new byte[1], 0, 2);
} }
@Test(expected=ArrayIndexOutOfBoundsException.class)
public void testDumpToStringOutOfIndex3() throws Exception { public void testDumpToStringOutOfIndex3() throws Exception {
HexDump.dump(new byte[ 1 ], 0, 1); HexDump.dump(new byte[1], 0, 1);
} }
@Test
public void testDumpToStringNoDataEOL1() throws Exception {
HexDump.dump(new byte[0], 0, 1);
}
@Test
public void testDumpToStringNoDataEOL2() throws Exception {
HexDump.dump(new byte[0], 0, 0);
}
@Test @Test
public void testDumpToPrintStream() throws IOException { public void testDumpToPrintStream() throws IOException {