diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c226e525..2fb1073ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -581,8 +581,6 @@ if(UNIX OR CYGWIN) set(WAYLAND_FEATURE_TYPE "RECOMMENDED") include(CheckFunctionExists) - - check_function_exists(getlogin_r HAVE_GETLOGIN_R) else() set(X11_FEATURE_TYPE "DISABLED") set(WAYLAND_FEATURE_TYPE "DISABLED") diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index 7b29d401a..790cc2921 100644 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -35,6 +35,7 @@ #include #include +#include #include #include @@ -646,16 +647,13 @@ static BOOL isAutomountLocation(const char* path) { const size_t nrLocations = sizeof(automountLocations) / sizeof(automountLocations[0]); size_t x; - char buffer[MAX_PATH]; + char buffer[MAX_PATH] = { 0 }; uid_t uid = getuid(); char uname[MAX_PATH] = { 0 }; + ULONG size = sizeof(uname) - 1; -#ifndef HAVE_GETLOGIN_R - strncpy(uname, getlogin(), sizeof(uname)); -#else - if (getlogin_r(uname, sizeof(uname)) != 0) + if (!GetUserNameExA(NameSamCompatible, uname, &size)) return FALSE; -#endif if (!path) return FALSE; diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 00792002b..5d169ac5f 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -27,6 +27,8 @@ #endif #include +#include + #include #include @@ -1180,20 +1182,12 @@ static BOOL xf_pre_connect(freerdp* instance) if (!settings->Username && !settings->CredentialsFromStdin && !settings->SmartcardLogon) { - int rc; char login_name[MAX_PATH] = { 0 }; + ULONG size = sizeof(login_name) - 1; -#ifdef HAVE_GETLOGIN_R - rc = getlogin_r(login_name, sizeof(login_name)); -#else - strncpy(login_name, getlogin(), sizeof(login_name)); - rc = 0; -#endif - if (rc == 0) + if (GetUserNameExA(NameSamCompatible, login_name, &size)) { - settings->Username = _strdup(login_name); - - if (!settings->Username) + if (!freerdp_settings_set_string(settings, FreeRDP_Username, login_name)) return FALSE; WLog_INFO(TAG, "No user name set. - Using login name: %s", settings->Username); diff --git a/config.h.in b/config.h.in index 60e8f57cb..41e8e2862 100644 --- a/config.h.in +++ b/config.h.in @@ -16,7 +16,6 @@ #cmakedefine HAVE_JOURNALD_H #cmakedefine HAVE_VALGRIND_MEMCHECK_H #cmakedefine HAVE_EXECINFO_H -#cmakedefine HAVE_GETLOGIN_R #cmakedefine HAVE_STRNDUP /* Features */ diff --git a/uwac/templates/config.h.in b/uwac/templates/config.h.in index 0d733317b..3b6015373 100644 --- a/uwac/templates/config.h.in +++ b/uwac/templates/config.h.in @@ -6,7 +6,6 @@ #cmakedefine HAVE_POLL_H #cmakedefine HAVE_SYSLOG_H #cmakedefine HAVE_JOURNALD_H -#cmakedefine HAVE_GETLOGIN_R #cmakedefine HAVE_STRNDUP #cmakedefine HAVE_PIXMAN_REGION diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index 368427ef2..be83bdd3b 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -158,6 +158,8 @@ if(NOT IOS) if (HAVE_SYS_EVENTFD_H) check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE) endif() + check_function_exists(getlogin_r HAVE_GETLOGIN_R) + check_function_exists(getpwuid_r HAVE_GETPWUID_R) else() set(HAVE_FCNTL_H 1) set(HAVE_UNISTD_H 1) diff --git a/winpr/config.h.in b/winpr/config.h.in index a0dd1f7ba..c26028d85 100644 --- a/winpr/config.h.in +++ b/winpr/config.h.in @@ -23,6 +23,7 @@ #cmakedefine HAVE_PTHREAD_MUTEX_TIMEDLOCK #cmakedefine HAVE_EXECINFO_H #cmakedefine HAVE_GETLOGIN_R +#cmakedefine HAVE_GETPWUID_R #cmakedefine HAVE_STRNDUP #cmakedefine WITH_EVENTFD_READ_WRITE diff --git a/winpr/libwinpr/sspicli/sspicli.c b/winpr/libwinpr/sspicli/sspicli.c index 039416994..97eb3fb63 100644 --- a/winpr/libwinpr/sspicli/sspicli.c +++ b/winpr/libwinpr/sspicli/sspicli.c @@ -21,6 +21,7 @@ #include "config.h" #endif +#include #include /** @@ -60,6 +61,12 @@ #include #endif +#if defined(HAVE_GETPWUID_R) +#include +#include +#include +#endif + #include #include @@ -200,30 +207,30 @@ BOOL LogonUserExW(LPCWSTR lpszUsername, LPCWSTR lpszDomain, LPCWSTR lpszPassword BOOL GetUserNameExA(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize) { - size_t length; - char login[MAX_PATH]; - switch (NameFormat) { case NameSamCompatible: -#ifndef HAVE_GETLOGIN_R - strncpy(login, getlogin(), sizeof(login)); -#else - if (getlogin_r(login, sizeof(login)) != 0) +#if defined(HAVE_GETPWUID_R) + { + int rc; + struct passwd pwd = { 0 }; + struct passwd* result = NULL; + uid_t uid = getuid(); + + rc = getpwuid_r(uid, &pwd, lpNameBuffer, *nSize, &result); + if (rc != 0) return FALSE; + if (result == NULL) + return FALSE; + } +#elif defined(HAVE_GETLOGIN_R) + if (getlogin_r(lpNameBuffer, *nSize) != 0) + return FALSE; +#else + strncpy(lpNameBuffer, getlogin(), *nSize); #endif - length = strlen(login); - - if (*nSize >= length) - { - CopyMemory(lpNameBuffer, login, length + 1); - return TRUE; - } - else - { - *nSize = length + 1; - } - + if (*nSize > 1) + *nSize = strnlen(lpNameBuffer, *nSize - 1) + 1; break; case NameFullyQualifiedDN: @@ -245,7 +252,29 @@ BOOL GetUserNameExA(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG BOOL GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize) { - return 0; + int res; + BOOL rc = FALSE; + char* name; + + WINPR_ASSERT(nSize); + WINPR_ASSERT(lpNameBuffer); + + name = calloc(1, *nSize + 1); + if (!name) + goto fail; + + if (!GetUserNameExA(NameFormat, name, nSize)) + goto fail; + + res = ConvertToUnicode(CP_UTF8, 0, name, -1, &lpNameBuffer, *nSize); + if (res < 0) + goto fail; + + *nSize = res + 1; + rc = TRUE; +fail: + free(name); + return rc; } #endif