Module: wine Branch: master Commit: 05928721610ae4719ae1429f4c170de19eabd24c URL: https://gitlab.winehq.org/wine/wine/-/commit/05928721610ae4719ae1429f4c170de...
Author: Connor McAdams cmcadams@codeweavers.com Date: Wed Oct 11 11:51:54 2023 -0400
uiautomationcore: Release node lresult upon failure to allocate a node in uia_node_from_lresult().
Signed-off-by: Connor McAdams cmcadams@codeweavers.com
---
dlls/uiautomationcore/uia_client.c | 11 +++++++++++ dlls/uiautomationcore/uia_event.c | 8 -------- dlls/uiautomationcore/uia_private.h | 1 + 3 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/dlls/uiautomationcore/uia_client.c b/dlls/uiautomationcore/uia_client.c index f57ffb4bc4c..88e607b6e6a 100644 --- a/dlls/uiautomationcore/uia_client.c +++ b/dlls/uiautomationcore/uia_client.c @@ -2572,7 +2572,10 @@ HRESULT uia_node_from_lresult(LRESULT lr, HUIANODE *huianode)
hr = create_uia_node(&node, 0); if (FAILED(hr)) + { + uia_node_lresult_release(lr); return hr; + }
uia_start_client_thread(); hr = create_wine_uia_nested_node_provider(node, lr, FALSE); @@ -2601,6 +2604,14 @@ HRESULT uia_node_from_lresult(LRESULT lr, HUIANODE *huianode) return hr; }
+void uia_node_lresult_release(LRESULT lr) +{ + IWineUiaNode *node; + + if (lr && SUCCEEDED(ObjectFromLresult(lr, &IID_IWineUiaNode, 0, (void **)&node))) + IWineUiaNode_Release(node); +} + /* * UiaNodeFromHandle is expected to work even if the calling thread hasn't * initialized COM. We marshal our node on a separate thread that initializes diff --git a/dlls/uiautomationcore/uia_event.c b/dlls/uiautomationcore/uia_event.c index 2cb61a2062e..a82af6b495c 100644 --- a/dlls/uiautomationcore/uia_event.c +++ b/dlls/uiautomationcore/uia_event.c @@ -588,14 +588,6 @@ static struct uia_queue_event *uia_event_queue_pop(struct list *event_queue) return queue_event; }
-static void uia_node_lresult_release(LRESULT lr) -{ - IWineUiaNode *node; - - if (lr && SUCCEEDED(ObjectFromLresult(lr, &IID_IWineUiaNode, 0, (void **)&node))) - IWineUiaNode_Release(node); -} - static HRESULT uia_event_invoke(HUIANODE node, HUIANODE nav_start_node, struct uia_event_args *args, struct uia_event *event); static HRESULT uia_raise_clientside_event(struct uia_queue_uia_event *event) diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h index b55379b459d..49d42cbeb45 100644 --- a/dlls/uiautomationcore/uia_private.h +++ b/dlls/uiautomationcore/uia_private.h @@ -219,6 +219,7 @@ HRESULT navigate_uia_node(struct uia_node *node, int nav_dir, HUIANODE *out_node HRESULT create_uia_node_from_elprov(IRawElementProviderSimple *elprov, HUIANODE *out_node, BOOL get_hwnd_providers, int node_flags) DECLSPEC_HIDDEN; HRESULT uia_node_from_lresult(LRESULT lr, HUIANODE *huianode) DECLSPEC_HIDDEN; +void uia_node_lresult_release(LRESULT lr) DECLSPEC_HIDDEN; HRESULT create_uia_node_from_hwnd(HWND hwnd, HUIANODE *out_node, int node_flags) DECLSPEC_HIDDEN; HRESULT uia_condition_check(HUIANODE node, struct UiaCondition *condition) DECLSPEC_HIDDEN; BOOL uia_condition_matched(HRESULT hr) DECLSPEC_HIDDEN;