diff options
author | Felix Lange <fjl@twurst.com> | 2017-03-08 06:19:27 +0800 |
---|---|---|
committer | Felix Lange <fjl@twurst.com> | 2017-03-23 22:58:42 +0800 |
commit | b4547a560b861e2e5463bf6fed6d61958c4e9411 (patch) | |
tree | 9b7e2171f4e8b9671ee3b67c5c591b440a2c0a94 /common/hexutil/json.go | |
parent | 04fa6a374499dcefeb3f854c4cf6cfcdfb6c8c76 (diff) | |
download | dexon-b4547a560b861e2e5463bf6fed6d61958c4e9411.tar.gz dexon-b4547a560b861e2e5463bf6fed6d61958c4e9411.tar.zst dexon-b4547a560b861e2e5463bf6fed6d61958c4e9411.zip |
common/hexutil: add UnmarshalFixedUnprefixedText
Diffstat (limited to 'common/hexutil/json.go')
-rw-r--r-- | common/hexutil/json.go | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/common/hexutil/json.go b/common/hexutil/json.go index 23393ed2c..1bc1d014c 100644 --- a/common/hexutil/json.go +++ b/common/hexutil/json.go @@ -51,7 +51,7 @@ func (b *Bytes) UnmarshalJSON(input []byte) error { // UnmarshalText implements encoding.TextUnmarshaler. func (b *Bytes) UnmarshalText(input []byte) error { - raw, err := checkText(input) + raw, err := checkText(input, true) if err != nil { return err } @@ -73,7 +73,28 @@ func (b Bytes) String() string { // determines the required input length. This function is commonly used to implement the // UnmarshalText method for fixed-size types. func UnmarshalFixedText(typname string, input, out []byte) error { - raw, err := checkText(input) + raw, err := checkText(input, true) + if err != nil { + return err + } + if len(raw)/2 != len(out) { + return fmt.Errorf("hex string has length %d, want %d for %s", len(raw), len(out)*2, typname) + } + // Pre-verify syntax before modifying out. + for _, b := range raw { + if decodeNibble(b) == badNibble { + return ErrSyntax + } + } + hex.Decode(out, raw) + return nil +} + +// UnmarshalFixedUnprefixedText decodes the input as a string with optional 0x prefix. The +// length of out determines the required input length. This function is commonly used to +// implement the UnmarshalText method for fixed-size types. +func UnmarshalFixedUnprefixedText(typname string, input, out []byte) error { + raw, err := checkText(input, false) if err != nil { return err } @@ -243,14 +264,15 @@ func bytesHave0xPrefix(input []byte) bool { return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') } -func checkText(input []byte) ([]byte, error) { +func checkText(input []byte, wantPrefix bool) ([]byte, error) { if len(input) == 0 { return nil, nil // empty strings are allowed } - if !bytesHave0xPrefix(input) { + if bytesHave0xPrefix(input) { + input = input[2:] + } else if wantPrefix { return nil, ErrMissingPrefix } - input = input[2:] if len(input)%2 != 0 { return nil, ErrOddLength } |