危机再度降临!Fastjson新Bug曝光

前提背景

公司最近线上又出现 OOM 了没想道这次是 fastjson,之前就被他搞过一次了,还来?

Bug 描述:外部接口返回一个 JSON 字符串,要将字符串转成 List 数组,在转换的过程中出现了 OOM

依赖信息 fastjson 2.0.7

<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>fastjson</artifactId>  
    <version>2.0.7</version>  
</dependency>

错误点

返回的字符串缺少右括号 “]” 导致死循环直到OOM

	String json = "[19,20,21";  

示例代码

	@Test  
	public void fasJsonBug() {  
	    String json = "[19,20,21";  
	    List<Integer> list = new ArrayList<>();  
	    try {  
	        list = JSONArray.parseArray(json, Integer.class);  
	    }catch (Exception e){  
	        log.error("fasJson error",e);  
	    }  
	}

错误信息

截屏2024-02-05 14.36.30.png

错误分析

执行流程

在这里插入图片描述

JSON. class

parseArray方法

image.png

JSONReader. Class

read方法

image.png

ObjestReaderImplList.class

readObject方法

罪魁祸首就出在这,用 while 循环找 “]” 如果找不到就会一直循环下去,直到内存溢出

image.png

	while(!jsonReader.nextIfMatch(']')) {  
	    Object item;  
	    if (this.itemObjectReader != null) {  
	        item = this.itemObjectReader.readObject(jsonReader, 0L);  
	    } else {  
	        if (this.itemType != String.class) {  
	            throw new JSONException(jsonReader.info("TODO : " + this.itemType));  
	        }  
	  
	        item = jsonReader.readString();  
	    }  
	  
	    ((Collection)list).add(item);  
	    if (jsonReader.nextIfMatch(',')) {  
	    }  
	}

现在我们已经考虑要换别的依赖了

更多有趣的内容请关注我的公众号 程序员林中酒

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值