int16溢出bug记录

2017/07/31

在一个业务中用到了token(介绍参见这里

加密:将各种信息+生成时间(issueTime)+有效期(ttl)利用私钥加密,然后base64。

判断过期的时候,会首先去检查token里面编码的 issueTime+ttl,和time.now对比。

但是呢,为了减少token的长度,ttl是int16类型的(单位分钟),所以最大存储 32768。而我们需要存储一星期的token,也就是 7*24*60 = 10080。

哈哈,本来是没有问题的,bug就是出现在下面一点。

计算过期:

if issueTime + uint32(ttl*60) < time.Now().Unix() {
    // 过期
}

我刚开始是认为ttl虽然是int16的,但是外面包了一层uint32,所以结果没什么问题。可是ttl*60的结果直接就溢出了,所以就算外面包了一层,也没有任何影响。最终的结果还是溢出。。

改进:

if issueTime + uint32(ttl)*60 < time.Now().Unix() {
    // 过期
}

bug记录。