[PATCH] quartz: Fix IEnumFilters::Skip() implementation.

Zebediah Figura (she/her) zfigura at codeweavers.com
Mon Nov 23 09:47:29 CST 2020


On 11/23/20 7:30 AM, Gijs Vermeulen wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=28332
> Signed-off-by: Gijs Vermeulen <gijsvrm at gmail.com>
> ---
>  dlls/quartz/filtergraph.c       |  7 +++++--
>  dlls/quartz/tests/filtergraph.c | 27 +++++++++++++++++++++++++++
>  2 files changed, 32 insertions(+), 2 deletions(-)
> 
> diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
> index b3aebabbdad..c9e26231032 100644
> --- a/dlls/quartz/filtergraph.c
> +++ b/dlls/quartz/filtergraph.c
> @@ -322,13 +322,16 @@ static HRESULT WINAPI EnumFilters_Skip(IEnumFilters *iface, ULONG count)
>  
>      TRACE("enum_filters %p, count %u.\n", enum_filters, count);
>  
> +    if (enum_filters->version != enum_filters->graph->version)
> +        return VFW_E_ENUM_OUT_OF_SYNC;
> +
>      if (!enum_filters->cursor)
> -        return S_FALSE;
> +        return E_INVALIDARG;
>  
>      while (count--)
>      {
>          if (!(enum_filters->cursor = list_next(&enum_filters->graph->filters, enum_filters->cursor)))
> -            return S_FALSE;
> +            return count ? S_FALSE : S_OK;
>      }
>  
>      return S_OK;

There's basically three separate changes here, and they could be split
up individually.

(In general, using "fix X" as a commit subject is not great; here it's a
sign that multiple different changes are being grouped together).

> diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
> index e7ee4e5c446..f35b54a02e8 100644
> --- a/dlls/quartz/tests/filtergraph.c
> +++ b/dlls/quartz/tests/filtergraph.c
> @@ -677,12 +677,39 @@ static void test_enum_filters(void)
>      hr = IEnumFilters_Next(enum1, 1, filters, NULL);
>      ok(hr == S_FALSE, "Got hr %#x.\n", hr);
>  
> +    hr = IEnumFilters_Skip(enum1, 0);
> +    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
> +
> +    hr = IEnumFilters_Skip(enum1, 1);
> +    ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
> +
>      IFilterGraph2_AddFilter(graph, filter1, NULL);
>      IFilterGraph2_AddFilter(graph, filter2, NULL);
>  
>      hr = IEnumFilters_Next(enum1, 1, filters, NULL);
>      ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#x.\n", hr);
>  
> +    hr = IEnumFilters_Skip(enum1, 1);
> +    ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#x.\n", hr);
> +
> +    hr = IEnumFilters_Reset(enum1);
> +    ok(hr == S_OK, "Got hr %#x.\n", hr);
> +
> +    hr = IEnumFilters_Skip(enum1, 0);
> +    ok(hr == S_OK, "Got hr %#x.\n", hr);
> +
> +    hr = IEnumFilters_Skip(enum1, 1);
> +    ok(hr == S_OK, "Got hr %#x.\n", hr);
> +
> +    hr = IEnumFilters_Skip(enum1, 2);
> +    ok(hr == S_FALSE, "Got hr %#x.\n", hr);

If you call Skip() again after this, does it return E_INVALIDARG? That
seems worth adding tests for.

> +
> +    hr = IEnumFilters_Reset(enum1);
> +    ok(hr == S_OK, "Got hr %#x.\n", hr);
> +
> +    hr = IEnumFilters_Skip(enum1, 2);
> +    ok(hr == S_OK, "Got hr %#x.\n", hr);
> +

Same here.

>      hr = IEnumFilters_Reset(enum1);
>      ok(hr == S_OK, "Got hr %#x.\n", hr);
>  
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 484 bytes
Desc: OpenPGP digital signature
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20201123/820dce4f/attachment.sig>


More information about the wine-devel mailing list