aboutsummaryrefslogtreecommitdiffstats
path: root/rlp
Commit message (Collapse)AuthorAgeFilesLines
* rlp: improve nil pointer handling (#20064)Felix Lange2019-09-137-244/+416
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * rlp: improve nil pointer handling In both encoder and decoder, the rules for encoding nil pointers were a bit hard to understand, and didn't leave much choice. Since RLP allows two empty values (empty list, empty string), any protocol built on RLP must choose either of these values to represent the null value in a certain context. This change adds choice in the form of two new struct tags, "nilString" and "nilList". These can be used to specify how a nil pointer value is encoded. The "nil" tag still exists, but its implementation is now explicit and defines exactly how nil pointers are handled in a single place. Another important change in this commit is how nil pointers and the Encoder interface interact. The EncodeRLP method was previously called even on nil values, which was supposed to give users a choice of how their value would be handled when nil. It turns out this is a stupid idea. If you create a network protocol containing an object defined in another package, it's better to be able to say that the object should be a list or string when nil in the definition of the protocol message rather than defining the encoding of nil on the object itself. As of this commit, the encoding rules for pointers now take precedence over the Encoder interface rule. I think the "nil" tag will work fine for most cases. For special kinds of objects which are a struct in Go but strings in RLP, code using the object can specify the desired encoding of nil using the "nilString" and "nilList" tags. * rlp: propagate struct field type errors If a struct contained fields of undecodable type, the encoder and decoder would panic instead of returning an error. Fix this by propagating type errors in makeStruct{Writer,Decoder} and add a test.
* rlp: fixes for two corner cases and documentation (#19527)Felix Lange2019-05-145-57/+111
| | | | | | | | | | These changes fix two corner cases related to internal handling of types in package rlp: The "tail" struct tag can only be applied to the last field. The check for this was wrong and didn't allow for private fields after the field with the tag. Unsupported types (e.g. structs containing int) which implement either the Encoder or Decoder interface but not both couldn't be encoded/decoded. Also fixes #19367
* rlp: added pooling of streams using sync (#19044)Marius van der Wijden2019-02-251-4/+17
| | | Prevents reallocation, improves performance
* rlp: fix comment typo (#17640)chenyufeng2018-09-111-1/+1
|
* rlp: fix some golint warnings (#16659)kiel barry2018-05-082-37/+27
|
* rlp: fix string size check in readKind (#15625)Felix Lange2017-12-122-1/+2
| | | Issue found by @guidovranken
* rlp: fix decoding long strings into RawValue typesPéter Szilágyi2017-08-242-11/+26
|
* rlp, trie, contracts, compression, consensus: improve comments (#14580)S. Matthew English2017-06-124-8/+8
|
* rlp: add support for "-" struct tagFelix Lange2017-03-074-7/+31
|
* all: fix go vet warningsFelix Lange2016-04-152-5/+3
|
* all: update license informationFelix Lange2016-04-151-0/+16
|
* rlp: add "tail" struct tagFelix Lange2016-02-196-26/+163
|
* rlp: move ListSize to raw.goFelix Lange2015-09-112-6/+6
|
* rlp: add RawValueFelix Lange2015-09-115-1/+39
|
* rlp: add Split functionsFelix Lange2015-09-113-1/+337
| | | | | These functions allow destructuring of raw rlp-encoded bytes without the overhead of reflection or copying.
* rlp: fix encReader returning nil buffers to the poolFelix Lange2015-09-112-4/+32
| | | | | | The bug can cause crashes if Read is called after EOF has been returned. No code performs such calls right now, but hitting the bug gets more likely as rlp.EncodeToReader gets used in more places.
* rlp: add support for boolean encoding/decodingPéter Szilágyi2015-08-134-0/+53
|
* all: fix license headers one more timeFelix Lange2015-07-247-7/+7
| | | | I forgot to update one instance of "go-ethereum" in commit 3f047be5a.
* all: update license headers to distiguish GPL/LGPLFelix Lange2015-07-237-28/+28
| | | | | All code outside of cmd/ is licensed as LGPL. The headers now reflect this by calling the whole work "the go-ethereum library".
* rlp: fix check for canonical byte array sizeFelix Lange2015-07-182-9/+16
| | | | | | Decoding did not reject byte arrays of length one with a single element b where 55 < b < 128. Such byte arrays must be rejected because they must be encoded as the single byte b instead.
* rlp: reject trailing data when using DecodeBytesFelix Lange2015-07-181-1/+13
|
* all: update license informationFelix Lange2015-07-077-0/+112
|
* rlp: add ListSizeFelix Lange2015-06-301-0/+6
|
* rlp: remove FlatFelix Lange2015-06-302-51/+0
|
* rlp: pool encoder allocationsFelix Lange2015-06-301-9/+27
|
* rlp: fix list bounds check overflow (found by go-fuzz)Felix Lange2015-04-282-14/+40
| | | | | | The list size checking overflowed if the size information for a value was bigger than the list. This is resolved by always performing the check before reading.
* rlp: require declared number of input elements for array typesFelix Lange2015-04-172-40/+26
|
* rlp: stop accepting lists for byte slices and byte arraysFelix Lange2015-04-172-45/+10
|
* rlp: stricter rules for structs and pointersFelix Lange2015-04-174-52/+148
| | | | | | | | | | The rules have changed as follows: * When decoding into pointers, empty values no longer produce a nil pointer. This can be overriden for struct fields using the struct tag "nil". * When decoding into structs, the input list must contain an element for each field.
* rlp: reject non-minimal input stringsFelix Lange2015-04-172-15/+45
| | | | | Input strings of length 1 containing a byte < 56 are non-minimal and should be encoded as a single byte instead. Reject such strings.
* rlp: stricter validation of canonical integer formatFelix Lange2015-04-172-42/+93
| | | | | | | All integers (including size information in type tags) need to be encoded using the smallest possible encoding. This commit expands the stricter validation introduced for *big.Int in commit 59597d23a5ee268 to all integer types and size tags.
* rlp: fix handling of single byte zero when decoding into a pointerFelix Lange2015-04-172-6/+6
| | | | | | A single zero byte carries information and should not set the pointer to nil. This is arguably a corner case. While here, fix the comment to explain pointer reuse.
* rlp: fix integer overflow in list element size validationFelix Lange2015-04-172-2/+5
| | | | It is not safe to add anything to s.size.
* rlp: check top-level value sizes against input limitFelix Lange2015-04-172-56/+171
| | | | | | This is a preliminary fix for #420 (SEC-18 RLP decoder unsafe allocation). If a sane input limit is set on the rlp.Stream, it should no longer be possible to cause huge []byte allocations.
* Reject integers w/ appended zero'sobscuren2015-04-052-0/+10
|
* rlp: encode nil array pointers as empty list or stringFelix Lange2015-03-252-8/+28
|
* rlp: add Stream.RawFelix Lange2015-03-213-12/+59
|
* rlp: fix nil pointer decodingFelix Lange2015-03-212-2/+27
| | | | | | The generic pointer decoder did not advance the input position for empty values. This can lead to strange issues and even infinite loops.
* rlp: fix encoding of one element strings and byte slicesFelix Lange2015-03-192-7/+20
| | | | | | The encoder was missing a special case for one element strings whose element is below 0x7f. Such strings must be encoded as a single byte without a string header.
* rlp: add DecodeBytesFelix Lange2015-03-181-0/+7
| | | | Über-convenience.
* rlp: don't panic for nil *big.IntFelix Lange2015-03-182-1/+7
| | | | All other pointer types can handle nil just fine.
* wipobscuren2015-02-132-1/+27
|\
| * rlp: fix encoding of arrays with byte element typeFelix Lange2015-02-062-1/+27
| |
* | rlp: add FlatFelix Lange2015-02-122-0/+58
|/
* rlp: allow encoding non-empty interface valuesFelix Lange2015-01-164-3/+23
| | | | | | | | This needs to be supported because []someInterface does occur sometimes. Funny enough, the fix involves changes to the decoder. makeDecoder cannot return an error for non-empty interfaces anymore because the type cache builds both decoder and writer. Do the check at 'runtime' instead.
* rlp: fix Decode benchmarksFelix Lange2015-01-151-8/+10
|
* rlp: add functions for encodingFelix Lange2015-01-156-17/+860
| | | | | | | | I'm reasonably confident that the encoding matches the output of ethutil.Encode for values that it supports. Some of the tests have been adpated from the Ethereum testing repository. There are still TODOs in the code.
* Mergeobscuren2015-01-062-23/+72
|
* rlp: display decoder target type in more error messagesFelix Lange2014-12-102-27/+33
| | | | | Decode error messages now say "expected input list for foo.MyStruct" instead of just "expected List".
* rlp: remove dead codeFelix Lange2014-12-091-2/+0
|
* rlp: fix panic in decodeList on go 1.4+Felix Lange2014-12-091-48/+61
| | | | | The documentation for reflect.Value.Index states that it will panic for out-of-bounds indices. Since go 1.4, it actually panics.
* rlp: remove support for signed integer typesFelix Lange2014-12-093-52/+29
| | | | | There is no agreement on how to encode negative integers across implementations. cpp-ethereum doesn't support them either.
* rlp: move decoder type switch to decode.goFelix Lange2014-12-092-32/+36
|
* rlp: include target type in decoder error messagesFelix Lange2014-11-252-28/+42
|
* rlp: add NewListStream (for p2p)Felix Lange2014-11-252-0/+27
|
* rlp: add Stream.Reset and accept any reader (for p2p)Felix Lange2014-11-252-7/+66
|
* rlp: fix pointer reuseFelix Lange2014-11-172-2/+10
|
* rlp: new package for streaming RLP decoderFelix Lange2014-11-174-0/+1243