快一个月,Go1.16 才发现了比较严重的 Bug,但这个 Bug 有点 Low。。。

共 1823字,需浏览 4分钟

 ·

2021-03-13 22:37

阅读本文大概需要 4 分钟。

大家好,我是站长 polarisxu。

Go 1.16 是 2021 年 2 月 16 日发布的。新版本发布,大家一般会等等,坐等 1.16.1 发布。没想到快一个月了才等到。

和之前一样,小版本是修复 Bug,会同时发布两个版本,这次是 Go1.16.1 和 Go1.15.9。那具体什么 Bug 呢?

Bug 1:encoding/xml 包相关

这个 Bug 不是 1.16 引入的,而是之前版本就存在。所以,Go 1.15.9 也修复了该 Bug。

具体是:在通过 xml.NewTokenDecoder 获得一个 Decoder 指针时,如果参数 TokenReader 是自定义的,可能会出现死循环。

The Decode, DecodeElement, and Skip methods of an xml.Decoder provided by xml.NewTokenDecoder may enter an infinite loop when operating on a custom xml.TokenReader which returns an EOF in the middle of an open XML element.

详情见 issue:https://github.com/golang/go/issues/44915。

Bug 2:archive/zip 包相关

当调用该包中的 Render.Open 方法时,如果 zip 包含以 ../ 开头的文件,该方法会 panic。这个方法是 Go1.16 新增的,因为返回了 io/fs.File 类型。

func (r *Reader) Open(name string) (fs.File, error)

当跟踪修复该 Bug 的代码时,有点掉价。。。(见:https://github.com/golang/go/commit/634d28d78ccbeb6e86f8bfeba030ea8be518f8fa)

完整的修复前的代码:

func toValidName(name string) string {
 name = strings.ReplaceAll(name, `\``/`)
 p := path.Clean(name)
 if strings.HasPrefix(p, "/") {
  p = p[len("/"):]
 }
 for strings.HasPrefix(name, "../") {
  p = p[len("../"):]
 }
 return p
}

通过 for 循环处理 p 中的 ../,结果 for 里面用的却是 name 变量,这个 bug 有点 low。。。可见大神们也有犯低级错误的时候。所以,如果你团队成员偶尔犯了低级错误,别太责备,让他抄写对应 Bug 100 遍即可,哈哈哈哈!

以上两个 Bug 都定义为安全问题。Go Team 正在为 Go 版本中的漏洞提出一个新的安全策略。有兴趣的可以参与讨论:https://github.com/golang/go/issues/44918。


如果你使用了 Go1.16,而且可能用了 zip 包,建议大家升级到 Go1.16.1 版本。而 xml,可能很多人都没用到?!Go 语言中文网已经为你准备好了下载地址:https://studygolang.com/dl,当然也可以使用喜欢的方式升级。




往期推荐


欢迎关注我

浏览 61
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报