Skip to content

[BUG]序列化Double.NaN导致数组越界异常 #3449

@ZhiQiang-Tiger

Description

@ZhiQiang-Tiger

问题描述

简要描述您碰到的问题。
系统先前的版本是2.0.36,将其升级到2.0.56后解析Double NaN后报数组越界异常。

环境信息

请填写以下信息:

  • JDK信息: ajdk11_11.0.21.21
  • 版本信息:Fastjson2 2.0.56
  • fury版本:0.10.0 Release

    org.apache.fury
    fury-core
    0.10.0

重现步骤

如何操作可以重现该问题:

`private static final ThreadSafeFury fury = Fury.builder()
    .withRefTracking(true)
    .requireClassRegistration(false)
    .withDeserializeNonexistentClass(true)
    .withCompatibleMode(CompatibleMode.COMPATIBLE)
    .deserializeNonexistentEnumValueAsNull(true)
    .withScopedMetaShare(true)
    .buildThreadSafeFuryPool(64, 128);`
`public static Object zeroCopyDeserialize(byte[] byteBuffer) {
    return  fury.deserialize(byteBuffer);
}`
`public static void main(String[] args) throws Exception {
    String demo = "AiYAAAAAAf8AAAAAAADwP//No2XczdnvP/8AAAAAAAD4//8B/wABUA1KswMLDXtaCn2wmiLJpbx6GiTwTEfTATii+pCdEmpEjVAiaGiT1gwAPTbFo4mADFgRyIlYgRyIYNQBplk7ITokGtS9AldkJ0SAGtRF1Jk7ITokGrQcEuuiMkQTdMhOiQAU";
    byte[] decode = Base64.getDecoder().decode(demo);
    Object o = FuryUtils.zeroCopyDeserialize(decode);
    JSONObject.toJSONString(Double.NaN);
    String jsonString = JSONObject.toJSONString(o);
    System.out.println(jsonString);
}`
  1. 使用JSONObject.toJSONString(Double.NaN)方法时,调用com.alibaba.fastjson2.util.NumberUtils#doubleToScientific对double转化为科学计数可以正常解析为null。
    Image
  2. 使用JSONObject.toJSONString(o)方法时,调用com.alibaba.fastjson2.util.NumberUtils#doubleToScientific则会数组越界异常。
    这是o的类结构以及属性值
    Image
    这是执行doubleToScientific的快照
    Image
    Image
    Image

PS:

  1. 对象o是由fury反序列化解析得到的,至于为什么是NonexistentClass$NonexistentMetaShared类型,是由于fury反序列化时没有找到序列化时的对象,fury开启了元数据共享模式,将属性值直接灌到一个Map中了,这个Map被NonexistentClass继承了。
  2. 使用2.0.36版本
    同样的对象o调用com.alibaba.fastjson2.util.DoubleToDecimal#toString(double, char[], int, boolean),会转化为null
    Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixed

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions