CKFinder gif过大 上传报数组越界异常

jeromhao 2017-01-12 10:00:38
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;
}
...全文
212 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeromhao 2017-01-12
  • 打赏
  • 举报
回复
怎么循环写入,是要修改rt包的源码吗
bcsflilong 2017-01-12
  • 打赏
  • 举报
回复
RT包 咱们也修改不了 图片太大了 试着循环写入 别一次压进去

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