Module: wine Branch: master Commit: c20c47b85ebb59f01e6ddb6a8da264ff465ebf8d URL: http://source.winehq.org/git/wine.git/?a=commit;h=c20c47b85ebb59f01e6ddb6a8d...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Jul 7 12:50:03 2016 +0200
mshtml: Properly handle duplicated names with different DISPIDs in add_func_info.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/mshtml/dispex.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index d934f56..2013cee 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -231,12 +231,19 @@ static BOOL is_arg_type_supported(VARTYPE vt) static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc, ITypeInfo *dti) { func_info_t *info; + BSTR name; HRESULT hres;
+ hres = ITypeInfo_GetDocumentation(dti, desc->memid, &name, NULL, NULL, NULL); + if(FAILED(hres)) + return; + for(info = data->funcs; info < data->funcs+data->func_cnt; info++) { - if(info->id == desc->memid) { - if(info->tid != tid) + if(info->id == desc->memid || !strcmpW(info->name, name)) { + if(info->tid != tid) { + SysFreeString(name); return; /* Duplicated in other interface */ + } break; } } @@ -246,16 +253,15 @@ static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc, data->funcs = heap_realloc_zero(data->funcs, (data->func_size <<= 1)*sizeof(func_info_t)); info = data->funcs+data->func_cnt;
- hres = ITypeInfo_GetDocumentation(dti, desc->memid, &info->name, NULL, NULL, NULL); - if(FAILED(hres)) - return; - data->func_cnt++;
info->id = desc->memid; + info->name = name; info->tid = tid; info->func_disp_idx = -1; info->prop_vt = VT_EMPTY; + }else { + SysFreeString(name); }
if(desc->invkind & DISPATCH_METHOD) {