Skip to content

Commit

Permalink
Move version check earlier (#6674)
Browse files Browse the repository at this point in the history
Fixes #6659

The version check was previously after having deserialized everything else. This doesn't make sense and can lead to errors. In this PR, I moved it up.
  • Loading branch information
Forgind committed Jul 26, 2021
1 parent 9e57628 commit ef21d41
Showing 1 changed file with 11 additions and 12 deletions.
23 changes: 11 additions & 12 deletions src/Tasks/StateFileBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,17 @@ internal static StateFileBase DeserializeCache(string stateFile, TaskLoggingHelp
using (FileStream s = File.OpenRead(stateFile))
{
using var translator = BinaryTranslator.GetReadTranslator(s, buffer: null);

byte version = 0;
translator.Translate(ref version);
// If the version is wrong, log a message not a warning. This could be a valid cache with the wrong version preventing correct deserialization.
// For the latter case, internals may be unexpectedly null.
if (version != CurrentSerializationVersion)
{
log.LogMessageFromResources("General.CouldNotReadStateFileMessage", stateFile, log.FormatResourceString("General.IncompatibleStateFileType"));
return null;
}

var constructors = requiredReturnType.GetConstructors();
foreach (var constructor in constructors)
{
Expand All @@ -88,18 +97,8 @@ internal static StateFileBase DeserializeCache(string stateFile, TaskLoggingHelp
retVal = constructor.Invoke(new object[] { translator }) as StateFileBase;
}
}

// If retVal is still null or the version is wrong, log a message not a warning. This could be a valid cache with the wrong version preventing correct deserialization.
// For the latter case, internals may be unexpectedly null.
if (retVal == null || version != CurrentSerializationVersion)
{
// When upgrading to Visual Studio 2008 and running the build for the first time the resource cache files are replaced which causes a cast error due
// to a new version number on the tasks class. "Unable to cast object of type 'Microsoft.Build.Tasks.SystemState' to type 'Microsoft.Build.Tasks.StateFileBase".
// If there is an invalid cast, a message rather than a warning should be emitted.
log.LogMessageFromResources("General.CouldNotReadStateFileMessage", stateFile, log.FormatResourceString("General.IncompatibleStateFileType"));
return null;
}
else if (!requiredReturnType.IsInstanceOfType(retVal))

if (retVal == null || !requiredReturnType.IsInstanceOfType(retVal))
{
log.LogMessageFromResources("General.CouldNotReadStateFileMessage", stateFile,
log.FormatResourceString("General.IncompatibleStateFileType"));
Expand Down

0 comments on commit ef21d41

Please sign in to comment.