VirtualBox

Ignore:
Timestamp:
Sep 27, 2015 8:36:38 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
102888
Message:

IPRT: More windows process creation hacking and cleaning up. Cleaned up RTProcQueryUsername and RTProcQueryUsernameA too (all platforms).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/posix/process-posix.cpp

    r57358 r57916  
    159159
    160160
    161 RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser,
    162                                   size_t *pcbUser)
     161RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser, size_t *pcbUser)
    163162{
    164163    AssertReturn(   (pszUser && cbUser > 0)
    165164                 || (!pszUser && !cbUser), VERR_INVALID_PARAMETER);
    166 
    167     if (hProcess != RTProcSelf())
    168         return VERR_NOT_SUPPORTED;
    169 
    170     int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX);
    171     if (cbPwdMax == -1)
    172         return RTErrConvertFromErrno(errno);
    173 
    174     char *pbBuf = (char *)RTMemAllocZ(cbPwdMax);
    175     if (!pbBuf)
    176         return VERR_NO_MEMORY;
    177 
    178     struct passwd Pwd, *pPwd;
    179     int rc = getpwuid_r(geteuid(), &Pwd, pbBuf, cbPwdMax, &pPwd);
    180     if (!rc)
    181     {
    182         size_t cbPwdUser = strlen(pPwd->pw_name) + 1;
    183 
    184         if (pcbUser)
    185             *pcbUser = cbPwdUser;
    186 
    187         if (cbPwdUser > cbUser)
    188             rc = VERR_BUFFER_OVERFLOW;
    189         else
     165    AssertReturn(pcbUser || pszUser, VERR_INVALID_PARAMETER);
     166
     167    int rc;
     168    if (   hProcess == NIL_RTPROCESS
     169        || hProcess == RTProcSelf())
     170    {
     171        /*
     172         * Figure a good buffer estimate.
     173         */
     174        int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX);
     175        if (cbPwdMax <= sizeof(_1K))
     176            cbPwdMax = _1K;
     177        else
     178            AssertStmt(cbPwdMax <= 32U*_1M, cbPwdMax = 32U*_1M);
     179        char *pchBuf = (char *)RTMemTmpAllocZ(cbPwdMax);
     180        if (pbBuf)
    190181        {
    191 /** @todo this needs to be UTF-8 checked or converted...   */
    192             memcpy(pszUser, pPwd->pw_name, cbPwdUser);
    193             rc = VINF_SUCCESS;
     182            /*
     183             * Get the password file entry.
     184             */
     185            struct passwd  Pwd;
     186            struct passwd *pPwd = NULL;
     187            rc = getpwuid_r(geteuid(), &Pwd, pchBuf, cbPwdMax, &pPwd);
     188            if (!rc)
     189            {
     190                /*
     191                 * Convert the name to UTF-8, assuming that we're getting it in the local codeset.
     192                 */
     193                /** @todo This isn't exactly optimal... the current codeset/page conversion
     194                 *        stuff never was.  Should optimize that for UTF-8 and ASCII one day.
     195                 *        And also optimize for avoiding heap. */
     196                char *pszTmp = NULL;
     197                rc = RTStrCurrentCPToUtf8(&pszTmp, pPwd->pw_name);
     198                if (RT_SUCCESS(rc))
     199                {
     200                    size_t cbTmp = strlen(pszTmp) + 1;
     201                    if (pcbUser)
     202                        *pcbUser = cbTmp;
     203                    if (cbPwdUser <= cbUser)
     204                    {
     205                        memcpy(pszUser, pszTmp, cbTmp);
     206                        rc = VINF_SUCCESS;
     207                    }
     208                    else
     209                        rc = VERR_BUFFER_OVERFLOW;
     210                    RTStrFree(pszTmp);
     211                }
     212            }
     213            else
     214                rc = RTErrConvertFromErrno(rc);
     215            RTMemFree(pchBuf);
    194216        }
     217        else
     218            rc = VERR_NO_TMP_MEMORY;
    195219    }
    196220    else
    197         rc = RTErrConvertFromErrno(rc);
    198 
    199     RTMemFree(pbBuf);
     221        rc = VERR_NOT_SUPPORTED;
    200222    return rc;
    201223}
    202224
     225
     226RTR3DECL(int) RTProcQueryUsernameA(RTPROCESS hProcess, char **ppszUser)
     227{
     228    AssertPtrReturn(ppszUser, VERR_INVALID_POINTER);
     229
     230    int rc;
     231    if (   hProcess == NIL_RTPROCESS
     232        || hProcess == RTProcSelf())
     233    {
     234        /*
     235         * Figure a good buffer estimate.
     236         */
     237        int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX);
     238        if (cbPwdMax <= sizeof(_1K))
     239            cbPwdMax = _1K;
     240        else
     241            AssertStmt(cbPwdMax <= 32U*_1M, cbPwdMax = 32U*_1M);
     242        char *pchBuf = (char *)RTMemTmpAllocZ(cbPwdMax);
     243        if (pbBuf)
     244        {
     245            /*
     246             * Get the password file entry.
     247             */
     248            struct passwd  Pwd;
     249            struct passwd *pPwd = NULL;
     250            rc = getpwuid_r(geteuid(), &Pwd, pchBuf, cbPwdMax, &pPwd);
     251            if (!rc)
     252            {
     253                /*
     254                 * Convert the name to UTF-8, assuming that we're getting it in the local codeset.
     255                 */
     256                rc = RTStrCurrentCPToUtf8(ppszUser, pPwd->pw_name);
     257            }
     258            else
     259                rc = RTErrConvertFromErrno(rc);
     260            RTMemFree(pchBuf);
     261        }
     262        else
     263            rc = VERR_NO_TMP_MEMORY;
     264    }
     265    else
     266        rc = VERR_NOT_SUPPORTED;
     267    return rc;
     268}
     269
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette