Skip to content

当key不存在时zset的部分接口会导致进程panic #99

@rocket323

Description

@rocket323

问题涉及到的zset接口:ZCount, ZLexCount, ZRange, ZRevRange, ZRangeByLex, ZRevRangeByLex, ZRangeByScore, ZRevRangeByScore.

以ZCount为例:

o, err := s.loadZSetRow(db, key)
if err != nil {
    return 0, errors.Trace(err)
}

var count int64 = 0
f := func(o *zsetRow) error {
    count++
    return nil
}

if err = o.travelInRange(s, r, f); err != nil {
    return 0, errors.Trace(err)
}

s.loadZSetRow方法在zset集合key不存在的情况下,可能会err != nil 并且 o == nil,而代码只判断了err是否为nil,没有判断o为nil的情况。后面调用o的方法的时候就panic了。

if err != nil || o == nil {
    return 0, errors.Trace(err)
}

改成上面这样可以解决问题,其他的接口也同样修改,麻烦看下:)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions