https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e3622ebe4e8ae9e8ca4b2…
commit e3622ebe4e8ae9e8ca4b2ad8c3aef8f52730ca3e
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Thu Dec 16 10:47:57 2021 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Thu Dec 16 10:47:57 2021 +0900
[NTGDI] Strictly check pen style (#4164)
- Check the pen style and elegantly fail if the style was wrong.
CORE-13819
---
win32ss/gdi/ntgdi/pen.c | 57 +++++++++++++++++++++++++++++++++++++++----------
1 file changed, 46 insertions(+), 11 deletions(-)
diff --git a/win32ss/gdi/ntgdi/pen.c b/win32ss/gdi/ntgdi/pen.c
index 76b6cd2a2f8..d3edbddc494 100644
--- a/win32ss/gdi/ntgdi/pen.c
+++ b/win32ss/gdi/ntgdi/pen.c
@@ -115,11 +115,54 @@ IntGdiExtCreatePen(
DPRINT("Can't allocate pen\n");
return 0;
}
+
hPen = pbrushPen->BaseObject.hHmgr;
- // If nWidth is zero, the pen is a single pixel wide, regardless of the current
transformation.
- if ((bOldStylePen) && (!dwWidth) && ((dwPenStyle & PS_STYLE_MASK)
!= PS_SOLID))
- dwWidth = 1;
+ if (bOldStylePen)
+ {
+ // If nWidth is zero, the pen is a single pixel wide, regardless of the current
transformation.
+ if (!dwWidth && (dwPenStyle & PS_STYLE_MASK) != PS_SOLID)
+ dwWidth = 1;
+ }
+ else
+ {
+ switch (dwPenStyle & PS_ENDCAP_MASK)
+ {
+ case PS_ENDCAP_ROUND:
+ case PS_ENDCAP_SQUARE:
+ case PS_ENDCAP_FLAT:
+ break;
+
+ default:
+ goto ExitCleanup;
+ }
+
+ switch (dwPenStyle & PS_JOIN_MASK)
+ {
+ case PS_JOIN_ROUND:
+ case PS_JOIN_BEVEL:
+ case PS_JOIN_MITER:
+ break;
+
+ default:
+ goto ExitCleanup;
+ }
+
+ switch (dwPenStyle & PS_TYPE_MASK)
+ {
+ case PS_COSMETIC:
+ if (dwWidth != 1 || ulBrushStyle != BS_SOLID)
+ goto ExitCleanup;
+
+ break;
+
+ case PS_GEOMETRIC:
+ break;
+
+ default:
+ goto ExitCleanup;
+ }
+ }
pbrushPen->lWidth = dwWidth;
FLOATOBJ_SetLong(&pbrushPen->eWidth, pbrushPen->lWidth);
@@ -131,16 +174,8 @@ IntGdiExtCreatePen(
pbrushPen->dwStyleCount = 0;
pbrushPen->pStyle = NULL;
pbrushPen->ulStyleSize = 0;
-
pbrushPen->flAttrs = bOldStylePen ? BR_IS_OLDSTYLEPEN : BR_IS_PEN;
- // If dwPenStyle is PS_COSMETIC, the width must be set to 1.
- if ( !(bOldStylePen) && ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC)
&& ( dwWidth != 1) )
- goto ExitCleanup;
- // If dwPenStyle is PS_COSMETIC, the brush style must be BS_SOLID.
- if ( !(bOldStylePen) && ((dwPenStyle & PS_TYPE_MASK) == PS_COSMETIC)
&& (ulBrushStyle != BS_SOLID) )
- goto ExitCleanup;
-
switch (dwPenStyle & PS_STYLE_MASK)
{
case PS_NULL: