Merge pull request #3152 from filecoin-project/fix/chainwatch/rpc-peer-id-bug

fix(api): Filter malformed peer ID before RPC marshaling
This commit is contained in:
Łukasz Magiera 2020-08-18 23:07:55 +02:00 committed by GitHub
commit 19be380b53
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 19 additions and 10 deletions

View File

@ -50,7 +50,7 @@ type MinerInfo struct {
Worker address.Address // Must be an ID-address. Worker address.Address // Must be an ID-address.
NewWorker address.Address // Must be an ID-address. NewWorker address.Address // Must be an ID-address.
WorkerChangeEpoch abi.ChainEpoch WorkerChangeEpoch abi.ChainEpoch
PeerId peer.ID PeerId *peer.ID
Multiaddrs []abi.Multiaddrs Multiaddrs []abi.Multiaddrs
SealProofType abi.RegisteredSealProof SealProofType abi.RegisteredSealProof
SectorSize abi.SectorSize SectorSize abi.SectorSize
@ -58,12 +58,17 @@ type MinerInfo struct {
} }
func NewApiMinerInfo(info *miner.MinerInfo) MinerInfo { func NewApiMinerInfo(info *miner.MinerInfo) MinerInfo {
var pid *peer.ID
if peerID, err := peer.IDFromBytes(info.PeerId); err == nil {
pid = &peerID
}
mi := MinerInfo{ mi := MinerInfo{
Owner: info.Owner, Owner: info.Owner,
Worker: info.Worker, Worker: info.Worker,
NewWorker: address.Undef, NewWorker: address.Undef,
WorkerChangeEpoch: -1, WorkerChangeEpoch: -1,
PeerId: peer.ID(info.PeerId), PeerId: pid,
Multiaddrs: info.Multiaddrs, Multiaddrs: info.Multiaddrs,
SealProofType: info.SealProofType, SealProofType: info.SealProofType,
SectorSize: info.SectorSize, SectorSize: info.SectorSize,

View File

@ -550,7 +550,7 @@ func interactiveDeal(cctx *cli.Context) error {
continue continue
} }
a, err := api.ClientQueryAsk(ctx, mi.PeerId, maddr) a, err := api.ClientQueryAsk(ctx, *mi.PeerId, maddr)
if err != nil { if err != nil {
printErr(xerrors.Errorf("failed to query ask: %w", err)) printErr(xerrors.Errorf("failed to query ask: %w", err))
state = "miner" state = "miner"
@ -926,11 +926,11 @@ var clientQueryAskCmd = &cli.Command{
return xerrors.Errorf("failed to get peerID for miner: %w", err) return xerrors.Errorf("failed to get peerID for miner: %w", err)
} }
if peer.ID(mi.PeerId) == peer.ID("SETME") { if peer.ID(*mi.PeerId) == peer.ID("SETME") {
return fmt.Errorf("the miner hasn't initialized yet") return fmt.Errorf("the miner hasn't initialized yet")
} }
pid = peer.ID(mi.PeerId) pid = peer.ID(*mi.PeerId)
} }
ask, err := api.ClientQueryAsk(ctx, pid, maddr) ask, err := api.ClientQueryAsk(ctx, pid, maddr)

View File

@ -879,11 +879,15 @@ func (p *Processor) storeMinersActorInfoState(ctx context.Context, miners []mine
return err return err
} }
} }
var pid string
if mi.PeerId != nil {
pid = mi.PeerId.String()
}
if _, err := stmt.Exec( if _, err := stmt.Exec(
m.common.addr.String(), m.common.addr.String(),
mi.Owner.String(), mi.Owner.String(),
mi.Worker.String(), mi.Worker.String(),
mi.PeerId.String(), pid,
mi.SectorSize.ShortString(), mi.SectorSize.ShortString(),
); err != nil { ); err != nil {
log.Errorw("failed to store miner state", "state", m.state, "info", m.state.Info, "error", err) log.Errorw("failed to store miner state", "state", m.state, "info", m.state.Info, "error", err)

View File

@ -514,7 +514,7 @@ func (c *ClientNodeAdapter) GetMinerInfo(ctx context.Context, addr address.Addre
return nil, err return nil, err
} }
out := utils.NewStorageProviderInfo(addr, mi.Worker, mi.SectorSize, mi.PeerId, mi.Multiaddrs) out := utils.NewStorageProviderInfo(addr, mi.Worker, mi.SectorSize, *mi.PeerId, mi.Multiaddrs)
return &out, nil return &out, nil
} }

View File

@ -137,7 +137,7 @@ func (a *API) ClientStartDeal(ctx context.Context, params *api.StartDealParams)
return nil, xerrors.New("data doesn't fit in a sector") return nil, xerrors.New("data doesn't fit in a sector")
} }
providerInfo := utils.NewStorageProviderInfo(params.Miner, mi.Worker, mi.SectorSize, mi.PeerId, mi.Multiaddrs) providerInfo := utils.NewStorageProviderInfo(params.Miner, mi.Worker, mi.SectorSize, *mi.PeerId, mi.Multiaddrs)
dealStart := params.DealStartEpoch dealStart := params.DealStartEpoch
if dealStart <= 0 { // unset, or explicitly 'epoch undefined' if dealStart <= 0 { // unset, or explicitly 'epoch undefined'
@ -255,7 +255,7 @@ func (a *API) ClientMinerQueryOffer(ctx context.Context, miner address.Address,
} }
rp := rm.RetrievalPeer{ rp := rm.RetrievalPeer{
Address: miner, Address: miner,
ID: mi.PeerId, ID: *mi.PeerId,
} }
return a.makeRetrievalQuery(ctx, rp, root, piece, rm.QueryParams{}), nil return a.makeRetrievalQuery(ctx, rp, root, piece, rm.QueryParams{}), nil
} }
@ -443,7 +443,7 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref
} }
order.MinerPeer = retrievalmarket.RetrievalPeer{ order.MinerPeer = retrievalmarket.RetrievalPeer{
ID: mi.PeerId, ID: *mi.PeerId,
Address: order.Miner, Address: order.Miner,
} }
} }