]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Add NULL checks before accessing logger attribute.
authorVMware, Inc <>
Mon, 21 May 2012 22:24:04 +0000 (15:24 -0700)
committerDmitry Torokhov <dtor@vmware.com>
Tue, 22 May 2012 18:57:12 +0000 (11:57 -0700)
When we login into a VM, a new VMware Tools process starts with the
logged in User account.  If the logged in user is the least prviliged
user (guest account in Windows 8), then the process may not be able to
create a logger handler. GlibUtils_Create*Logger() functions may return
NULL.  In such case, accessing the logger handler may result in a crash.

Modified the code to add proper NULL checks everywhere before
accessing the logger handler.

Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
open-vm-tools/libvmtools/vmtoolsLog.c

index a62f604e2c099383215175caf5d69fe12d074564..d52700ad19a247fbf706d964e227acb6a40c6684 100644 (file)
@@ -163,6 +163,8 @@ VMToolsLogFormat(const gchar *message,
    char *msg = NULL;
    const char *slevel;
    size_t len = 0;
+   gboolean shared = TRUE;
+   gboolean addsTimestamp = TRUE;
 
    if (domain == NULL) {
       domain = gLogDomain;
@@ -205,11 +207,16 @@ VMToolsLogFormat(const gchar *message,
       slevel = "unknown";
    }
 
-   if (!data->logger->addsTimestamp) {
+   if (data->logger != NULL) {
+      shared = data->logger->shared;
+      addsTimestamp = data->logger->addsTimestamp;
+   }
+
+   if (!addsTimestamp) {
       char *tstamp;
 
       tstamp = System_GetTimeAsString();
-      if (data->logger->shared) {
+      if (shared) {
          len = VMToolsAsprintf(&msg, "[%s] [%8s] [%s:%s] %s\n",
                                (tstamp != NULL) ? tstamp : "no time",
                                slevel, gLogDomain, domain, message);
@@ -220,7 +227,7 @@ VMToolsLogFormat(const gchar *message,
       }
       free(tstamp);
    } else {
-      if (data->logger->shared) {
+      if (shared) {
          len = VMToolsAsprintf(&msg, "[%8s] [%s:%s] %s\n",
                                slevel, gLogDomain, domain, message);
       } else {
@@ -303,7 +310,7 @@ VMToolsLog(const gchar *domain,
 
       if (data->logger != NULL) {
          data->logger->logfn(domain, level, msg, data->logger);
-      } else {
+      } else if (gErrorData->logger != NULL) {
          gErrorData->logger->logfn(domain, level, msg, gErrorData->logger);
       }
       g_free(msg);
@@ -395,6 +402,10 @@ VMToolsGetLogHandler(const gchar *handler,
       g_warning("Invalid handler for domain '%s': %s", domain, handler);
    }
 
+   if (NULL == glogger) {
+      g_warning("Failed to create a logger for handler: '%s'", handler);
+   }
+
    logger = g_new0(LogHandler, 1);
    logger->domain = g_strdup(domain);
    logger->logger = glogger;