Akihiro Sagawa : strmbase: Add validation checks when updating source rectangle.

Alexandre Julliard julliard at winehq.org
Mon Nov 28 15:52:47 CST 2016


Module: wine
Branch: master
Commit: 547f4bc2cf3263c880c99498d4a1ebde7daaf6a1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=547f4bc2cf3263c880c99498d4a1ebde7daaf6a1

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Fri Nov 25 01:10:05 2016 +0900

strmbase: Add validation checks when updating source rectangle.

Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/tests/filtergraph.c | 24 ++++++------
 dlls/strmbase/video.c           | 85 +++++++++++++++++++++++++++++++----------
 2 files changed, 76 insertions(+), 33 deletions(-)

diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index 93fb2a0..1b72008 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -85,33 +85,33 @@ static void test_basic_video(void)
     ok(height == video_height, "expected %d, got %d\n", video_height, height);
 
     hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, 0, 0);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, video_width*2, video_height*2);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_put_SourceTop(pbv, -1);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_put_SourceTop returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_put_SourceTop returned: %x\n", hr);
     hr = IBasicVideo_put_SourceTop(pbv, 0);
     ok(hr==S_OK, "Cannot put source top returned: %x\n", hr);
     hr = IBasicVideo_put_SourceTop(pbv, 1);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_put_SourceTop returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_put_SourceTop returned: %x\n", hr);
 
     hr = IBasicVideo_SetSourcePosition(pbv, video_width, 0, video_width, video_height);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_SetSourcePosition(pbv, 0, video_height, video_width, video_height);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_SetSourcePosition(pbv, -1, 0, video_width, video_height);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_SetSourcePosition(pbv, 0, -1, video_width, video_height);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_SetSourcePosition(pbv, video_width/2, video_height/2, video_width, video_height);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_SetSourcePosition(pbv, video_width/2, video_height/2, video_width, video_height);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
 
     hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, video_width, video_height+1);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
     hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, video_width+1, video_height);
-    todo_wine ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
+    ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr);
 
     hr = IBasicVideo_SetSourcePosition(pbv, video_width/2, video_height/2, video_width/3+1, video_height/3+1);
     ok(hr==S_OK, "Cannot set source position returned: %x\n", hr);
diff --git a/dlls/strmbase/video.c b/dlls/strmbase/video.c
index ce7d26e..3f4d207 100644
--- a/dlls/strmbase/video.c
+++ b/dlls/strmbase/video.c
@@ -53,6 +53,25 @@ HRESULT WINAPI BaseControlVideo_Destroy(BaseControlVideo *pControlVideo)
     return BaseDispatch_Destroy(&pControlVideo->baseDispatch);
 }
 
