In PRINTDLG_UpdatePrintDlgA() in dlls/commdlg/printdlg.c we do:
... LPPRINTER_INFO_2A pi = PrintStructures->lpPrinterInfo; ... pi->pPortName = "FILE:";
And in PRINTDLG_UpdatePrintDlgW() we do:
... LPPRINTER_INFO_2W pi = PrintStructures->lpPrinterInfo; ... static WCHAR file[] = {'F','I','L','E',':',0}; pi->pPortName = file; ...
Now in gcc all string literals are read-only, even if you declare them as char* foo="bar", *foo='\0' will cause a segfault.
So in the Ansi version we point pPortName to a read-only string. But if the application gets hold of that pointer we have no garantee that it won't expect to be able to modify that string: pPortName is an LPSTR. (this is a case where -Wwrite-strings will complain)
And in the Unicode case we point pPortName to a static writable buffer. But in this case if the application writes in our buffer its contents is going to be messed up forever.
However I don't know this code at all. So I'm asking, shoudln't we make a copy of these strings? Which also raises the ugly issue of later freeing the corresponding memory buffer...