Skip to content

Commit 6e723c1

Browse files
committed
Fix ReadXxx from uint64 encoded value returns invalid value.
This commit fixes the bug that the code ignored the fact that integral value may be unsigned value rather than signed value. This caused illegal negative integer results which should be positive values greator than Int64.MaxValue. This commit adds casting to UInt64 with overflow checking if neccessary.
1 parent e03d2ce commit 6e723c1

File tree

2 files changed

+154
-31
lines changed

2 files changed

+154
-31
lines changed

src/MsgPack/ItemsUnpacker.Read.cs

Lines changed: 109 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//
55
// MessagePack for CLI
66
//
7-
// Copyright (C) 2010-2015 FUJIWARA, Yusuke
7+
// Copyright (C) 2010-2016 FUJIWARA, Yusuke
88
//
99
// Licensed under the Apache License, Version 2.0 (the "License");
1010
// you may not use this file except in compliance with the License.
@@ -150,12 +150,17 @@ internal bool ReadSubtreeByte( out Byte result )
150150
case ReadValueResult.Int64:
151151
case ReadValueResult.UInt16:
152152
case ReadValueResult.UInt32:
153-
case ReadValueResult.UInt64:
154153
{
155154
this.InternalCollectionType = CollectionType.None;
156155
result = checked( ( Byte )integral );
157156
return true;
158157
}
158+
case ReadValueResult.UInt64:
159+
{
160+
this.InternalCollectionType = CollectionType.None;
161+
result = checked( ( Byte )( UInt64 )integral );
162+
return true;
163+
}
159164
case ReadValueResult.Single:
160165
{
161166
this.InternalCollectionType = CollectionType.None;
@@ -218,12 +223,17 @@ internal bool ReadSubtreeNullableByte( out Byte? result )
218223
case ReadValueResult.Int64:
219224
case ReadValueResult.UInt16:
220225
case ReadValueResult.UInt32:
221-
case ReadValueResult.UInt64:
222226
{
223227
this.InternalCollectionType = CollectionType.None;
224228
result = checked( ( Byte )integral );
225229
return true;
226230
}
231+
case ReadValueResult.UInt64:
232+
{
233+
this.InternalCollectionType = CollectionType.None;
234+
result = checked( ( Byte )( UInt64 )integral );
235+
return true;
236+
}
227237
case ReadValueResult.Single:
228238
{
229239
this.InternalCollectionType = CollectionType.None;
@@ -280,12 +290,17 @@ internal bool ReadSubtreeSByte( out SByte result )
280290
case ReadValueResult.Byte:
281291
case ReadValueResult.UInt16:
282292
case ReadValueResult.UInt32:
283-
case ReadValueResult.UInt64:
284293
{
285294
this.InternalCollectionType = CollectionType.None;
286295
result = checked( ( SByte )integral );
287296
return true;
288297
}
298+
case ReadValueResult.UInt64:
299+
{
300+
this.InternalCollectionType = CollectionType.None;
301+
result = checked( ( SByte )( UInt64 )integral );
302+
return true;
303+
}
289304
case ReadValueResult.Single:
290305
{
291306
this.InternalCollectionType = CollectionType.None;
@@ -348,12 +363,17 @@ internal bool ReadSubtreeNullableSByte( out SByte? result )
348363
case ReadValueResult.Byte:
349364
case ReadValueResult.UInt16:
350365
case ReadValueResult.UInt32:
351-
case ReadValueResult.UInt64:
352366
{
353367
this.InternalCollectionType = CollectionType.None;
354368
result = checked( ( SByte )integral );
355369
return true;
356370
}
371+
case ReadValueResult.UInt64:
372+
{
373+
this.InternalCollectionType = CollectionType.None;
374+
result = checked( ( SByte )( UInt64 )integral );
375+
return true;
376+
}
357377
case ReadValueResult.Single:
358378
{
359379
this.InternalCollectionType = CollectionType.None;
@@ -410,12 +430,17 @@ internal bool ReadSubtreeInt16( out Int16 result )
410430
case ReadValueResult.Byte:
411431
case ReadValueResult.UInt16:
412432
case ReadValueResult.UInt32:
413-
case ReadValueResult.UInt64:
414433
{
415434
this.InternalCollectionType = CollectionType.None;
416435
result = checked( ( Int16 )integral );
417436
return true;
418437
}
438+
case ReadValueResult.UInt64:
439+
{
440+
this.InternalCollectionType = CollectionType.None;
441+
result = checked( ( Int16 )( UInt64 )integral );
442+
return true;
443+
}
419444
case ReadValueResult.Single:
420445
{
421446
this.InternalCollectionType = CollectionType.None;
@@ -478,12 +503,17 @@ internal bool ReadSubtreeNullableInt16( out Int16? result )
478503
case ReadValueResult.Byte:
479504
case ReadValueResult.UInt16:
480505
case ReadValueResult.UInt32:
481-
case ReadValueResult.UInt64:
482506
{
483507
this.InternalCollectionType = CollectionType.None;
484508
result = checked( ( Int16 )integral );
485509
return true;
486510
}
511+
case ReadValueResult.UInt64:
512+
{
513+
this.InternalCollectionType = CollectionType.None;
514+
result = checked( ( Int16 )( UInt64 )integral );
515+
return true;
516+
}
487517
case ReadValueResult.Single:
488518
{
489519
this.InternalCollectionType = CollectionType.None;
@@ -540,12 +570,17 @@ internal bool ReadSubtreeUInt16( out UInt16 result )
540570
case ReadValueResult.Int64:
541571
case ReadValueResult.Byte:
542572
case ReadValueResult.UInt32:
543-
case ReadValueResult.UInt64:
544573
{
545574
this.InternalCollectionType = CollectionType.None;
546575
result = checked( ( UInt16 )integral );
547576
return true;
548577
}
578+
case ReadValueResult.UInt64:
579+
{
580+
this.InternalCollectionType = CollectionType.None;
581+
result = checked( ( UInt16 )( UInt64 )integral );
582+
return true;
583+
}
549584
case ReadValueResult.Single:
550585
{
551586
this.InternalCollectionType = CollectionType.None;
@@ -608,12 +643,17 @@ internal bool ReadSubtreeNullableUInt16( out UInt16? result )
608643
case ReadValueResult.Int64:
609644
case ReadValueResult.Byte:
610645
case ReadValueResult.UInt32:
611-
case ReadValueResult.UInt64:
612646
{
613647
this.InternalCollectionType = CollectionType.None;
614648
result = checked( ( UInt16 )integral );
615649
return true;
616650
}
651+
case ReadValueResult.UInt64:
652+
{
653+
this.InternalCollectionType = CollectionType.None;
654+
result = checked( ( UInt16 )( UInt64 )integral );
655+
return true;
656+
}
617657
case ReadValueResult.Single:
618658
{
619659
this.InternalCollectionType = CollectionType.None;
@@ -670,12 +710,17 @@ internal bool ReadSubtreeInt32( out Int32 result )
670710
case ReadValueResult.Byte:
671711
case ReadValueResult.UInt16:
672712
case ReadValueResult.UInt32:
673-
case ReadValueResult.UInt64:
674713
{
675714
this.InternalCollectionType = CollectionType.None;
676715
result = checked( ( Int32 )integral );
677716
return true;
678717
}
718+
case ReadValueResult.UInt64:
719+
{
720+
this.InternalCollectionType = CollectionType.None;
721+
result = checked( ( Int32 )( UInt64 )integral );
722+
return true;
723+
}
679724
case ReadValueResult.Single:
680725
{
681726
this.InternalCollectionType = CollectionType.None;
@@ -738,12 +783,17 @@ internal bool ReadSubtreeNullableInt32( out Int32? result )
738783
case ReadValueResult.Byte:
739784
case ReadValueResult.UInt16:
740785
case ReadValueResult.UInt32:
741-
case ReadValueResult.UInt64:
742786
{
743787
this.InternalCollectionType = CollectionType.None;
744788
result = checked( ( Int32 )integral );
745789
return true;
746790
}
791+
case ReadValueResult.UInt64:
792+
{
793+
this.InternalCollectionType = CollectionType.None;
794+
result = checked( ( Int32 )( UInt64 )integral );
795+
return true;
796+
}
747797
case ReadValueResult.Single:
748798
{
749799
this.InternalCollectionType = CollectionType.None;
@@ -800,12 +850,17 @@ internal bool ReadSubtreeUInt32( out UInt32 result )
800850
case ReadValueResult.Int64:
801851
case ReadValueResult.Byte:
802852
case ReadValueResult.UInt16:
803-
case ReadValueResult.UInt64:
804853
{
805854
this.InternalCollectionType = CollectionType.None;
806855
result = checked( ( UInt32 )integral );
807856
return true;
808857
}
858+
case ReadValueResult.UInt64:
859+
{
860+
this.InternalCollectionType = CollectionType.None;
861+
result = checked( ( UInt32 )( UInt64 )integral );
862+
return true;
863+
}
809864
case ReadValueResult.Single:
810865
{
811866
this.InternalCollectionType = CollectionType.None;
@@ -868,12 +923,17 @@ internal bool ReadSubtreeNullableUInt32( out UInt32? result )
868923
case ReadValueResult.Int64:
869924
case ReadValueResult.Byte:
870925
case ReadValueResult.UInt16:
871-
case ReadValueResult.UInt64:
872926
{
873927
this.InternalCollectionType = CollectionType.None;
874928
result = checked( ( UInt32 )integral );
875929
return true;
876930
}
931+
case ReadValueResult.UInt64:
932+
{
933+
this.InternalCollectionType = CollectionType.None;
934+
result = checked( ( UInt32 )( UInt64 )integral );
935+
return true;
936+
}
877937
case ReadValueResult.Single:
878938
{
879939
this.InternalCollectionType = CollectionType.None;
@@ -930,12 +990,17 @@ internal bool ReadSubtreeInt64( out Int64 result )
930990
case ReadValueResult.Byte:
931991
case ReadValueResult.UInt16:
932992
case ReadValueResult.UInt32:
933-
case ReadValueResult.UInt64:
934993
{
935994
this.InternalCollectionType = CollectionType.None;
936995
result = integral;
937996
return true;
938997
}
998+
case ReadValueResult.UInt64:
999+
{
1000+
this.InternalCollectionType = CollectionType.None;
1001+
result = checked( ( Int64 )( UInt64 )integral );
1002+
return true;
1003+
}
9391004
case ReadValueResult.Single:
9401005
{
9411006
this.InternalCollectionType = CollectionType.None;
@@ -998,12 +1063,17 @@ internal bool ReadSubtreeNullableInt64( out Int64? result )
9981063
case ReadValueResult.Byte:
9991064
case ReadValueResult.UInt16:
10001065
case ReadValueResult.UInt32:
1001-
case ReadValueResult.UInt64:
10021066
{
10031067
this.InternalCollectionType = CollectionType.None;
10041068
result = integral;
10051069
return true;
10061070
}
1071+
case ReadValueResult.UInt64:
1072+
{
1073+
this.InternalCollectionType = CollectionType.None;
1074+
result = checked( ( Int64 )( UInt64 )integral );
1075+
return true;
1076+
}
10071077
case ReadValueResult.Single:
10081078
{
10091079
this.InternalCollectionType = CollectionType.None;
@@ -1191,12 +1261,17 @@ internal bool ReadSubtreeSingle( out Single result )
11911261
case ReadValueResult.Byte:
11921262
case ReadValueResult.UInt16:
11931263
case ReadValueResult.UInt32:
1194-
case ReadValueResult.UInt64:
11951264
{
11961265
this.InternalCollectionType = CollectionType.None;
11971266
result = integral;
11981267
return true;
11991268
}
1269+
case ReadValueResult.UInt64:
1270+
{
1271+
this.InternalCollectionType = CollectionType.None;
1272+
result = unchecked( ( UInt64 )integral );
1273+
return true;
1274+
}
12001275
case ReadValueResult.Double:
12011276
{
12021277
this.InternalCollectionType = CollectionType.None;
@@ -1254,12 +1329,17 @@ internal bool ReadSubtreeNullableSingle( out Single? result )
12541329
case ReadValueResult.Byte:
12551330
case ReadValueResult.UInt16:
12561331
case ReadValueResult.UInt32:
1257-
case ReadValueResult.UInt64:
12581332
{
12591333
this.InternalCollectionType = CollectionType.None;
12601334
result = integral;
12611335
return true;
12621336
}
1337+
case ReadValueResult.UInt64:
1338+
{
1339+
this.InternalCollectionType = CollectionType.None;
1340+
result = unchecked( ( UInt64 )integral );
1341+
return true;
1342+
}
12631343
case ReadValueResult.Double:
12641344
{
12651345
this.InternalCollectionType = CollectionType.None;
@@ -1311,12 +1391,17 @@ internal bool ReadSubtreeDouble( out Double result )
13111391
case ReadValueResult.Byte:
13121392
case ReadValueResult.UInt16:
13131393
case ReadValueResult.UInt32:
1314-
case ReadValueResult.UInt64:
13151394
{
13161395
this.InternalCollectionType = CollectionType.None;
13171396
result = integral;
13181397
return true;
13191398
}
1399+
case ReadValueResult.UInt64:
1400+
{
1401+
this.InternalCollectionType = CollectionType.None;
1402+
result = unchecked( ( UInt64 )integral );
1403+
return true;
1404+
}
13201405
case ReadValueResult.Single:
13211406
{
13221407
this.InternalCollectionType = CollectionType.None;
@@ -1374,12 +1459,17 @@ internal bool ReadSubtreeNullableDouble( out Double? result )
13741459
case ReadValueResult.Byte:
13751460
case ReadValueResult.UInt16:
13761461
case ReadValueResult.UInt32:
1377-
case ReadValueResult.UInt64:
13781462
{
13791463
this.InternalCollectionType = CollectionType.None;
13801464
result = integral;
13811465
return true;
13821466
}
1467+
case ReadValueResult.UInt64:
1468+
{
1469+
this.InternalCollectionType = CollectionType.None;
1470+
result = unchecked( ( UInt64 )integral );
1471+
return true;
1472+
}
13831473
case ReadValueResult.Single:
13841474
{
13851475
this.InternalCollectionType = CollectionType.None;

0 commit comments

Comments
 (0)