@@ -403,6 +403,10 @@ public static bool TryValidate(ref ModelHeader header, long size, out Exception
403
403
Contracts . CheckDecode ( header . CbStringTable == 0 ) ;
404
404
Contracts . CheckDecode ( header . FpStringChars == 0 ) ;
405
405
Contracts . CheckDecode ( header . CbStringChars == 0 ) ;
406
+ if ( header . VerWritten < VerAssemblyNameSupported || header . FpAssemblyName == 0 )
407
+ {
408
+ Contracts . CheckDecode ( header . FpTail == header . FpModel + header . CbModel ) ;
409
+ }
406
410
}
407
411
else
408
412
{
@@ -414,28 +418,33 @@ public static bool TryValidate(ref ModelHeader header, long size, out Exception
414
418
Contracts . CheckDecode ( header . FpStringChars == header . FpStringTable + header . CbStringTable ) ;
415
419
Contracts . CheckDecode ( header . CbStringChars % sizeof ( char ) == 0 ) ;
416
420
Contracts . CheckDecode ( header . FpStringChars + header . CbStringChars >= header . FpStringChars ) ;
417
- Contracts . CheckDecode ( header . FpTail == header . FpStringChars + header . CbStringChars ) ;
421
+ if ( header . VerWritten < VerAssemblyNameSupported || header . FpAssemblyName == 0 )
422
+ {
423
+ Contracts . CheckDecode ( header . FpTail == header . FpStringChars + header . CbStringChars ) ;
424
+ }
418
425
}
419
426
420
- if ( header . FpAssemblyName == 0 )
427
+ if ( header . VerWritten >= VerAssemblyNameSupported )
421
428
{
422
- Contracts . CheckDecode ( header . CbAssemblyName == 0 ) ;
423
-
424
- if ( header . FpStringTable == 0 )
429
+ if ( header . FpAssemblyName == 0 )
425
430
{
426
- Contracts . CheckDecode ( header . FpTail == header . FpModel + header . CbModel ) ;
431
+ Contracts . CheckDecode ( header . CbAssemblyName == 0 ) ;
427
432
}
428
433
else
429
434
{
430
- Contracts . CheckDecode ( header . FpTail == header . FpStringChars + header . CbStringChars ) ;
435
+ // the assembly name always immediately after the string table, if there is one
436
+ if ( header . FpStringTable == 0 )
437
+ {
438
+ Contracts . CheckDecode ( header . FpAssemblyName == header . FpModel + header . CbModel ) ;
439
+ }
440
+ else
441
+ {
442
+ Contracts . CheckDecode ( header . FpAssemblyName == header . FpStringChars + header . CbStringChars ) ;
443
+ }
444
+ Contracts . CheckDecode ( header . CbAssemblyName % sizeof ( char ) == 0 ) ;
445
+ Contracts . CheckDecode ( header . FpTail == header . FpAssemblyName + header . CbAssemblyName ) ;
431
446
}
432
447
}
433
- else
434
- {
435
- Contracts . CheckDecode ( header . FpAssemblyName == header . FpStringChars + header . CbStringChars ) ;
436
- Contracts . CheckDecode ( header . CbAssemblyName % sizeof ( char ) == 0 ) ;
437
- Contracts . CheckDecode ( header . FpTail == header . FpAssemblyName + header . CbAssemblyName ) ;
438
- }
439
448
440
449
Contracts . CheckDecode ( header . FpLim == header . FpTail + sizeof ( ulong ) ) ;
441
450
Contracts . CheckDecode ( size == 0 || size >= header . FpLim ) ;
@@ -507,10 +516,6 @@ public static bool TryValidate(ref ModelHeader header, BinaryReader reader, long
507
516
}
508
517
Contracts . CheckDecode ( offset == header . CbStringChars ) ;
509
518
Contracts . CheckDecode ( header . FpStringChars + header . CbStringChars == reader . FpCur ( ) - fpMin ) ;
510
- Contracts . CheckDecode ( header . FpTail == reader . FpCur ( ) - fpMin ) ;
511
-
512
- ulong tail = reader . ReadUInt64 ( ) ;
513
- Contracts . CheckDecode ( tail == TailSignatureValue , "Corrupt model file tail" ) ;
514
519
}
515
520
516
521
if ( header . VerWritten >= VerAssemblyNameSupported && header . FpAssemblyName != 0 )
@@ -530,6 +535,11 @@ public static bool TryValidate(ref ModelHeader header, BinaryReader reader, long
530
535
loaderAssemblyName = null ;
531
536
}
532
537
538
+ Contracts . CheckDecode ( header . FpTail == reader . FpCur ( ) - fpMin ) ;
539
+
540
+ ulong tail = reader . ReadUInt64 ( ) ;
541
+ Contracts . CheckDecode ( tail == TailSignatureValue , "Corrupt model file tail" ) ;
542
+
533
543
ex = null ;
534
544
535
545
reader . Seek ( fpOrig ) ;
@@ -605,16 +615,16 @@ public readonly struct VersionInfo
605
615
public readonly uint VerWrittenCur ;
606
616
public readonly uint VerReadableCur ;
607
617
public readonly uint VerWeCanReadBack ;
618
+ public readonly string LoaderAssemblyName ;
608
619
public readonly string LoaderSignature ;
609
620
public readonly string LoaderSignatureAlt ;
610
- public readonly string LoaderAssemblyName ;
611
621
612
622
/// <summary>
613
623
/// Construct version info with a string value for modelSignature. The string must be 8 characters
614
624
/// all less than 0x100. Spaces are mapped to zero. This assumes little-endian.
615
625
/// </summary>
616
626
public VersionInfo ( string modelSignature , uint verWrittenCur , uint verReadableCur , uint verWeCanReadBack ,
617
- string loaderSignature = null , string loaderSignatureAlt = null , string loaderAssemblyName = null )
627
+ string loaderAssemblyName , string loaderSignature = null , string loaderSignatureAlt = null )
618
628
{
619
629
Contracts . Check ( Utils . Size ( modelSignature ) == 8 , "Model signature must be eight characters" ) ;
620
630
ModelSignature = 0 ;
@@ -630,9 +640,9 @@ public VersionInfo(string modelSignature, uint verWrittenCur, uint verReadableCu
630
640
VerWrittenCur = verWrittenCur ;
631
641
VerReadableCur = verReadableCur ;
632
642
VerWeCanReadBack = verWeCanReadBack ;
643
+ LoaderAssemblyName = loaderAssemblyName ;
633
644
LoaderSignature = loaderSignature ;
634
645
LoaderSignatureAlt = loaderSignatureAlt ;
635
- LoaderAssemblyName = loaderAssemblyName ;
636
646
}
637
647
}
638
648
}
0 commit comments