@@ -10,7 +10,10 @@ use alloc::{string::String, vec::Vec};
10
10
11
11
use ciborium_io:: Read ;
12
12
use ciborium_ll:: * ;
13
- use serde:: { de, de:: Deserializer as _, forward_to_deserialize_any} ;
13
+ use serde:: {
14
+ de:: { self , value:: BytesDeserializer , Deserializer as _} ,
15
+ forward_to_deserialize_any,
16
+ } ;
14
17
15
18
trait Expected < E : de:: Error > {
16
19
fn expected ( self , kind : & ' static str ) -> E ;
72
75
}
73
76
74
77
#[ inline]
75
- fn integer ( & mut self , mut header : Option < Header > ) -> Result < ( bool , u128 ) , Error < R :: Error > > {
78
+ fn integer < B : FnMut ( u8 ) > (
79
+ & mut self ,
80
+ mut header : Option < Header > ,
81
+ mut append : Option < B > ,
82
+ ) -> Result < ( bool , u128 ) , Error < R :: Error > > {
76
83
loop {
77
84
let header = match header. take ( ) {
78
85
Some ( h) => h,
@@ -99,7 +106,22 @@ where
99
106
while let Some ( chunk) = segment. pull ( & mut buffer) ? {
100
107
for b in chunk {
101
108
match index {
102
- 16 => return Err ( de:: Error :: custom ( "bigint too large" ) ) ,
109
+ 16 => {
110
+ if let Some ( app) = append. as_mut ( ) {
111
+ for v in value {
112
+ app ( v) ;
113
+ }
114
+ app ( * b) ;
115
+ index = 17 ; // Indicate overflow, see below
116
+ continue ;
117
+ }
118
+ return Err ( de:: Error :: custom ( "bigint too large" ) ) ;
119
+ }
120
+ 17 => {
121
+ // append is not None
122
+ append. as_mut ( ) . unwrap ( ) ( * b) ;
123
+ continue ;
124
+ }
103
125
0 if * b == 0 => continue , // Skip leading zeros
104
126
_ => value[ index] = * b,
105
127
}
@@ -109,8 +131,12 @@ where
109
131
}
110
132
}
111
133
112
- value[ ..index] . reverse ( ) ;
113
- Ok ( ( neg, u128:: from_le_bytes ( value) ) )
134
+ if index == 17 {
135
+ Ok ( ( false , 0 ) )
136
+ } else {
137
+ value[ ..index] . reverse ( ) ;
138
+ Ok ( ( neg, u128:: from_le_bytes ( value) ) )
139
+ }
114
140
}
115
141
116
142
h => Err ( h. expected ( "bytes" ) ) ,
@@ -157,18 +183,21 @@ where
157
183
let header = self . decoder . pull ( ) ?;
158
184
self . decoder . push ( header) ;
159
185
160
- // If it is bytes, capture the length.
161
- let len = match header {
162
- Header :: Bytes ( x) => x,
163
- _ => None ,
164
- } ;
165
-
166
- match ( tag, len) {
167
- ( tag:: BIGPOS , Some ( len) ) | ( tag:: BIGNEG , Some ( len) ) if len <= 16 => {
168
- let result = match self . integer ( Some ( Header :: Tag ( tag) ) ) ? {
169
- ( false , raw) => return visitor. visit_u128 ( raw) ,
170
- ( true , raw) => i128:: try_from ( raw) . map ( |x| x ^ !0 ) ,
171
- } ;
186
+ match tag {
187
+ tag:: BIGPOS | tag:: BIGNEG => {
188
+ let mut bytes = Vec :: new ( ) ;
189
+ let result =
190
+ match self . integer ( Some ( Header :: Tag ( tag) ) , Some ( |b| bytes. push ( b) ) ) ? {
191
+ ( false , _) if !bytes. is_empty ( ) => {
192
+ let access = crate :: tag:: TagAccess :: new (
193
+ BytesDeserializer :: new ( & bytes) ,
194
+ Some ( tag) ,
195
+ ) ;
196
+ return visitor. visit_enum ( access) ;
197
+ }
198
+ ( false , raw) => return visitor. visit_u128 ( raw) ,
199
+ ( true , raw) => i128:: try_from ( raw) . map ( |x| x ^ !0 ) ,
200
+ } ;
172
201
173
202
match result {
174
203
Ok ( x) => visitor. visit_i128 ( x) ,
@@ -238,7 +267,7 @@ where
238
267
}
239
268
240
269
fn deserialize_i64 < V : de:: Visitor < ' de > > ( self , visitor : V ) -> Result < V :: Value , Self :: Error > {
241
- let result = match self . integer ( None ) ? {
270
+ let result = match self . integer ( None , None :: < fn ( _ ) > ) ? {
242
271
( false , raw) => i64:: try_from ( raw) ,
243
272
( true , raw) => i64:: try_from ( raw) . map ( |x| x ^ !0 ) ,
244
273
} ;
@@ -250,7 +279,7 @@ where
250
279
}
251
280
252
281
fn deserialize_i128 < V : de:: Visitor < ' de > > ( self , visitor : V ) -> Result < V :: Value , Self :: Error > {
253
- let result = match self . integer ( None ) ? {
282
+ let result = match self . integer ( None , None :: < fn ( _ ) > ) ? {
254
283
( false , raw) => i128:: try_from ( raw) ,
255
284
( true , raw) => i128:: try_from ( raw) . map ( |x| x ^ !0 ) ,
256
285
} ;
@@ -274,7 +303,7 @@ where
274
303
}
275
304
276
305
fn deserialize_u64 < V : de:: Visitor < ' de > > ( self , visitor : V ) -> Result < V :: Value , Self :: Error > {
277
- let result = match self . integer ( None ) ? {
306
+ let result = match self . integer ( None , None :: < fn ( _ ) > ) ? {
278
307
( false , raw) => u64:: try_from ( raw) ,
279
308
( true , ..) => return Err ( de:: Error :: custom ( "unexpected negative integer" ) ) ,
280
309
} ;
@@ -286,7 +315,7 @@ where
286
315
}
287
316
288
317
fn deserialize_u128 < V : de:: Visitor < ' de > > ( self , visitor : V ) -> Result < V :: Value , Self :: Error > {
289
- match self . integer ( None ) ? {
318
+ match self . integer ( None , None :: < fn ( _ ) > ) ? {
290
319
( false , raw) => visitor. visit_u128 ( raw) ,
291
320
( true , ..) => Err ( de:: Error :: custom ( "unexpected negative integer" ) ) ,
292
321
}
0 commit comments