summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2019-02-07 15:36:58 +0100
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2020-12-14 01:28:08 +0100
commitba4f3394fc63e2c74565a57a744569a5bacfd53f (patch)
treed2d43ec2acc9c042fc1b435f0522535053242315
parent12f8f2c87ffc8ec6e3e18a6125abe1716733e054 (diff)
Make osl_getLocalHostname thread-safe
Change-Id: I82b8c49fcbbec161bf968573e28992fa5737b45b Reviewed-on: https://gerrit.libreoffice.org/67508 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com> (cherry picked from commit cb22fb0c2e49010ed066c23f0521d10cc850c280) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107496 Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--sal/osl/w32/socket.cxx86
1 files changed, 46 insertions, 40 deletions
diff --git a/sal/osl/w32/socket.cxx b/sal/osl/w32/socket.cxx
index cce9af46f142..528ad8ebc7ea 100644
--- a/sal/osl/w32/socket.cxx
+++ b/sal/osl/w32/socket.cxx
@@ -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>
@@ -601,57 +605,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)