提交 710aa0e2 编写于 作者: A AlekseyTs

Don't crash when a win32 resource file is too short.

Fixes https://devdiv.visualstudio.com/DevDiv/_workitems?id=217718.
上级 5003f8e4
......@@ -6728,7 +6728,7 @@ public static int Main()
}
[Fact(), WorkItem(546025, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546025")]
public void TestWin32ResWithBadResFile_CS1583ERR_BadWin32Res()
public void TestWin32ResWithBadResFile_CS1583ERR_BadWin32Res_01()
{
string source = Temp.CreateFile(prefix: "", extension: ".cs").WriteAllText(@"class Test { static void Main() {} }").Path;
string badres = Temp.CreateFile().WriteAllBytes(TestResources.DiagnosticTests.badresfile).Path;
......@@ -6752,6 +6752,31 @@ public void TestWin32ResWithBadResFile_CS1583ERR_BadWin32Res()
CleanupAllGeneratedFiles(badres);
}
[Fact(), WorkItem(217718, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=217718")]
public void TestWin32ResWithBadResFile_CS1583ERR_BadWin32Res_02()
{
string source = Temp.CreateFile(prefix: "", extension: ".cs").WriteAllText(@"class Test { static void Main() {} }").Path;
string badres = Temp.CreateFile().WriteAllBytes(new byte [] { 0, 0}).Path;
var baseDir = Path.GetDirectoryName(source);
var fileName = Path.GetFileName(source);
var outWriter = new StringWriter(CultureInfo.InvariantCulture);
int exitCode = new MockCSharpCompiler(null, baseDir, new[]
{
"/nologo",
"/preferreduilang:en",
"/win32res:" + badres,
source
}).Run(outWriter);
Assert.Equal(1, exitCode);
Assert.Equal("error CS1583: Error reading Win32 resources -- Unrecognized resource file format.", outWriter.ToString().Trim());
CleanupAllGeneratedFiles(source);
CleanupAllGeneratedFiles(badres);
}
[Fact, WorkItem(546114, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546114")]
public void TestFilterCommandLineDiagnostics()
{
......
......@@ -1284,8 +1284,25 @@ internal void SetupWin32Resources(CommonPEModuleBuilder moduleBeingBuilt, Stream
if (win32Resources == null)
return;
switch (DetectWin32ResourceForm(win32Resources))
Win32ResourceForm resourceForm;
try
{
resourceForm = DetectWin32ResourceForm(win32Resources);
}
catch (EndOfStreamException)
{
diagnostics.Add(MessageProvider.CreateDiagnostic(MessageProvider.ERR_BadWin32Resource, NoLocation.Singleton, CodeAnalysisResources.UnrecognizedResourceFileFormat));
return;
}
catch (Exception ex)
{
diagnostics.Add(MessageProvider.CreateDiagnostic(MessageProvider.ERR_BadWin32Resource, NoLocation.Singleton, ex.Message));
return;
}
switch (resourceForm)
{
case Win32ResourceForm.COFF:
moduleBeingBuilt.Win32ResourceSection = MakeWin32ResourcesFromCOFF(win32Resources, diagnostics);
break;
......
......@@ -560,6 +560,35 @@ a.vb
CleanupAllGeneratedFiles(tmpFileName)
End Sub
<WorkItem(217718, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=217718")>
<Fact>
Public Sub BadWin32Resource()
Dim source = Temp.CreateFile(prefix:="", extension:=".vb").WriteAllText("
Module Test
Sub Main()
End Sub
End Module").Path
Dim badres = Temp.CreateFile().WriteAllBytes(New Byte() {0, 0}).Path
Dim baseDir = Path.GetDirectoryName(source)
Dim fileName = Path.GetFileName(source)
Dim outWriter = New StringWriter(CultureInfo.InvariantCulture)
Dim exitCode = New MockVisualBasicCompiler(Nothing, baseDir,
{
"/nologo",
"/preferreduilang:en",
"/win32resource:" + badres,
source
}).Run(outWriter)
Assert.Equal(1, exitCode)
Assert.Equal("vbc : error BC30136: Error creating Win32 resources: Unrecognized resource file format.", outWriter.ToString().Trim())
CleanupAllGeneratedFiles(source)
CleanupAllGeneratedFiles(badres)
End Sub
<Fact>
Public Sub Win32ResourceOptions_Valid()
CheckWin32ResourceOptions({"/win32resource:a"}, "a", Nothing, Nothing, False)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册