Kaydet (Commit) cb22fb0c authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Make osl_getLocalHostname thread-safe

Change-Id: I82b8c49fcbbec161bf968573e28992fa5737b45b
Reviewed-on: https://gerrit.libreoffice.org/67508
Tested-by: Jenkins
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst fd66ee18
......@@ -17,6 +17,10 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <sal/config.h>
#include <utility>
#include "system.h"
#include <osl/socket.h>
......@@ -596,57 +600,59 @@ void SAL_CALL osl_destroyHostAddr(oslHostAddr pAddr)
oslSocketResult SAL_CALL osl_getLocalHostname (rtl_uString **strLocalHostname)
{
static sal_Unicode LocalHostname[256] = {0};
static auto const init = []() -> std::pair<oslSocketResult, OUString> {
sal_Unicode LocalHostname[256] = {0};
if (rtl_ustr_getLength(LocalHostname) == 0)
{
sal_Char Host[256]= "";
if (gethostname(Host, sizeof(Host)) == 0)
{
/* check if we have an FQDN; if not, try to determine it via dns first: */
if (strchr(Host, '.') == nullptr)
sal_Char Host[256]= "";
if (gethostname(Host, sizeof(Host)) == 0)
{
oslHostAddr pAddr;
rtl_uString *hostName= nullptr;
/* check if we have an FQDN; if not, try to determine it via dns first: */
if (strchr(Host, '.') == nullptr)
{
oslHostAddr pAddr;
rtl_uString *hostName= nullptr;
rtl_string2UString(
&hostName, Host, strlen(Host),
RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
OSL_ASSERT(hostName != nullptr);
rtl_string2UString(
&hostName, Host, strlen(Host),
RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
OSL_ASSERT(hostName != nullptr);
pAddr = osl_createHostAddrByName(hostName);
rtl_uString_release (hostName);
pAddr = osl_createHostAddrByName(hostName);
rtl_uString_release (hostName);
if (pAddr && pAddr->pHostName)
memcpy(LocalHostname, pAddr->pHostName->buffer, sizeof(sal_Unicode)*(rtl_ustr_getLength(pAddr->pHostName->buffer)+1));
else
memset(LocalHostname, 0, sizeof(LocalHostname));
if (pAddr && pAddr->pHostName)
memcpy(LocalHostname, pAddr->pHostName->buffer, sizeof(sal_Unicode)*(rtl_ustr_getLength(pAddr->pHostName->buffer)+1));
else
memset(LocalHostname, 0, sizeof(LocalHostname));
osl_destroyHostAddr (pAddr);
}
if (LocalHostname[0] == u'\0')
{
OUString u;
if (rtl_convertStringToUString(
&u.pData, Host, strlen(Host), osl_getThreadTextEncoding(),
(RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
| RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
| RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR))
&& u.getLength() < SAL_N_ELEMENTS(LocalHostname))
osl_destroyHostAddr (pAddr);
}
if (LocalHostname[0] == u'\0')
{
memcpy(LocalHostname, u.getStr(), (u.getLength() + 1) * sizeof sal_Unicode);
OUString u;
if (rtl_convertStringToUString(
&u.pData, Host, strlen(Host), osl_getThreadTextEncoding(),
(RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
| RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
| RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR))
&& u.getLength() < SAL_N_ELEMENTS(LocalHostname))
{
memcpy(LocalHostname, u.getStr(), (u.getLength() + 1) * sizeof sal_Unicode);
}
}
}
}
}
if (rtl_ustr_getLength(LocalHostname) > 0)
{
rtl_uString_newFromStr (strLocalHostname, LocalHostname);
return osl_Socket_Ok;
}
if (rtl_ustr_getLength(LocalHostname) > 0)
{
return {osl_Socket_Ok, LocalHostname};
}
return osl_Socket_Error;
return {osl_Socket_Error, OUString()};
}();
rtl_uString_assign (strLocalHostname, init.second.pData);
return init.first;
}
oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString* strHostname)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment