Index: /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp	(revision 31036)
+++ /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp	(revision 31037)
@@ -225,10 +225,13 @@
     rc = VERR_NOT_IMPLEMENTED;
 # endif
+
 #elif defined(RT_OS_FREEBSD)
     /** @todo FreeBSD: Port logged on user info retrival. */
     rc = VERR_NOT_IMPLEMENTED;
+
 #elif defined(RT_OS_OS2)
     /** @todo OS/2: Port logged on (LAN/local/whatever) user info retrival. */
     rc = VERR_NOT_IMPLEMENTED;
+
 #else
     /** @todo Add utmpx support? */
@@ -248,10 +251,9 @@
     setutent();
     utmp *ut_user;
-    uint32_t cUtmpEntries = 0;
     uint32_t cListSize = 32;
 
     /* Allocate a first array to hold 32 users max. */
-    char **aUsers = (char**)RTMemAllocZ(cListSize * sizeof(char*));
-    if (aUsers == NULL)
+    char **papszUsers = (char **)RTMemAllocZ(cListSize * sizeof(char *));
+    if (papszUsers == NULL)
         rc = VERR_NO_MEMORY;
 
@@ -260,11 +262,12 @@
            && RT_SUCCESS(rc))
     {
-        VBoxServiceVerbose(1, "bar: %s\n", ut_user->ut_user);
-
-        if (cUtmpEntries > cListSize)
+        VBoxServiceVerbose(4, "VMInfo: Found logged in user \"%s\"\n", ut_user->ut_user);
+
+        if (cUsersInList > cListSize)
         {
             cListSize += 32;
-            aUsers = (char**)RTMemRealloc(aUsers, cListSize * sizeof(char*));
-            AssertPtrBreakStmt(aUsers, rc = VERR_NO_MEMORY);
+            void *pvNew = RTMemRealloc(papszUsers, cListSize * sizeof(char*));
+            AssertPtrBreakStmt(pvNew, cListSize -= 32);
+            papszUsers = (char **)pvNew;
         }
 
@@ -273,31 +276,43 @@
         if (ut_user->ut_type == USER_PROCESS)
         {
-            cUtmpEntries++;
-
             bool fFound = false;
-            for (uint32_t u = 0; u < cUsersInList && !fFound; u++)
-                fFound = (strcmp((const char*)aUsers[u], ut_user->ut_user) == 0) ? true : false;
+            for (uint32_t i = 0; i < cUsersInList && !fFound; i++)
+                fFound = strcmp(papszUsers[i], ut_user->ut_user) == 0;
 
             if (!fFound)
-                rc = RTStrAAppend(&aUsers[cUsersInList++], (const char*)ut_user->ut_user);
-        }
-    }
-
-    /* Build final user list. */
-    for (uint32_t u = 0; u < cUsersInList; u++)
-    {
-        if (u > 0)
-        {
-            rc = RTStrAAppend(&pszUserList, ",");
-            AssertRCBreakStmt(rc, RTStrFree(pszUserList));
-        }
-        rc = RTStrAAppend(&pszUserList, (const char*)aUsers[u]);
-        AssertRCBreakStmt(rc, RTStrFree(pszUserList));
+            {
+                rc = RTStrDupEx(&papszUsers[cUsersInList], (const char *)ut_user->ut_user);
+                if (RT_FAILURE(rc))
+                    break;
+                cUsersInList++;
+            }
+        }
+    }
+
+    /* Calc the string length. */
+    size_t cchUserList = 0;
+    for (uint32_t i = 0; i < cUsersInList; i++)
+        cchUserList += (i != 0) + strlen(papszUsers[i]);
+
+    /* Build the user list. */
+    rc = RTStrAllocEx(&pszUserList, cchUserList + 1);
+    if (RT_SUCCESS(rc))
+    {
+        char *psz = pszUserList;
+        for (uint32_t i = 0; i < cUsersInList; i++)
+        {
+            if (i != 0)
+                *psz++ = ',';
+            size_t cch = strlen(papszUsers[i]);
+            memcpy(psz, papszUsers[i], cch);
+            psz += cch;
+        }
+        *psz = '\0';
     }
 
     /* Cleanup. */
-    for (uint32_t u = 0; u < cUsersInList; u++)
-        RTStrFree(aUsers[u]);
-    RTMemFree(aUsers);
+    for (uint32_t i = 0; i < cUsersInList; i++)
+        RTStrFree(papszUsers[i]);
+    RTMemFree(papszUsers);
 
     endutent(); /* Close utmp file. */
