[Libreoffice-commits] core.git: sal/osl

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Feb 7 12:38:36 UTC 2019


 sal/osl/unx/socket.cxx |   88 ++++++++++++++++++++-----------------------------
 1 file changed, 37 insertions(+), 51 deletions(-)

New commits:
commit 17e5028044edef2b959b73ce1dbe2c9627d1a799
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Thu Feb 7 12:24:27 2019 +0100
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Thu Feb 7 13:38:12 2019 +0100

    Make osl_getLocalHostname thread-safe
    
    Change-Id: I19b0cc48b18ddda5bd09c88f03565e9b73ed776a
    Reviewed-on: https://gerrit.libreoffice.org/67495
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/sal/osl/unx/socket.cxx b/sal/osl/unx/socket.cxx
index a77b3f364bf0..98bf54450e72 100644
--- a/sal/osl/unx/socket.cxx
+++ b/sal/osl/unx/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.hxx"
 
 #include <osl/socket.h>
@@ -25,6 +29,7 @@
 
 #include <rtl/alloc.h>
 #include <rtl/byteseq.h>
+#include <rtl/ustring.hxx>
 #include <assert.h>
 #include <sal/types.h>
 #include <sal/log.hxx>
@@ -269,9 +274,6 @@ static oslHostAddr osl_psz_createHostAddrByName (
 static const sal_Char* osl_psz_getHostnameOfHostAddr (
     const oslHostAddr Addr);
 
-static oslSocketResult osl_psz_getLocalHostname (
-    sal_Char *pBuffer, sal_uInt32 nBufLen);
-
 static oslSocketAddr osl_psz_resolveHostname (
     const sal_Char* pszHostname);
 
@@ -880,69 +882,53 @@ void SAL_CALL osl_destroyHostAddr (oslHostAddr pAddr)
 
 oslSocketResult SAL_CALL osl_getLocalHostname(rtl_uString **ustrLocalHostname)
 {
-    oslSocketResult Result;
-    sal_Char pszHostname[1024];
-
-    pszHostname[0] = '\0';
-
-    Result = osl_psz_getLocalHostname(pszHostname,sizeof(pszHostname));
-
-    rtl_uString_newFromAscii(ustrLocalHostname,pszHostname);
-
-    return Result;
-}
-
-oslSocketResult osl_psz_getLocalHostname (
-    sal_Char *pBuffer, sal_uInt32 nBufLen)
-{
-    static sal_Char LocalHostname[256] = "";
-
-    if (LocalHostname[0] == '\0')
-    {
+    static auto const init = []() -> std::pair<oslSocketResult, OUString> {
+            sal_Char LocalHostname[256] = "";
 
 #ifdef SYSV
-        struct utsname uts;
+            struct utsname uts;
 
-        if (uname(&uts) < 0)
-            return osl_Socket_Error;
+            if (uname(&uts) < 0)
+                return {osl_Socket_Error, OUString()};
 
-        if ((strlen(uts.nodename) + 1) > nBufLen)
-            return osl_Socket_Error;
+            if ((strlen(uts.nodename) + 1) > nBufLen)
+                return {osl_Socket_Error, OUString()};
 
-        strncpy(LocalHostname, uts.nodename, sizeof( LocalHostname ));
+            strncpy(LocalHostname, uts.nodename, sizeof( LocalHostname ));
 #else  /* BSD compatible */
-        if (gethostname(LocalHostname, sizeof(LocalHostname)-1) != 0)
-            return osl_Socket_Error;
+            if (gethostname(LocalHostname, sizeof(LocalHostname)-1) != 0)
+                return {osl_Socket_Error, OUString()};
 #endif /* SYSV */
-        LocalHostname[sizeof(LocalHostname)-1] = 0;
+            LocalHostname[sizeof(LocalHostname)-1] = 0;
 
-        /* check if we have an FQDN */
-        if (strchr(LocalHostname, '.') == nullptr)
-        {
-            oslHostAddr Addr;
+            /* check if we have an FQDN */
+            if (strchr(LocalHostname, '.') == nullptr)
+            {
+                oslHostAddr Addr;
 
-            /* no, determine it via dns */
-            Addr = osl_psz_createHostAddrByName(LocalHostname);
+                /* no, determine it via dns */
+                Addr = osl_psz_createHostAddrByName(LocalHostname);
 
-            const sal_Char *pStr;
-            if ((pStr = osl_psz_getHostnameOfHostAddr(Addr)) != nullptr)
+                const sal_Char *pStr;
+                if ((pStr = osl_psz_getHostnameOfHostAddr(Addr)) != nullptr)
+                {
+                    strncpy(LocalHostname, pStr, sizeof( LocalHostname ));
+                    LocalHostname[sizeof(LocalHostname)-1] = 0;
+                }
+                osl_destroyHostAddr(Addr);
+            }
+
+            if (LocalHostname[0] != '\0')
             {
-                strncpy(LocalHostname, pStr, sizeof( LocalHostname ));
-                LocalHostname[sizeof(LocalHostname)-1] = 0;
+                return {osl_Socket_Ok, OUString::createFromAscii(LocalHostname)};
             }
-            osl_destroyHostAddr(Addr);
-        }
-    }
 
-    if (LocalHostname[0] != '\0')
-    {
-        strncpy(pBuffer, LocalHostname, nBufLen);
-        pBuffer[nBufLen - 1] = '\0';
+            return {osl_Socket_Error, OUString()};
+        }();
 
-        return osl_Socket_Ok;
-    }
+    rtl_uString_assign(ustrLocalHostname,init.second.pData);
 
-    return osl_Socket_Error;
+    return init.first;
 }
 
 oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString *ustrHostname)


More information about the Libreoffice-commits mailing list