From 0ec13316a77a3de780b07097a0ffb0a7473d05f5 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 15 Jun 2015 16:30:23 +0300 Subject: [PATCH] dwrite: Validate format property values. --- dlls/dwrite/layout.c | 20 ++++++++++++++++++++ dlls/dwrite/tests/layout.c | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 4b91f6e09ee..72f08852cb4 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -3615,7 +3615,12 @@ static ULONG WINAPI dwritetextformat_Release(IDWriteTextFormat1 *iface) static HRESULT WINAPI dwritetextformat_SetTextAlignment(IDWriteTextFormat1 *iface, DWRITE_TEXT_ALIGNMENT alignment) { struct dwrite_textformat *This = impl_from_IDWriteTextFormat1(iface); + TRACE("(%p)->(%d)\n", This, alignment); + + if ((UINT32)alignment > DWRITE_TEXT_ALIGNMENT_JUSTIFIED) + return E_INVALIDARG; + This->format.textalignment = alignment; return S_OK; } @@ -3623,7 +3628,12 @@ static HRESULT WINAPI dwritetextformat_SetTextAlignment(IDWriteTextFormat1 *ifac static HRESULT WINAPI dwritetextformat_SetParagraphAlignment(IDWriteTextFormat1 *iface, DWRITE_PARAGRAPH_ALIGNMENT alignment) { struct dwrite_textformat *This = impl_from_IDWriteTextFormat1(iface); + TRACE("(%p)->(%d)\n", This, alignment); + + if ((UINT32)alignment > DWRITE_PARAGRAPH_ALIGNMENT_CENTER) + return E_INVALIDARG; + This->format.paralign = alignment; return S_OK; } @@ -3631,7 +3641,12 @@ static HRESULT WINAPI dwritetextformat_SetParagraphAlignment(IDWriteTextFormat1 static HRESULT WINAPI dwritetextformat_SetWordWrapping(IDWriteTextFormat1 *iface, DWRITE_WORD_WRAPPING wrapping) { struct dwrite_textformat *This = impl_from_IDWriteTextFormat1(iface); + TRACE("(%p)->(%d)\n", This, wrapping); + + if ((UINT32)wrapping > DWRITE_WORD_WRAPPING_CHARACTER) + return E_INVALIDARG; + This->format.wrapping = wrapping; return S_OK; } @@ -3688,7 +3703,12 @@ static HRESULT WINAPI dwritetextformat_SetLineSpacing(IDWriteTextFormat1 *iface, FLOAT spacing, FLOAT baseline) { struct dwrite_textformat *This = impl_from_IDWriteTextFormat1(iface); + TRACE("(%p)->(%d %f %f)\n", This, method, spacing, baseline); + + if (spacing < 0.0 || (UINT32)method > DWRITE_LINE_SPACING_METHOD_UNIFORM) + return E_INVALIDARG; + This->format.spacingmethod = method; This->format.spacing = spacing; This->format.baseline = baseline; diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 86f4f636630..ee7cfcbef2e 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -849,12 +849,21 @@ if (0) /* crashes on native */ hr = IDWriteTextFormat_SetTextAlignment(format, DWRITE_TEXT_ALIGNMENT_LEADING); ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetTextAlignment(format, DWRITE_TEXT_ALIGNMENT_JUSTIFIED+1); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetParagraphAlignment(format, DWRITE_PARAGRAPH_ALIGNMENT_NEAR); ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetParagraphAlignment(format, DWRITE_PARAGRAPH_ALIGNMENT_CENTER+1); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetWordWrapping(format, DWRITE_WORD_WRAPPING_WRAP); ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetWordWrapping(format, DWRITE_WORD_WRAPPING_CHARACTER+1); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetReadingDirection(format, DWRITE_READING_DIRECTION_LEFT_TO_RIGHT); ok(hr == S_OK, "got 0x%08x\n", hr); @@ -864,6 +873,15 @@ if (0) /* crashes on native */ hr = IDWriteTextFormat_SetLineSpacing(format, DWRITE_LINE_SPACING_METHOD_DEFAULT, 0.0, 0.0); ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetLineSpacing(format, DWRITE_LINE_SPACING_METHOD_DEFAULT, 0.0, -10.0); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteTextFormat_SetLineSpacing(format, DWRITE_LINE_SPACING_METHOD_DEFAULT, -10.0, 0.0); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IDWriteTextFormat_SetLineSpacing(format, DWRITE_LINE_SPACING_METHOD_UNIFORM+1, 0.0, 0.0); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + hr = IDWriteTextFormat_SetTrimming(format, &trimming, NULL); ok(hr == S_OK, "got 0x%08x\n", hr);