wpf: {StaticResource} references are broken for XPS Paths after December2022 security patch

  • Windows version: (22H2 19045.2364)
  • Does the bug reproduce also in WPF for .NET Framework 4.8?: Yes

Problem description:

{StaticResource} references on Path elements are not loaded in FixedPage after recent security patch.

Actual behavior:

FixedPage fails to load Path elements that have static resource references. Path data is set to null so those elements are not rendered with RenderTargetBitmap for example.

Expected behavior:

Path references are loaded.

Minimal repro:

  • Make sure December 13, 2022, security updates for .NET Framework is installed
  • Load attached xps file: p1.zip
var filePath = "<path>";
var doc = new XpsDocument(filePath, FileAccess.Read);
var seq = doc.GetFixedDocumentSequence();

foreach (var docRef in seq.References)
{
	var fixedDoc = docRef.GetDocument(false);
	foreach (var page in fixedDoc.Pages)
	{
		var fixedPage = page.GetPageRoot(false);
		foreach (var element in fixedPage.Children)
		{
			Debug.Assert(((System.Windows.Shapes.Path)element).Data != null);
		}
	}
}

You can probably reproduce this by printing most PDF files with some text to Microsoft XPS Document Writer and then trying to present it in a WPF app (that is not Windows XPS Viewer).

Workaround:

Alternate Workaround from kb5022083 (allowing all XPS types) works. I haven’t figured out which type needs to be specifically allowed for this particular case. The script they have in the first part to allow certain types explicitly doesn’t work.

https://support.microsoft.com/en-au/topic/kb5022083-change-in-how-wpf-based-applications-render-xps-documents-a4ae4fa4-bc58-4c37-acdd-5eebc4e34556

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Reactions: 4
  • Comments: 22 (15 by maintainers)

Most upvoted comments

We’ve released an OOB package that should address the XPS compatibility issues. You may refer to this link for more information on installing the fix.

There is an unexpected delay in this release. Will keep the thread posted for the updates.

@gejosdev - We are working to release the fix along with the next security update. We will keep this thread posted.

An incredibly faulty “security fix”, dumped on all customers, crippling hard work and reputation of developers and companies worldwide, empty promises, no communication - just a too complex manual bugfix that could and should have been rolled out automatically since January. Half a year! This is no environment for serious software development.

This issue leaves us with lots of customers not just “unhappy” but unable to invoice their work! This is a really money burning problem!!

Update - The security patch is now available for .NET Framework as well as .NET Core .

This should restore the StaticResource behavior.

2 more months have passed without release. Do you even realize how URGENT this issue is, how much damage was already done to customers not able to invoice, our customer relationship, our turnaround, our time spent? Why is this not rolled out? Does Microsoft want us to move on to other platforms/IDEs?

There is also a second issue with that one: When you merge XPS files with the following method, the final XpsDocument lacks resources. I did extract the .XPS file and investigated the *.fpage files and encountered, that the ResourceDictionary is missing for the FixedPage after using the method below.

        public void MergeXpsDocument(string newFile, List<XpsDocument> sourceDocuments)
        {
            XpsDocument xpsDocument = new XpsDocument(newFile, System.IO.FileAccess.ReadWrite);
            XpsDocumentWriter xpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
            FixedDocumentSequence fixedDocumentSequence = new FixedDocumentSequence();

            foreach (XpsDocument doc in sourceDocuments)
            {
                FixedDocumentSequence sourceSequence = doc.GetFixedDocumentSequence();
                foreach (DocumentReference dr in sourceSequence.References)
                {
                    DocumentReference newDocumentReference = new DocumentReference();
                    newDocumentReference.Source = dr.Source;
                    (newDocumentReference as IUriContext).BaseUri = (dr as IUriContext).BaseUri;
                    FixedDocument fd = newDocumentReference.GetDocument(true);
                    newDocumentReference.SetDocument(fd);
                    fixedDocumentSequence.References.Add(newDocumentReference);
                }
            }
            xpsDocumentWriter.Write(fixedDocumentSequence);
            xpsDocument.Close();
        }