From: VMware, Inc <> Date: Mon, 21 May 2012 22:24:04 +0000 (-0700) Subject: Add NULL checks before accessing logger attribute. X-Git-Tag: 2012.05.21-724730~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=17b096bf196663ab269b376ea12bf31efee4f933;p=thirdparty%2Fopen-vm-tools.git Add NULL checks before accessing logger attribute. 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 --- diff --git a/open-vm-tools/libvmtools/vmtoolsLog.c b/open-vm-tools/libvmtools/vmtoolsLog.c index a62f604e2..d52700ad1 100644 --- a/open-vm-tools/libvmtools/vmtoolsLog.c +++ b/open-vm-tools/libvmtools/vmtoolsLog.c @@ -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;