From d4d33043d0f4f9294f011f359d646d3ea093f3e4 Mon Sep 17 00:00:00 2001 From: snowleo Date: Fri, 3 May 2013 01:26:51 +0200 Subject: Don't trust File.length() --- .../src/com/earth2me/essentials/EssentialsConf.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsConf.java b/Essentials/src/com/earth2me/essentials/EssentialsConf.java index da2a4c6aa..bf651e6ee 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsConf.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsConf.java @@ -114,14 +114,26 @@ public class EssentialsConf extends YamlConfiguration final FileInputStream inputStream = new FileInputStream(configFile); try { - final ByteBuffer buffer = ByteBuffer.allocate((int)configFile.length()); + long startSize = configFile.length(); + if (startSize > Integer.MAX_VALUE) { + throw new InvalidConfigurationException("File too big"); + } + ByteBuffer buffer = ByteBuffer.allocate((int)startSize); int length; while ((length = inputStream.read(bytebuffer)) != -1) { + if (length > buffer.remaining()) { + ByteBuffer resize = ByteBuffer.allocate(buffer.capacity()+length-buffer.remaining()); + int resizePosition = buffer.position(); + buffer.rewind(); + resize.put(buffer); + resize.position(resizePosition); + buffer = resize; + } buffer.put(bytebuffer, 0, length); } buffer.rewind(); - final CharBuffer data = CharBuffer.allocate((int)configFile.length()); + final CharBuffer data = CharBuffer.allocate(buffer.capacity()); CharsetDecoder decoder = UTF8.newDecoder(); CoderResult result = decoder.decode(buffer, data, true); if (result.isError()) -- cgit v1.2.3