+static HRESULT BaseControlVideoImpl_CheckSourceRect(BaseControlVideo *This, RECT *pSourceRect)
+{
+    LONG VideoWidth, VideoHeight;
+    HRESULT hr;
+
+    if (IsRectEmpty(pSourceRect))
+        return E_INVALIDARG;
+
+    hr = BaseControlVideoImpl_GetVideoSize((IBasicVideo *)This, &VideoWidth, &VideoHeight);
+    if (FAILED(hr))
+        return hr;
+
+    if (pSourceRect->top < 0 || pSourceRect->left < 0 ||
+        pSourceRect->bottom > VideoHeight || pSourceRect->right > VideoWidth)
+        return E_INVALIDARG;
+
+    return S_OK;
+}
+
 HRESULT WINAPI BaseControlVideoImpl_GetTypeInfoCount(IBasicVideo *iface, UINT *pctinfo)
 {
     BaseControlVideo *This = impl_from_IBasicVideo(iface);
@@ -175,14 +194,20 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceLeft(IBasicVideo *iface, LONG Sour
 {
     RECT SourceRect;
     BaseControlVideo *This = impl_from_IBasicVideo(iface);
+    HRESULT hr;
 
     TRACE("(%p/%p)->(%d)\n", This, iface, SourceLeft);
-    This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
-    SourceRect.right = (SourceRect.right - SourceRect.left) + SourceLeft;
-    SourceRect.left = SourceLeft;
-    This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
+    hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
+    if (SUCCEEDED(hr))
+    {
+        SourceRect.right = (SourceRect.right - SourceRect.left) + SourceLeft;
+        SourceRect.left = SourceLeft;
+        hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect);
+    }
+    if (SUCCEEDED(hr))
+        hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
 
-    return S_OK;
+    return hr;
 }
 
 HRESULT WINAPI BaseControlVideoImpl_get_SourceLeft(IBasicVideo *iface, LONG *pSourceLeft)
@@ -203,13 +228,19 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceWidth(IBasicVideo *iface, LONG Sou
 {
     RECT SourceRect;
     BaseControlVideo *This = impl_from_IBasicVideo(iface);
+    HRESULT hr;
 
     TRACE("(%p/%p)->(%d)\n", This, iface, SourceWidth);
-    This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
-    SourceRect.right = SourceRect.left + SourceWidth;
-    This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
+    hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
+    if (SUCCEEDED(hr))
+    {
+        SourceRect.right = SourceRect.left + SourceWidth;
+        hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect);
+    }
+    if (SUCCEEDED(hr))
+        hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
 
-    return S_OK;
+    return hr;
 }
 
 HRESULT WINAPI BaseControlVideoImpl_get_SourceWidth(IBasicVideo *iface, LONG *pSourceWidth)
@@ -230,14 +261,20 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceTop(IBasicVideo *iface, LONG Sourc
 {
     RECT SourceRect;
     BaseControlVideo *This = impl_from_IBasicVideo(iface);
+    HRESULT hr;
 
     TRACE("(%p/%p)->(%d)\n", This, iface, SourceTop);
-    This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
-    SourceRect.bottom = (SourceRect.bottom - SourceRect.top) + SourceTop;
-    SourceRect.top = SourceTop;
-    This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
+    hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
+    if (SUCCEEDED(hr))
+    {
+        SourceRect.bottom = (SourceRect.bottom - SourceRect.top) + SourceTop;
+        SourceRect.top = SourceTop;
+        hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect);
+    }
+    if (SUCCEEDED(hr))
+        hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
 
-    return S_OK;
+    return hr;
 }
 
 HRESULT WINAPI BaseControlVideoImpl_get_SourceTop(IBasicVideo *iface, LONG *pSourceTop)
@@ -258,13 +295,19 @@ HRESULT WINAPI BaseControlVideoImpl_put_SourceHeight(IBasicVideo *iface, LONG So
 {
     RECT SourceRect;
     BaseControlVideo *This = impl_from_IBasicVideo(iface);
+    HRESULT hr;
 
     TRACE("(%p/%p)->(%d)\n", This, iface, SourceHeight);
-    This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
-    SourceRect.bottom = SourceRect.top + SourceHeight;
-    This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
+    hr = This->pFuncsTable->pfnGetSourceRect(This, &SourceRect);
+    if (SUCCEEDED(hr))
+    {
+        SourceRect.bottom = SourceRect.top + SourceHeight;
+        hr = BaseControlVideoImpl_CheckSourceRect(This, &SourceRect);
+    }
+    if (SUCCEEDED(hr))
+        hr = This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
 
-    return S_OK;
+    return hr;
 }
 
 HRESULT WINAPI BaseControlVideoImpl_get_SourceHeight(IBasicVideo *iface, LONG *pSourceHeight)
@@ -400,9 +443,9 @@ HRESULT WINAPI BaseControlVideoImpl_SetSourcePosition(IBasicVideo *iface, LONG L
     TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
 
     SetRect(&SourceRect, Left, Top, Left + Width, Top + Height);
-    This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
-
-    return S_OK;
+    if (FAILED(BaseControlVideoImpl_CheckSourceRect(This, &SourceRect)))
+        return E_INVALIDARG;
+    return This->pFuncsTable->pfnSetSourceRect(This, &SourceRect);
 }
 
 HRESULT WINAPI BaseControlVideoImpl_GetSourcePosition(IBasicVideo *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight)




More information about the wine-cvs mailing list