Not exactly, the length is not at [0], it is actually before that. See:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/automat/string-manipulation-functions


 So when we access BSTR pointers we can safely assume they are compatible
with WCHAR pointers. But when we create a BSTR pointer to pass to the
system then yes, we should use the Sys*String functions.

 Just fixed and committed to the SVN.

Best,
Scuri


Em ter, 4 de jun de 2019 às 08:38, Ranier VF <ranier_...@hotmail.com>
escreveu:

> Hi,
> BSTR are not WCHAR compatible.
> See at:
>
> https://www.codeguru.com/cpp/cpp/string/conversions/article.php/c5639/Guide-to-BSTR-and-C-String-Conversions.htm
> "C strings are arrays of characters terminated by a NULL character. Visual
> Basic strings differ in that the length of the string precede the
> characters in the string. So, a VB string knows its own length. In
> addition, all VB strings are Unicode (16 bits per character)."
>
> BSTR contain the length of the string. WCHAR [0] position can be anything,
> If code subsequent read the length with WCHAR string, the result is
> impredictable.
> The Coverity report this as Memory Corruption, level High.
>
> I agree with Coverity, the code is unsafe and violate the rules use of
> functions
> calls what await BSTR valid variables.
>
> Best regards,
> Ranier Vilela
>
> ________________________________________
> De: Antonio Scuri <antonio.sc...@gmail.com>
> Enviado: terça-feira, 4 de junho de 2019 11:15
> Para: IUP discussion list.
> Assunto: Re: [Iup-users] CID 341226 (#1 of 1): COM bad conversion to BSTR
> (COM.BSTR.CONV)
>
>   We use BSTR as the same definition of WCHAR, that's why we can do what
> we do. In a more generic code that should work with BSTR variations then we
> should be more careful. But that's not the case.
>
> Best,
> Scuri
>
>
> Em seg, 3 de jun de 2019 às 23:05, Ranier VF <ranier_...@hotmail.com
> <mailto:ranier_...@hotmail.com>> escreveu:
> Hi,
> Several fixes for the iupwin_webbrowser.cpp
>
> --- \dll\iup\a\srcweb\iupwin_webbrowser.cpp     Wed Apr 03 14:12:26 2019
> +++ iupwin_webbrowser.cpp       Mon Jun 03 23:00:50 2019
> @@ -206,12 +206,14 @@
>    pweb->get_Document(&lpDispatch);
>    if (!lpDispatch)
>    {
> +    const BSTR pBstr = SysAllocString("about:blank");
>      iupAttribSet(ih, "_IUPWEB_FAILED", NULL);
>
> -    pweb->Navigate(L"about:blank", NULL, NULL, NULL, NULL);
> +    pweb->Navigate(pBstr, NULL, NULL, NULL, NULL);
>      IupFlush();
>
>      pweb->get_Document(&lpDispatch);
> +    SysFreeString(pBstr);
>    }
>
>    IPersistStreamInit* pPersistStreamInit = NULL;
> @@ -405,15 +407,15 @@
>  {
>    if (value)
>    {
> -    char* element_id = iupAttribGet(ih, "ELEMENT_ID");
> +    const char* element_id = iupAttribGet(ih, "ELEMENT_ID");
>      if (element_id)
>      {
> -      IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
> +      const IHTMLElement* pElem = winWebBrowserFindElement(ih,
> element_id);
>        if (pElem)
>        {
> -        WCHAR* wvalue = iupwinStrChar2Wide(value);
> -        pElem->put_innerText(wvalue);
> -        free(wvalue);
> +        const BSTR pBvalue = SysAllocString(szWCharString);
> +        pElem->put_innerText(pBvalue);
> +        SysFreeString(pBvalue);
>          pElem->Release();
>        }
>      }
> @@ -423,50 +425,49 @@
>
>  static char* winWebBrowserGetInnerTextAttrib(Ihandle* ih)
>  {
> -  char* element_id = iupAttribGet(ih, "ELEMENT_ID");
> +  const char* element_id = iupAttribGet(ih, "ELEMENT_ID");
> +  const* value = NULL;
>    if (element_id)
>    {
> -    IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
> +    const IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
>      if (pElem)
>      {
> -      WCHAR* wvalue = NULL;
> -      if (!FAILED(pElem->get_innerText(&wvalue)))
> +      BSTR pBvalue = NULL;
> +      if (!FAILED(pElem->get_innerText(&pBvalue)))
>        {
> -        char* str = iupwinStrWide2Char(wvalue);
> -        char* value = iupStrReturnStr(str);
> -        SysFreeString(wvalue);
> +        const char* str = iupwinStrWide2Char(pBvalue);
> +        const char* value = iupStrReturnStr(str);
>          free(str);
> -        pElem->Release();
> -        return value;
> +        SysFreeString(pBvalue);
>        }
>        pElem->Release();
>      }
>    }
>
> -  return NULL;
> +  return value;
>  }
>
>  static int winWebBrowserSetAttributeAttrib(Ihandle* ih, const char* value)
>  {
>    if (value)
>    {
> -    char* element_id = iupAttribGet(ih, "ELEMENT_ID");
> -    char* attribute_name = iupAttribGet(ih, "ATTRIBUTE_NAME");
> +    const char* element_id = iupAttribGet(ih, "ELEMENT_ID");
> +    const char* attribute_name = iupAttribGet(ih, "ATTRIBUTE_NAME");
>      if (element_id && attribute_name)
>      {
>        IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
>        if (pElem)
>        {
> -        WCHAR* wname = iupwinStrChar2Wide(attribute_name);
> -        WCHAR* wvalue = iupwinStrChar2Wide(value);
> +        const BSTR pBname = SysAllocString(attribute_name);
> +        const WCHAR* wvalue = iupwinStrChar2Wide(value);
>
>          VARIANT var;
>          VariantBStr(&var, wvalue);
>
> -        pElem->setAttribute(wname, var, 1);  // case sensitive search
> +        pElem->setAttribute(pBname, var, 1);  // case sensitive search
>
>          free(wvalue);
> -        free(wname);
> +        SysFreeString(pBname);
>          pElem->Release();
>        }
>      }
> @@ -476,31 +477,29 @@
>
>  static char* winWebBrowserGetAttributeAttrib(Ihandle* ih)
>  {
> -  char* element_id = iupAttribGet(ih, "ELEMENT_ID");
> -  char* attribute_name = iupAttribGet(ih, "ATTRIBUTE_NAME");
> +  const char* element_id = iupAttribGet(ih, "ELEMENT_ID");
> +  const char* attribute_name = iupAttribGet(ih, "ATTRIBUTE_NAME");
> +  const char *value = NULL;
>    if (element_id && attribute_name)
>    {
> -    IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
> +    const IHTMLElement* pElem = winWebBrowserFindElement(ih, element_id);
>      if (pElem)
>      {
> -      WCHAR* wname = iupwinStrChar2Wide(attribute_name);
> +      const BSTR pBname = SysAllocString(attribute_name);
>        VARIANT var;
>        VariantInit(&var);
> -      if (!FAILED(pElem->getAttribute(wname, 1, &var)) && var.bstrVal)
> // case sensitive search
> +      if (!FAILED(pElem->getAttribute(pBname, 1, &var)) && var.bstrVal)
> // case sensitive search
>        {
> -        char* str = iupwinStrWide2Char(var.bstrVal);
> -        char* value = iupStrReturnStr(str);
> +        const char* str = iupwinStrWide2Char(var.bstrVal);
> +        value = iupStrReturnStr(str);
>          free(str);
> -        free(wname);
> -        pElem->Release();
> -        return value;
>        }
> -      free(wname);
> +      SysFreeString(pBname);
>        pElem->Release();
>      }
>    }
>
> -  return NULL;
> +  return value;
>  }
>
>  static int winWebBrowserSetBackForwardAttrib(Ihandle* ih, const char*
> value)
> @@ -578,7 +577,7 @@
>    if (value)
>    {
>      IWebBrowser2 *pweb = (IWebBrowser2*)iupAttribGet(ih,
> "_IUPWEB_BROWSER");
> -    WCHAR* wvalue = iupwinStrChar2Wide(value);
> +    const BSTR pBvalue = SysAllocString(value);
>
>      VARIANT var;
>      VariantInit(&var);  /* Initialize our variant */
> @@ -587,8 +586,8 @@
>
>      iupAttribSet(ih, "_IUPWEB_FAILED", NULL);
>
> -    pweb->Navigate(wvalue, NULL, &var, NULL, NULL);
> -    free(wvalue);
> +    pweb->Navigate(pBvalue, NULL, &var, NULL, NULL);
> +    SysFreeString(pBvalue);
>    }
>    return 0;
>  }
> @@ -599,10 +598,10 @@
>    BSTR pbstrLocationURL = NULL;
>    if (pweb->get_LocationURL(&pbstrLocationURL)==S_OK && pbstrLocationURL)
>    {
> -    char* str = iupwinStrWide2Char(pbstrLocationURL);
> -    SysFreeString(pbstrLocationURL);
> +    const char* str = iupwinStrWide2Char(pbstrLocationURL);
>      char* value = iupStrReturnStr(str);
>      free(str);
> +    SysFreeString(pbstrLocationURL);
>      return value;
>    }
>    return NULL;
>
> Best regards,
> Ranier Vilela_______________________________________________
> Iup-users mailing list
> Iup-users@lists.sourceforge.net<mailto:Iup-users@lists.sourceforge.net>
> https://lists.sourceforge.net/lists/listinfo/iup-users
>
>
> _______________________________________________
> Iup-users mailing list
> Iup-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/iup-users
>
_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users

Reply via email to