From ee706d3d687e63d3f9bef635e2ef904b7005d1fc Mon Sep 17 00:00:00 2001 From: Alexandre Goujon Date: Sat, 4 Sep 2010 17:26:52 +0200 Subject: [PATCH] avifil32: Fix EditStreamSetInfo wine checks. --- dlls/avifil32/api.c | 7 +-- dlls/avifil32/editstream.c | 16 ++---- dlls/avifil32/tests/api.c | 102 ++++++++++++++++++++++++++++++++++++- 3 files changed, 108 insertions(+), 17 deletions(-) diff --git a/dlls/avifil32/api.c b/dlls/avifil32/api.c index 8ef75d3e4b1..11eb4dd5434 100644 --- a/dlls/avifil32/api.c +++ b/dlls/avifil32/api.c @@ -2150,9 +2150,7 @@ HRESULT WINAPI EditStreamSetInfoA(PAVISTREAM pstream, LPAVISTREAMINFOA asi, TRACE("(%p,%p,%d)\n", pstream, asi, size); - if (pstream == NULL) - return AVIERR_BADHANDLE; - if ((DWORD)size < sizeof(AVISTREAMINFOA)) + if (size >= 0 && size < sizeof(AVISTREAMINFOA)) return AVIERR_BADSIZE; memcpy(&asiw, asi, sizeof(asiw) - sizeof(asiw.szName)); @@ -2173,6 +2171,9 @@ HRESULT WINAPI EditStreamSetInfoW(PAVISTREAM pstream, LPAVISTREAMINFOW asi, TRACE("(%p,%p,%d)\n", pstream, asi, size); + if (size >= 0 && size < sizeof(AVISTREAMINFOA)) + return AVIERR_BADSIZE; + hr = IAVIStream_QueryInterface(pstream, &IID_IAVIEditStream,(LPVOID*)&pEdit); if (SUCCEEDED(hr) && pEdit != NULL) { hr = IAVIEditStream_SetInfo(pEdit, asi, size); diff --git a/dlls/avifil32/editstream.c b/dlls/avifil32/editstream.c index f19f3ac5239..10b6b3079fa 100644 --- a/dlls/avifil32/editstream.c +++ b/dlls/avifil32/editstream.c @@ -775,23 +775,15 @@ static HRESULT WINAPI IAVIEditStream_fnSetInfo(IAVIEditStream*iface, TRACE("(%p,%p,%d)\n",iface,asi,size); /* check parameters */ - if (asi == NULL) - return AVIERR_BADPARAM; - if (size != sizeof(AVISTREAMINFOW)) + if (size >= 0 && size < sizeof(AVISTREAMINFOW)) return AVIERR_BADSIZE; - if (asi->dwScale == 0 || asi->dwRate == 0 || (LONG)asi->dwQuality < -1 || - asi->dwQuality > ICQUALITY_HIGH) - return AVIERR_ERROR; This->sInfo.wLanguage = asi->wLanguage; This->sInfo.wPriority = asi->wPriority; This->sInfo.dwStart = asi->dwStart; - if (asi->dwRate != 0) - This->sInfo.dwRate = asi->dwRate; - if (asi->dwScale != 0) - This->sInfo.dwScale = asi->dwScale; - if (asi->dwQuality <= ICQUALITY_HIGH) - This->sInfo.dwQuality = ICQUALITY_HIGH; + This->sInfo.dwRate = asi->dwRate; + This->sInfo.dwScale = asi->dwScale; + This->sInfo.dwQuality = asi->dwQuality; CopyRect(&This->sInfo.rcFrame, &asi->rcFrame); memcpy(This->sInfo.szName, asi->szName, sizeof(asi->szName)); This->sInfo.dwEditCount++; diff --git a/dlls/avifil32/tests/api.c b/dlls/avifil32/tests/api.c index fe295bfb1af..14ad4b4223b 100644 --- a/dlls/avifil32/tests/api.c +++ b/dlls/avifil32/tests/api.c @@ -194,11 +194,11 @@ static void test_AVISaveOptions(void) SetLastError(0xdeadbeef); hres = EditStreamSetNameA(streams[0], winetest0); - todo_wine ok(hres == AVIERR_OK, "0: got 0x%x (expected AVIERR_OK)\n", hres); + ok(hres == AVIERR_OK, "0: got 0x%x (expected AVIERR_OK)\n", hres); SetLastError(0xdeadbeef); hres = EditStreamSetNameA(streams[1], winetest1); - todo_wine ok(hres == AVIERR_OK, "1: got 0x%x (expected AVIERR_OK)\n", hres); + ok(hres == AVIERR_OK, "1: got 0x%x (expected AVIERR_OK)\n", hres); if (winetest_interactive) { SetLastError(0xdeadbeef); @@ -223,6 +223,103 @@ static void test_AVISaveOptions(void) /* ########################### */ +static void test_EditStreamSetInfo(void) +{ + PAVISTREAM stream = NULL; + HRESULT hres; + AVISTREAMINFO info, info2; + + hres = CreateEditableStream(&stream, NULL); + ok(hres == AVIERR_OK, "got 0x%08X, expected AVIERR_OK\n", hres); + + + if(0) /* Crashing - first parameter not checked */ + hres = EditStreamSetInfo(NULL, &info, sizeof(AVISTREAMINFO) ); + + /* Size parameter is somehow checked (notice the crash with size=-1 below) */ + hres = EditStreamSetInfo(stream, NULL, 0); + ok( hres == AVIERR_BADSIZE, "got 0x%08X, expected AVIERR_BADSIZE\n", hres); + + hres = EditStreamSetInfo(stream, NULL, sizeof(AVISTREAMINFO)-1 ); + ok( hres == AVIERR_BADSIZE, "got 0x%08X, expected AVIERR_BADSIZE\n", hres); + + if(0) + { /* Crashing - second parameter not checked */ + hres = EditStreamSetInfo(stream, NULL, sizeof(AVISTREAMINFO) ); + + hres = EditStreamSetInfo(stream, NULL, -1); + ok( hres == AVIERR_BADSIZE, "got 0x%08X, expected AVIERR_BADSIZE\n", hres); + } + + hres = AVIStreamInfo(stream, &info, sizeof(AVISTREAMINFO) ); + ok( hres == 0, "got 0x%08X, expected 0\n", hres); + + /* Does the function check what's it's updating ? */ + +#define IS_INFO_UPDATED(m) do { \ + hres = EditStreamSetInfo(stream, &info, sizeof(AVISTREAMINFO) ); \ + ok( hres == 0, "got 0x%08X, expected 0\n", hres); \ + hres = AVIStreamInfo(stream, &info2, sizeof(AVISTREAMINFO) ); \ + ok( hres == 0, "got 0x%08X, expected 0\n", hres); \ + ok( info2.m == info.m, "EditStreamSetInfo did not update "#m" parameter\n" ); \ + } while(0) + + info.dwStart++; + IS_INFO_UPDATED(dwStart); + info.dwStart = 0; + IS_INFO_UPDATED(dwStart); + + info.wPriority++; + IS_INFO_UPDATED(wPriority); + info.wPriority = 0; + IS_INFO_UPDATED(wPriority); + + info.wLanguage++; + IS_INFO_UPDATED(wLanguage); + info.wLanguage = 0; + IS_INFO_UPDATED(wLanguage); + + info.dwScale++; + IS_INFO_UPDATED(dwScale); + info.dwScale = 0; + IS_INFO_UPDATED(dwScale); + + info.dwRate++; + IS_INFO_UPDATED(dwRate); + info.dwRate = 0; + IS_INFO_UPDATED(dwRate); + + info.dwQuality++; + IS_INFO_UPDATED(dwQuality); + info.dwQuality = 0; + IS_INFO_UPDATED(dwQuality); + info.dwQuality = -2; + IS_INFO_UPDATED(dwQuality); + info.dwQuality = ICQUALITY_HIGH+1; + IS_INFO_UPDATED(dwQuality); + + info.rcFrame.left = 0; + IS_INFO_UPDATED(rcFrame.left); + info.rcFrame.top = 0; + IS_INFO_UPDATED(rcFrame.top); + info.rcFrame.right = 0; + IS_INFO_UPDATED(rcFrame.right); + info.rcFrame.bottom = 0; + IS_INFO_UPDATED(rcFrame.bottom); + + info.rcFrame.left = -1; + IS_INFO_UPDATED(rcFrame.left); + info.rcFrame.top = -1; + IS_INFO_UPDATED(rcFrame.top); + info.rcFrame.right = -1; + IS_INFO_UPDATED(rcFrame.right); + info.rcFrame.bottom = -1; + IS_INFO_UPDATED(rcFrame.bottom); + AVIStreamRelease(stream); +#undef IS_INFO_UPDATED +} + + static void init_test_struct(COMMON_AVI_HEADERS *cah) { memcpy(cah->fh, deffh, sizeof(deffh)); @@ -451,6 +548,7 @@ START_TEST(api) { AVIFileInit(); + test_EditStreamSetInfo(); test_AVISaveOptions(); test_default_data(); test_amh_corruption();