nspcc-dev/neo-go

Item cast to struct does not ensure/convert field type

Open

#3,610 opened on Oct 11, 2024

 (0 comments) (0 reactions) (0 assignees)Go (108 forks)auto 404
I4S4U3bugcompilerhelp wanted

Repository metrics

Stars
 (132 stars)
PR merge metrics
 (PR metrics pending)

Description

Tried to cast item from contract's storage and use it.

Current Behavior

	newNodes := storage.Find(ctx, newNodesPrefix, storage.None)
	for iterator.Next(newNodes) {
		newNode := iterator.Value(newNodes).(struct {
			key []byte
			val []byte
		})

		newNode.key[0] = 1
	}

leads to SETITEM: invalid item type ByteString

newNode.key[:][0] = 1 solves the issue... why?

Expected Behavior

I said (asserted/converted) that it is a []byte, i want to use it as []byte.

Possible Solution

Ensure, cast or throw an exception at .() operator, not when it is tried to be used later.

Steps to Reproduce

Code from Current Behavior.

Context

https://github.com/nspcc-dev/neofs-contract/pull/438#discussion_r1786975526

Regression

Not sure.

Your Environment

github.com/nspcc-dev/neo-go v0.106.3

Contributor guide