CKFinder gif过大 上传报数组越界异常
CKFinder,上传gif图片过大报数组越界异常,如小图所示,求指导,该怎么解决[/color]
java.lang.ArrayIndexOutOfBoundsException: 4096
at com.sun.imageio.plugins.gif.GIFImageReader.read(GIFImageReader.java:958)
at javax.imageio.ImageIO.read(ImageIO.java:1448)
at javax.imageio.ImageIO.read(ImageIO.java:1352)
at com.ckfinder.connector.utils.ImageUtils.checkImageFile(ImageUtils.java:279)
at com.ckfinder.connector.handlers.command.FileUploadCommand.validateUploadItem(FileUploadCommand.java:471)
at com.ckfinder.connector.handlers.command.FileUploadCommand.fileUpload(FileUploadCommand.java:272)
at com.ckfinder.connector.handlers.command.FileUploadCommand.uploadFile(FileUploadCommand.java:247)
at com.ckfinder.connector.handlers.command.FileUploadCommand.initParams(FileUploadCommand.java:225)
at com.ckfinder.connector.handlers.command.Command.runCommand(Command.java:73)
at com.ckfinder.connector.ConnectorServlet$CommandHandlerEnum.execute(ConnectorServlet.java:418)
at com.ckfinder.connector.ConnectorServlet$CommandHandlerEnum.access$000(ConnectorServlet.java:307)
at com.ckfinder.connector.ConnectorServlet.getResponse(ConnectorServlet.java:167)
at com.ckfinder.connector.ConnectorServlet.doPost(ConnectorServlet.java:101)
at com.thinkgem.jeesite.common.web.CKFinderConnectorServlet.doPost(CKFinderConnectorServlet.java:39)
经查看源码,发现是:jdk的rt包下的:src\com\sun\imageio\plugins\gif\GIFImageReader.java类的第958行( prefix[ti] = oc;)报数组越界异常,ti的值大于数组定义的长度了。下面是出现问题的这段代码:
int[] prefix = new int[4096];
byte[] suffix = new byte[4096];
byte[] initial = new byte[4096];
int[] length = new int[4096];
byte[] string = new byte[4096];
initializeStringTable(prefix, suffix, initial, length);
int tableIndex = (1 << initCodeSize) + 2;
int codeSize = initCodeSize + 1;
int codeMask = (1 << codeSize) - 1;
while (!abortRequested()) {
code = getCode(codeSize, codeMask);
if (code == clearCode) {
initializeStringTable(prefix, suffix, initial, length);
tableIndex = (1 << initCodeSize) + 2;
codeSize = initCodeSize + 1;
codeMask = (1 << codeSize) - 1;
code = getCode(codeSize, codeMask);
if (code == eofCode) {
// Inform IIOReadProgressListeners of end of image
processImageComplete();
return theImage;
}
} else if (code == eofCode) {
// Inform IIOReadProgressListeners of end of image
processImageComplete();
return theImage;
} else {
int newSuffixIndex;
if (code < tableIndex) {
newSuffixIndex = code;
} else { // code == tableIndex
newSuffixIndex = oldCode;
if (code != tableIndex) {
// warning - code out of sequence
// possibly data corruption
processWarningOccurred("Out-of-sequence code!");
}
}
int ti = tableIndex;
int oc = oldCode;
if (ti>=4096) {
System.out.println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"+ti);
}
prefix[ti] = oc;
suffix[ti] = initial[newSuffixIndex];
initial[ti] = initial[oc];
length[ti] = length[oc] + 1;
++tableIndex;
if ((tableIndex == (1 << codeSize)) &&
(tableIndex < 4096)) {
++codeSize;
codeMask = (1 << codeSize) - 1;
}
}
// Reverse code
int c = code;
int len = length[c];
for (int i = len - 1; i >= 0; i--) {
string[i] = suffix[c];
c = prefix[c];
}
outputPixels(string, len);
oldCode = code;
}