From 6f8f1c2c77d5dbfece3f6a7c0e33b1e4e407e286 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Tue, 5 Mar 2024 18:09:29 +0300 Subject: [PATCH] fix(claimsmanager): properly check index to avoid invalid data in UserClaims,UserLastEpochClaims This change ensures that we correctly check for missing values in keeper.(UserClaims, UserLastEpochClaims) because otherwise due to the blind assumption that the key would always be well formed, +1 and +1+1 were being added respectively which would mean that the condition "idx >= 0" would ALWAYS pass and send over the wrong data if the key happened to contain the address bytes. Fixes #1217 Supersedes PR #1223 --- x/claimsmanager/keeper/grpc_query.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/x/claimsmanager/keeper/grpc_query.go b/x/claimsmanager/keeper/grpc_query.go index a9f716ee7..6414bd4b1 100644 --- a/x/claimsmanager/keeper/grpc_query.go +++ b/x/claimsmanager/keeper/grpc_query.go @@ -68,10 +68,17 @@ func (k Keeper) UserClaims(c context.Context, q *types.QueryClaimsRequest) (*typ addrBytes := []byte(q.Address) k.IterateAllClaims(ctx, func(_ int64, key []byte, claim types.Claim) (stop bool) { + // The assumption is that IterateAllClaims returns non-empty keys. // check for the presence of the addr bytes in the key. - // first prefix byte is 0x00; so cater for that! Then + 1 to skip the separator. - idx := bytes.Index(key[1:], []byte{0x00}) + 1 + 1 - if idx >= 0 && bytes.Equal(key[idx:idx+len(addrBytes)], addrBytes) { + // first prefix byte is 0x00; so cater for that! + idx := bytes.Index(key[1:], []byte{0x00}) + if idx < 0 { + return false + } + + idx += 1 + 1 // add + 1 to skip the separator. + + if bytes.Equal(key[idx:idx+len(addrBytes)], addrBytes) { out = append(out, claim) } return false @@ -86,9 +93,15 @@ func (k Keeper) UserLastEpochClaims(c context.Context, q *types.QueryClaimsReque addrBytes := []byte(q.Address) k.IterateAllLastEpochClaims(ctx, func(_ int64, key []byte, claim types.Claim) (stop bool) { // check for the presence of the addr bytes in the key. - // First byte is 0x01 here, so no need to consider it; + 1 to skip the separator. - idx := bytes.Index(key, []byte{0x00}) + 1 - if idx >= 0 && bytes.Equal(key[idx:idx+len(addrBytes)], addrBytes) { + idx := bytes.Index(key, []byte{0x00}) + if idx < 0 { + return false + } + + // First byte was 0x01, so no need to consider it; + 1 to skip the separator. + idx += 1 + + if bytes.Equal(key[idx:idx+len(addrBytes)], addrBytes) { out = append(out, claim) } return false