On Mon, Dec 16, 2019 at 11:16 AM Dmitry Timoshkov <dmitry@baikal.ru> wrote:
Alistair Leslie-Hughes <leslie_alistair@hotmail.com> wrote:

> > +                    if (CoCreateInstance(&clsid, 0, CLSCTX_INPROC_SERVER, &IID_IADsOpenDSObject, (void **)&adsopen) == S_OK)
> > +                    {
> > +                        hr = IADsOpenDSObject_OpenDSObject(adsopen, (BSTR)path, (BSTR)user, (BSTR)password, reserved, &disp);
> > +                        if (hr == S_OK)
> You cannot cast to a BSTR, it will corrupt the data structure.

I depends wheather the callee uses SysStringLen() and friends, in this
particular case it works just fine, there are many other places in the code
when it's not necessary to create intermediate copies of the strings.

It does not matter if it works in this case, arguments should use correct types. If we have similar violations somewhere else, those need fixing as well.
 

> > +                        {
> > +                            hr = IDispatch_QueryInterface(disp, riid, obj);
> > +                            IDispatch_Release(disp);
> Now that you have found the object, shouldn't you exit the loop?

Yes, thanks for spotting this. I think it could be fixed in a later patch.

--
Dmitry.