[PATCH 2/5] rpcrt4: Write parameter signatures into the procedure format string.
Huw Davies
huw at codeweavers.com
Fri Nov 9 03:00:09 CST 2018
On Thu, Nov 08, 2018 at 10:18:15PM -0600, Zebediah Figura wrote:
> +static HRESULT get_param_pointer_info(ITypeInfo *typeinfo, TYPEDESC *tdesc, int is_in,
> + int is_out, unsigned short *server_size, unsigned short *flags,
> + unsigned char *basetype, TYPEDESC **tfs_tdesc)
> +{
> + ITypeInfo *refinfo;
> + HRESULT hr = S_OK;
> + TYPEATTR *attr;
> +
> + switch (tdesc->vt)
> + {
> + case VT_UNKNOWN:
> + case VT_DISPATCH:
> + *flags |= MustFree;
> + if (is_in && is_out)
> + *server_size = sizeof(void *);
> + break;
> + case VT_PTR:
> + *flags |= MustFree;
> +
> + if (tdesc->lptdesc->vt == VT_USERDEFINED)
> + {
> + ITypeInfo_GetRefTypeInfo(typeinfo, tdesc->lptdesc->hreftype, &refinfo);
> + ITypeInfo_GetTypeAttr(refinfo, &attr);
> +
> + switch (attr->typekind)
> + {
> + case TKIND_INTERFACE:
> + case TKIND_DISPATCH:
> + case TKIND_COCLASS:
> + if (is_in && is_out)
> + *server_size = sizeof(void *);
> + break;
> + default:
> + *server_size = sizeof(void *);
> + }
> +
> + ITypeInfo_ReleaseTypeAttr(refinfo, attr);
> + ITypeInfo_Release(refinfo);
> + }
> + else
> + *server_size = sizeof(void *);
> + break;
> + case VT_CARRAY:
> + *flags |= IsSimpleRef | MustFree;
> + *server_size = type_memsize(typeinfo, tdesc);
> + *tfs_tdesc = tdesc;
> + break;
> + case VT_USERDEFINED:
> + ITypeInfo_GetRefTypeInfo(typeinfo, tdesc->hreftype, &refinfo);
> + ITypeInfo_GetTypeAttr(refinfo, &attr);
> +
> + switch (attr->typekind)
> + {
> + case TKIND_ENUM:
> + *flags |= IsSimpleRef | IsBasetype;
> + if (!is_in && is_out)
> + *server_size = sizeof(void *);
> + *basetype = FC_ENUM32;
> + break;
> + case TKIND_RECORD:
> + *flags |= IsSimpleRef | MustFree;
> + if (!is_in && is_out)
> + *server_size = attr->cbSizeInstance;
> + *tfs_tdesc = tdesc;
> + break;
> + case TKIND_INTERFACE:
> + case TKIND_DISPATCH:
> + case TKIND_COCLASS:
> + *flags |= MustFree;
> + break;
> + case TKIND_ALIAS:
> + hr = get_param_pointer_info(refinfo, &attr->tdescAlias, is_in,
> + is_out, server_size, flags, basetype, tfs_tdesc);
> + break;
> + default:
> + FIXME("unhandled kind %#x\n", attr->typekind);
> + return E_NOTIMPL;
There's still a leak here and in a similar place later on. I've
resent the set with a fix.
Huw.
More information about the wine-devel
mailing list