最新版1.2.59 com.alibaba.fastjson.serializer.SerializeWriter#writeHex依然存在的数组越界问题

41ik7eoe  于 2021-11-27  发布在  Java
关注(0)|答案(1)|浏览(258)

对一个含有byte[]成员的对象进行json序列化的时候,出现两个问题:
一个是在#2574里已经提到过的高版本序列化和低版本反序列化不兼容的问题,高版本会对byte[]进行16进制序列化,低版本用的是base64,导致高低版本无法互相兼容;
另一个是当byte[]长度到达一定长度时,会发生越界,具体如下:
在com.alibaba.fastjson.serializer.SerializeWriter#writeHex中:

int newcount = count + bytes.length * 2 + 3;
if (newcount > buf.length) {
            if (writer != null) {
                char[] chars = new char[bytes.length + 3];// 1
                int pos = 0;
                chars[pos++] = 'x';
                chars[pos++] = '\'';

                for (int i = 0; i < bytes.length; ++i) {
                    byte b = bytes[i];

                    int a = b & 0xFF;
                    int b0 = a >> 4;
                    int b1 = a & 0xf;

                    chars[pos++] = (char) (b0 + (b0 < 10 ? 48 : 55));
                    chars[pos++] = (char) (b1 + (b1 < 10 ? 48 : 55));//2
                }
                chars[pos++] = '\'';
                try {
                    writer.write(chars);
                } catch (IOException ex) {
                    throw new JSONException("writeBytes error.", ex);
                }
                return;
            }
            expandCapacity(newcount);
        }

[1]这里chars的长度只有bytes的长度多3,但每一次循环中bytes读一个,chars都会写两个([2]),所以遍历到bytes一半的时候就会越界了。

iklwldmw

iklwldmw1#

提了个pr尝试修了这个问题,用测例跑了应该没啥问题,楼上那位朋友 Omega-Ariston 少改个地方,有点问题。

相关问题