From 3857c4e1cd3cc0dc8f7f254f16feb9aac936ec79 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Jul 21 2020 15:03:24 +0000 Subject: import open-vm-tools-11.0.5-3.el8 --- diff --git a/.gitignore b/.gitignore index f86a512..737f4e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/open-vm-tools-11.0.0-14549434.tar.gz +SOURCES/open-vm-tools-11.0.5-15389592.tar.gz diff --git a/.open-vm-tools.metadata b/.open-vm-tools.metadata index c4987fa..5b37bd9 100644 --- a/.open-vm-tools.metadata +++ b/.open-vm-tools.metadata @@ -1 +1 @@ -c4b7df8636a02195151a51b46d1af2690cca7e78 SOURCES/open-vm-tools-11.0.0-14549434.tar.gz +502484f4a112954932a7ee32d234e0c85793fcac SOURCES/open-vm-tools-11.0.5-15389592.tar.gz diff --git a/SOURCES/0002-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch b/SOURCES/0002-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch new file mode 100644 index 0000000..e20d8fc --- /dev/null +++ b/SOURCES/0002-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch @@ -0,0 +1,63 @@ +From e1d523d4fdb179e3fd2494d18e813a4e392006e5 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 3 Dec 2019 14:30:47 +0100 +Subject: Address Coverity issues reported in bora/lib/file/file.c. + +RH-Author: Cathy Avery +Message-id: <20191203143050.23065-2-cavery@redhat.com> +Patchwork-id: 92833 +O-Subject: [RHEL8.2 open-vm-tools PATCH 1/4] Address Coverity issues reported in bora/lib/file/file.c. +Bugzilla: 1769881 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Miroslav Rezanina + +commit 5ca2850b60de0f27c3f8c565d7b7e553acc2921f +Author: Oliver Kurth +Date: Tue Aug 27 12:55:37 2019 -0700 + + Address Coverity issues reported in bora/lib/file/file.c. + + Fix a minor memory leak in the function File_ExpandAndCheckDir. + Also add annotations for unchecked return values in functions + GetOldMachineID and File_MoveTree, so that Coverity scans of + open-vm-tools will automatically classify these issues as + "Intentional". These annotations are useful both for internal + use as well as for partners who run Coverity scans on open-vm-tools. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/lib/file/file.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/open-vm-tools/lib/file/file.c b/open-vm-tools/lib/file/file.c +index 7dae12c..774ec41 100644 +--- a/open-vm-tools/lib/file/file.c ++++ b/open-vm-tools/lib/file/file.c +@@ -558,6 +558,7 @@ GetOldMachineID(void) + sizeof hardwareID); + + /* Base 64 encode the binary data to obtain printable characters */ ++ /* coverity[check_return] */ + Base64_Encode(rawMachineID, sizeof rawMachineID, encodedMachineID, + sizeof encodedMachineID, NULL); + +@@ -1437,6 +1438,7 @@ File_MoveTree(const char *srcName, // IN: + * Only clean up if we created the directory. Not attempting to + * clean up partial failures. + */ ++ /* coverity[check_return] */ + File_DeleteDirectoryTree(dstName); + } + } +@@ -2186,6 +2188,7 @@ File_ExpandAndCheckDir(const char *dirName) // IN: + + return edirName; + } ++ free(edirName); + } + + return NULL; +-- +1.8.3.1 + diff --git a/SOURCES/0002-Fix-leaks-in-ListAliases-and-ListMappedAliases.patch b/SOURCES/0002-Fix-leaks-in-ListAliases-and-ListMappedAliases.patch deleted file mode 100644 index c9dd35b..0000000 --- a/SOURCES/0002-Fix-leaks-in-ListAliases-and-ListMappedAliases.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 1128cfce9031891ff0da50131b75771582756ca1 Mon Sep 17 00:00:00 2001 -From: Oliver Kurth -Date: Wed, 2 Oct 2019 17:48:35 -0700 -Subject: Fix leaks in ListAliases and ListMappedAliases. - -The 'record' for each alias was being leaked. ---- - open-vm-tools/services/plugins/vix/vixTools.c | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/open-vm-tools/services/plugins/vix/vixTools.c b/open-vm-tools/services/plugins/vix/vixTools.c -index 44bca5c..c40ad15 100644 ---- a/open-vm-tools/services/plugins/vix/vixTools.c -+++ b/open-vm-tools/services/plugins/vix/vixTools.c -@@ -9762,7 +9762,6 @@ VixToolsListAuthAliases(VixCommandRequestHeader *requestMsg, // IN - char *destPtr; - char *endDestPtr; - char *tmpBuf = NULL; -- char *recordBuf; - size_t recordSize; - char *escapedStr = NULL; - char *escapedStr2 = NULL; -@@ -9822,6 +9821,8 @@ VixToolsListAuthAliases(VixCommandRequestHeader *requestMsg, // IN - destPtr += Str_Sprintf(destPtr, endDestPtr - destPtr, "%s", - VIX_XML_ESCAPED_TAG); - for (i = 0; i < num; i++) { -+ char *recordBuf = NULL; -+ - escapedStr = VixToolsEscapeXMLString(uaList[i].pemCert); - if (escapedStr == NULL) { - err = VIX_E_OUT_OF_MEMORY; -@@ -9895,6 +9896,8 @@ VixToolsListAuthAliases(VixCommandRequestHeader *requestMsg, // IN - Log("%s: ListAuth list results too large, truncating", __FUNCTION__); - goto abort; - } -+ free(recordBuf); -+ recordBuf = NULL; - } - - *result = resultBuffer; -@@ -9960,7 +9963,6 @@ VixToolsListMappedAliases(VixCommandRequestHeader *requestMsg, // IN - char *destPtr; - char *endDestPtr; - char *tmpBuf = NULL; -- char *recordBuf; - char *escapedStr = NULL; - char *escapedStr2 = NULL; - size_t recordSize; -@@ -10014,6 +10016,8 @@ VixToolsListMappedAliases(VixCommandRequestHeader *requestMsg, // IN - destPtr += Str_Sprintf(destPtr, endDestPtr - destPtr, "%s", - VIX_XML_ESCAPED_TAG); - for (i = 0; i < num; i++) { -+ char *recordBuf = NULL; -+ - escapedStr = VixToolsEscapeXMLString(maList[i].pemCert); - if (escapedStr == NULL) { - err = VIX_E_OUT_OF_MEMORY; -@@ -10085,6 +10089,8 @@ VixToolsListMappedAliases(VixCommandRequestHeader *requestMsg, // IN - Log("%s: ListMapped results too large, truncating", __FUNCTION__); - goto abort; - } -+ free(recordBuf); -+ recordBuf = NULL; - } - - *result = resultBuffer; --- -1.8.3.1 - diff --git a/SOURCES/0003-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch b/SOURCES/0003-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch new file mode 100644 index 0000000..c23cf87 --- /dev/null +++ b/SOURCES/0003-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch @@ -0,0 +1,53 @@ +From 9beab82cd41a79babaeef46129a88b9a8d7e120f Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 3 Dec 2019 14:30:48 +0100 +Subject: Fix a potential NULL pointer dereference in the vmbackup plugin. + +RH-Author: Cathy Avery +Message-id: <20191203143050.23065-3-cavery@redhat.com> +Patchwork-id: 92836 +O-Subject: [RHEL8.2 open-vm-tools PATCH 2/4] Fix a potential NULL pointer dereference in the vmbackup plugin. +Bugzilla: 1769881 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Miroslav Rezanina + +commit 0bb6cf83fb6b1f80c99beb11cd47e0db02e252ff +Author: Oliver Kurth +Date: Fri Nov 22 14:52:35 2019 -0800 + + Fix a potential NULL pointer dereference in the vmbackup plugin. + + In some circumtances, VmBackupAsyncCallback might dereference + gBackupState after calling VmBackupDoAbort even though the + latter function can potentially set gBackupState to NULL. Add + a check to prevent the potential NULL pointer dereference. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/services/plugins/vmbackup/stateMachine.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/open-vm-tools/services/plugins/vmbackup/stateMachine.c b/open-vm-tools/services/plugins/vmbackup/stateMachine.c +index 6b42286..5c01a7b 100644 +--- a/open-vm-tools/services/plugins/vmbackup/stateMachine.c ++++ b/open-vm-tools/services/plugins/vmbackup/stateMachine.c +@@ -675,6 +675,15 @@ VmBackupAsyncCallback(void *clientData) + if (gBackupState->rpcState == VMBACKUP_RPC_STATE_ERROR) { + g_warning("Aborting backup operation due to RPC errors."); + VmBackupDoAbort(); ++ ++ /* ++ * Check gBackupState, since the abort could cause a transition to ++ * VMBACKUP_MSTATE_IDLE, in which case the VmBackupState structure ++ * would be freed and gBackupState would be NULL. ++ */ ++ if (gBackupState == NULL) { ++ return FALSE; ++ } + goto exit; + } + } +-- +1.8.3.1 + diff --git a/SOURCES/0004-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch b/SOURCES/0004-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch new file mode 100644 index 0000000..e1bfedd --- /dev/null +++ b/SOURCES/0004-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch @@ -0,0 +1,61 @@ +From 8fbef69f0b3ce6648d594794b945169331ddfa06 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 3 Dec 2019 14:30:49 +0100 +Subject: Address two Coverity-reported issues in hostinfoPosix.c. + +RH-Author: Cathy Avery +Message-id: <20191203143050.23065-4-cavery@redhat.com> +Patchwork-id: 92834 +O-Subject: [RHEL8.2 open-vm-tools PATCH 3/4] Address two Coverity-reported issues in hostinfoPosix.c. +Bugzilla: 1769881 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Miroslav Rezanina + +commit 8a01c912927b5bb8cdbfa57f5e8c92e8cf792bef +Author: Oliver Kurth +Date: Fri Nov 22 14:52:35 2019 -0800 + + Address two Coverity-reported issues in hostinfoPosix.c. + + Rework some code with the intent of making it more straightfoward, + which also eliminates a false positive. + + Check the return value from PosixUnlink and log a warning on error. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/lib/misc/hostinfoPosix.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/open-vm-tools/lib/misc/hostinfoPosix.c b/open-vm-tools/lib/misc/hostinfoPosix.c +index 9d58abe..20cefb5 100644 +--- a/open-vm-tools/lib/misc/hostinfoPosix.c ++++ b/open-vm-tools/lib/misc/hostinfoPosix.c +@@ -1153,10 +1153,7 @@ out: + if (success) { + result[nArgs - 1] = DynBuf_Detach(&b); + } else { +- if (nArgs != 0) { +- Util_FreeStringList(result, nArgs); +- } +- ++ Util_FreeStringList(result, nArgs); + result = NULL; + } + +@@ -2916,7 +2913,10 @@ Hostinfo_Daemonize(const char *path, // IN: NUL-terminated UTF-8 + * with another process attempting to daemonize and unlinking the + * file it created instead. + */ +- Posix_Unlink(pidPath); ++ if (Posix_Unlink(pidPath) != 0) { ++ Warning("%s: Unable to unlink %s: %u\n", ++ __FUNCTION__, pidPath, errno); ++ } + } + + errno = err; +-- +1.8.3.1 + diff --git a/SOURCES/0005-Fix-a-resource-leak-issue-in-deployPkg.patch b/SOURCES/0005-Fix-a-resource-leak-issue-in-deployPkg.patch new file mode 100644 index 0000000..46d6642 --- /dev/null +++ b/SOURCES/0005-Fix-a-resource-leak-issue-in-deployPkg.patch @@ -0,0 +1,90 @@ +From 9357c2476eb74a9862ec07d0ede8d933b734e5cc Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 3 Dec 2019 14:30:50 +0100 +Subject: Fix a resource leak issue in deployPkg + +RH-Author: Cathy Avery +Message-id: <20191203143050.23065-5-cavery@redhat.com> +Patchwork-id: 92837 +O-Subject: [RHEL8.2 open-vm-tools PATCH 4/4] Fix a resource leak issue in deployPkg +Bugzilla: 1769881 +RH-Acked-by: Vitaly Kuznetsov +RH-Acked-by: Miroslav Rezanina + +commit 2ffd2913088505d8249fa342b0ee8e5002a69108 +Author: Oliver Kurth +Date: Fri Nov 22 14:52:35 2019 -0800 + + Fix a resource leak issue in deployPkg + + Variable file going out of scope in error path leaks the storage it + points to. Added fclose before return when malloc failed. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/libDeployPkg/linuxDeployment.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +diff --git a/open-vm-tools/libDeployPkg/linuxDeployment.c b/open-vm-tools/libDeployPkg/linuxDeployment.c +index 1af0893..4f36a00 100644 +--- a/open-vm-tools/libDeployPkg/linuxDeployment.c ++++ b/open-vm-tools/libDeployPkg/linuxDeployment.c +@@ -824,17 +824,18 @@ TransitionState(const char* stateFrom, const char* stateTo) + * + *----------------------------------------------------------------------------- + */ +-static char* +-GetNicsToEnable(const char* dir) ++ ++static char * ++GetNicsToEnable(const char *dir) + { + /* +- * The file nics.txt will list ordinal number of all nics to enable separated by +- * a ",". In current architecture we can have max 4 nics. So we just have to read +- * maximum of 7 characters. This code uses 1024 chars to make sure any future +- * needs are accomodated. ++ * The file nics.txt will list ordinal number of all nics to enable separated ++ * by a ",". In current architecture we can have max 4 nics. So we just have ++ * to read maximum of 7 characters. This code uses 1024 chars to make sure ++ * any future needs are accomodated. + */ + static const unsigned int NICS_SIZE = 1024; +- static const char* nicFile = "/nics.txt"; ++ static const char *nicFile = "/nics.txt"; + + FILE *file; + +@@ -852,7 +853,9 @@ GetNicsToEnable(const char* dir) + if (file) { + ret = malloc(NICS_SIZE); + if (ret == NULL) { +- SetDeployError("Error allocating memory to read nic file '%s'", fileName); ++ SetDeployError("Error allocating memory to read nic file '%s'", ++ fileName); ++ fclose(file); + free(fileName); + return ret; + } +@@ -862,7 +865,8 @@ GetNicsToEnable(const char* dir) + + // Check various error condition + if (ferror(file)) { +- SetDeployError("Error reading nic file '%s'.(%s)", fileName, strerror(errno)); ++ SetDeployError("Error reading nic file '%s'.(%s)", fileName, ++ strerror(errno)); + free(ret); + ret = NULL; + } +@@ -880,6 +884,7 @@ GetNicsToEnable(const char* dir) + return ret; + } + ++ + /** + *------------------------------------------------------------------------------ + * +-- +1.8.3.1 + diff --git a/SOURCES/0006-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch b/SOURCES/0006-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch new file mode 100644 index 0000000..8efdace --- /dev/null +++ b/SOURCES/0006-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch @@ -0,0 +1,60 @@ +From 036b206fac64786447e841c7b57941ecbdf84e77 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Fri, 14 Feb 2020 12:23:09 +0100 +Subject: Rectify a log spew in vmsvc logging (vmware-vmsvc-root.log ) + +RH-Author: Cathy Avery +Message-id: <20200214122309.5769-1-cavery@redhat.com> +Patchwork-id: 93876 +O-Subject: [RHEL8.2 open-vm-tools PATCH] Rectify a log spew in vmsvc logging (vmware-vmsvc-root.log ) +Bugzilla: 1800812 +RH-Acked-by: Eduardo Otubo +RH-Acked-by: Mohammed Gamal + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1800812 +Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=26372468 +Branch: rhel8/master-11.0.0 +Tested: By QE +Upstream Status: stable-11.0.5-suse-bug-1162435 targeted for 11.1.0 + +commit 4ee0bd3c8ead89541ab7d196fb54e940e397420d +Author: Oliver Kurth +Date: Fri, 7 Feb 2020 10:39:38 -0800 + + Rectify a log spew in vmsvc logging (vmware-vmsvc-root.log ) + + When a LSI Logic Parallel SCSI controller sits in PCI bus 0 + (SCSI controller 0), the Linux disk device enumeration does not provide + a "label" file with the controller name. This results in messages like + + "GuestInfoGetDiskDevice: Missing disk device name; VMDK mapping unavailable for "/var/log", fsName: "/dev/sda2" + + repeatedly appearing in the vmsvc logging. The patch converts what previously + was a warning message to a debug message and thus avoids the log spew. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/services/plugins/guestInfo/diskInfo.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/open-vm-tools/services/plugins/guestInfo/diskInfo.c b/open-vm-tools/services/plugins/guestInfo/diskInfo.c +index 878276c..032c092 100644 +--- a/open-vm-tools/services/plugins/guestInfo/diskInfo.c ++++ b/open-vm-tools/services/plugins/guestInfo/diskInfo.c +@@ -846,9 +846,9 @@ GuestInfoGetDiskDevice(const char *fsName, + */ + for (indx = 0; indx < partEntry->diskDevCnt; indx++) { + if (partEntry->diskDevNames[indx][0] == '\0') { +- g_warning("%s: Missing disk device name; VMDK mapping unavailable " +- "for \"%s\", fsName: \"%s\"\n", __FUNCTION__, +- partEntry->name, fsName); ++ g_debug("%s: Missing disk device name; VMDK mapping unavailable " ++ "for \"%s\", fsName: \"%s\"\n", __FUNCTION__, ++ partEntry->name, fsName); + partEntry->diskDevCnt = 0; + free(partEntry->diskDevNames); + partEntry->diskDevNames = NULL; +-- +1.8.3.1 + diff --git a/SOURCES/open-vm-tools.conf b/SOURCES/open-vm-tools.conf new file mode 100644 index 0000000..a517c48 --- /dev/null +++ b/SOURCES/open-vm-tools.conf @@ -0,0 +1 @@ +fuse diff --git a/SOURCES/ovt-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch b/SOURCES/ovt-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch deleted file mode 100644 index dc62ab6..0000000 --- a/SOURCES/ovt-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch +++ /dev/null @@ -1,63 +0,0 @@ -From d01520e206cc1e3ae658e8fb168ff3b4494fc1ef Mon Sep 17 00:00:00 2001 -From: Cathy Avery -Date: Tue, 3 Dec 2019 14:30:47 +0100 -Subject: [PATCH 1/4] Address Coverity issues reported in bora/lib/file/file.c. - -RH-Author: Cathy Avery -Message-id: <20191203143050.23065-2-cavery@redhat.com> -Patchwork-id: 92833 -O-Subject: [RHEL8.2 open-vm-tools PATCH 1/4] Address Coverity issues reported in bora/lib/file/file.c. -Bugzilla: 1769881 -RH-Acked-by: Vitaly Kuznetsov -RH-Acked-by: Miroslav Rezanina - -commit 5ca2850b60de0f27c3f8c565d7b7e553acc2921f -Author: Oliver Kurth -Date: Tue Aug 27 12:55:37 2019 -0700 - - Address Coverity issues reported in bora/lib/file/file.c. - - Fix a minor memory leak in the function File_ExpandAndCheckDir. - Also add annotations for unchecked return values in functions - GetOldMachineID and File_MoveTree, so that Coverity scans of - open-vm-tools will automatically classify these issues as - "Intentional". These annotations are useful both for internal - use as well as for partners who run Coverity scans on open-vm-tools. - -Signed-off-by: Cathy Avery -Signed-off-by: Miroslav Rezanina ---- - open-vm-tools/lib/file/file.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/open-vm-tools/lib/file/file.c b/open-vm-tools/lib/file/file.c -index 7dae12c..774ec41 100644 ---- a/open-vm-tools/lib/file/file.c -+++ b/open-vm-tools/lib/file/file.c -@@ -558,6 +558,7 @@ GetOldMachineID(void) - sizeof hardwareID); - - /* Base 64 encode the binary data to obtain printable characters */ -+ /* coverity[check_return] */ - Base64_Encode(rawMachineID, sizeof rawMachineID, encodedMachineID, - sizeof encodedMachineID, NULL); - -@@ -1437,6 +1438,7 @@ File_MoveTree(const char *srcName, // IN: - * Only clean up if we created the directory. Not attempting to - * clean up partial failures. - */ -+ /* coverity[check_return] */ - File_DeleteDirectoryTree(dstName); - } - } -@@ -2186,6 +2188,7 @@ File_ExpandAndCheckDir(const char *dirName) // IN: - - return edirName; - } -+ free(edirName); - } - - return NULL; --- -1.8.3.1 - diff --git a/SOURCES/ovt-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch b/SOURCES/ovt-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch deleted file mode 100644 index 8735ee3..0000000 --- a/SOURCES/ovt-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 805d013a5604b124177149be4d10384f58eff74b Mon Sep 17 00:00:00 2001 -From: Cathy Avery -Date: Tue, 3 Dec 2019 14:30:49 +0100 -Subject: [PATCH 3/4] Address two Coverity-reported issues in hostinfoPosix.c. - -RH-Author: Cathy Avery -Message-id: <20191203143050.23065-4-cavery@redhat.com> -Patchwork-id: 92834 -O-Subject: [RHEL8.2 open-vm-tools PATCH 3/4] Address two Coverity-reported issues in hostinfoPosix.c. -Bugzilla: 1769881 -RH-Acked-by: Vitaly Kuznetsov -RH-Acked-by: Miroslav Rezanina - -commit 8a01c912927b5bb8cdbfa57f5e8c92e8cf792bef -Author: Oliver Kurth -Date: Fri Nov 22 14:52:35 2019 -0800 - - Address two Coverity-reported issues in hostinfoPosix.c. - - Rework some code with the intent of making it more straightfoward, - which also eliminates a false positive. - - Check the return value from PosixUnlink and log a warning on error. - -Signed-off-by: Cathy Avery -Signed-off-by: Miroslav Rezanina ---- - open-vm-tools/lib/misc/hostinfoPosix.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/open-vm-tools/lib/misc/hostinfoPosix.c b/open-vm-tools/lib/misc/hostinfoPosix.c -index 348a67e..302452e 100644 ---- a/open-vm-tools/lib/misc/hostinfoPosix.c -+++ b/open-vm-tools/lib/misc/hostinfoPosix.c -@@ -1127,10 +1127,7 @@ out: - if (success) { - result[nArgs - 1] = DynBuf_Detach(&b); - } else { -- if (nArgs != 0) { -- Util_FreeStringList(result, nArgs); -- } -- -+ Util_FreeStringList(result, nArgs); - result = NULL; - } - -@@ -2884,7 +2881,10 @@ Hostinfo_Daemonize(const char *path, // IN: NUL-terminated UTF-8 - * with another process attempting to daemonize and unlinking the - * file it created instead. - */ -- Posix_Unlink(pidPath); -+ if (Posix_Unlink(pidPath) != 0) { -+ Warning("%s: Unable to unlink %s: %u\n", -+ __FUNCTION__, pidPath, errno); -+ } - } - - errno = err; --- -1.8.3.1 - diff --git a/SOURCES/ovt-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch b/SOURCES/ovt-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch deleted file mode 100644 index 95e514c..0000000 --- a/SOURCES/ovt-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 6c6daa468c9a1ad1ad4d5bf727008d029d009a50 Mon Sep 17 00:00:00 2001 -From: Cathy Avery -Date: Tue, 3 Dec 2019 14:30:48 +0100 -Subject: [PATCH 2/4] Fix a potential NULL pointer dereference in the vmbackup - plugin. - -RH-Author: Cathy Avery -Message-id: <20191203143050.23065-3-cavery@redhat.com> -Patchwork-id: 92836 -O-Subject: [RHEL8.2 open-vm-tools PATCH 2/4] Fix a potential NULL pointer dereference in the vmbackup plugin. -Bugzilla: 1769881 -RH-Acked-by: Vitaly Kuznetsov -RH-Acked-by: Miroslav Rezanina - -commit 0bb6cf83fb6b1f80c99beb11cd47e0db02e252ff -Author: Oliver Kurth -Date: Fri Nov 22 14:52:35 2019 -0800 - - Fix a potential NULL pointer dereference in the vmbackup plugin. - - In some circumtances, VmBackupAsyncCallback might dereference - gBackupState after calling VmBackupDoAbort even though the - latter function can potentially set gBackupState to NULL. Add - a check to prevent the potential NULL pointer dereference. - -Signed-off-by: Cathy Avery -Signed-off-by: Miroslav Rezanina ---- - open-vm-tools/services/plugins/vmbackup/stateMachine.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/open-vm-tools/services/plugins/vmbackup/stateMachine.c b/open-vm-tools/services/plugins/vmbackup/stateMachine.c -index 6b42286..5c01a7b 100644 ---- a/open-vm-tools/services/plugins/vmbackup/stateMachine.c -+++ b/open-vm-tools/services/plugins/vmbackup/stateMachine.c -@@ -675,6 +675,15 @@ VmBackupAsyncCallback(void *clientData) - if (gBackupState->rpcState == VMBACKUP_RPC_STATE_ERROR) { - g_warning("Aborting backup operation due to RPC errors."); - VmBackupDoAbort(); -+ -+ /* -+ * Check gBackupState, since the abort could cause a transition to -+ * VMBACKUP_MSTATE_IDLE, in which case the VmBackupState structure -+ * would be freed and gBackupState would be NULL. -+ */ -+ if (gBackupState == NULL) { -+ return FALSE; -+ } - goto exit; - } - } --- -1.8.3.1 - diff --git a/SOURCES/ovt-Fix-a-resource-leak-issue-in-deployPkg.patch b/SOURCES/ovt-Fix-a-resource-leak-issue-in-deployPkg.patch deleted file mode 100644 index 0cfccf0..0000000 --- a/SOURCES/ovt-Fix-a-resource-leak-issue-in-deployPkg.patch +++ /dev/null @@ -1,90 +0,0 @@ -From acf9aa0dce71106f3603398a7b6984ff91dd0eda Mon Sep 17 00:00:00 2001 -From: Cathy Avery -Date: Tue, 3 Dec 2019 14:30:50 +0100 -Subject: [PATCH 4/4] Fix a resource leak issue in deployPkg - -RH-Author: Cathy Avery -Message-id: <20191203143050.23065-5-cavery@redhat.com> -Patchwork-id: 92837 -O-Subject: [RHEL8.2 open-vm-tools PATCH 4/4] Fix a resource leak issue in deployPkg -Bugzilla: 1769881 -RH-Acked-by: Vitaly Kuznetsov -RH-Acked-by: Miroslav Rezanina - -commit 2ffd2913088505d8249fa342b0ee8e5002a69108 -Author: Oliver Kurth -Date: Fri Nov 22 14:52:35 2019 -0800 - - Fix a resource leak issue in deployPkg - - Variable file going out of scope in error path leaks the storage it - points to. Added fclose before return when malloc failed. - -Signed-off-by: Cathy Avery -Signed-off-by: Miroslav Rezanina ---- - open-vm-tools/libDeployPkg/linuxDeployment.c | 23 ++++++++++++++--------- - 1 file changed, 14 insertions(+), 9 deletions(-) - -diff --git a/open-vm-tools/libDeployPkg/linuxDeployment.c b/open-vm-tools/libDeployPkg/linuxDeployment.c -index 1af0893..4f36a00 100644 ---- a/open-vm-tools/libDeployPkg/linuxDeployment.c -+++ b/open-vm-tools/libDeployPkg/linuxDeployment.c -@@ -824,17 +824,18 @@ TransitionState(const char* stateFrom, const char* stateTo) - * - *----------------------------------------------------------------------------- - */ --static char* --GetNicsToEnable(const char* dir) -+ -+static char * -+GetNicsToEnable(const char *dir) - { - /* -- * The file nics.txt will list ordinal number of all nics to enable separated by -- * a ",". In current architecture we can have max 4 nics. So we just have to read -- * maximum of 7 characters. This code uses 1024 chars to make sure any future -- * needs are accomodated. -+ * The file nics.txt will list ordinal number of all nics to enable separated -+ * by a ",". In current architecture we can have max 4 nics. So we just have -+ * to read maximum of 7 characters. This code uses 1024 chars to make sure -+ * any future needs are accomodated. - */ - static const unsigned int NICS_SIZE = 1024; -- static const char* nicFile = "/nics.txt"; -+ static const char *nicFile = "/nics.txt"; - - FILE *file; - -@@ -852,7 +853,9 @@ GetNicsToEnable(const char* dir) - if (file) { - ret = malloc(NICS_SIZE); - if (ret == NULL) { -- SetDeployError("Error allocating memory to read nic file '%s'", fileName); -+ SetDeployError("Error allocating memory to read nic file '%s'", -+ fileName); -+ fclose(file); - free(fileName); - return ret; - } -@@ -862,7 +865,8 @@ GetNicsToEnable(const char* dir) - - // Check various error condition - if (ferror(file)) { -- SetDeployError("Error reading nic file '%s'.(%s)", fileName, strerror(errno)); -+ SetDeployError("Error reading nic file '%s'.(%s)", fileName, -+ strerror(errno)); - free(ret); - ret = NULL; - } -@@ -880,6 +884,7 @@ GetNicsToEnable(const char* dir) - return ret; - } - -+ - /** - *------------------------------------------------------------------------------ - * --- -1.8.3.1 - diff --git a/SOURCES/ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch b/SOURCES/ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch new file mode 100644 index 0000000..7610c8d --- /dev/null +++ b/SOURCES/ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch @@ -0,0 +1,43 @@ +From 8914b79dadae708672657e8879832d61c4f2cde1 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 21 Apr 2020 10:38:45 +0200 +Subject: [PATCH 1/3] Fix a trivial memory leak in namespacetool.c. + +RH-Author: Cathy Avery +Message-id: <20200331185439.5940-2-cavery@redhat.com> +Patchwork-id: 94516 +O-Subject: [RHEL-8.2.1 open-vm-tools PATCH 1/2] Fix a trivial memory leak in namespacetool.c. +Bugzilla: 1811729 +RH-Acked-by: Miroslav Rezanina +RH-Acked-by: Vitaly Kuznetsov + +commit 8dbd6e991315bb1b0a18c369c4d2bb165ef1f184 +Author: Oliver Kurth +Date: Tue, 17 Mar 2020 14:36:55 -0700 + + Fix a trivial memory leak in namespacetool.c. + + Fix a memory leak reported by a customer based on their Coverity + scans of open-vm-tools. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/namespacetool/namespacetool.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/open-vm-tools/namespacetool/namespacetool.c b/open-vm-tools/namespacetool/namespacetool.c +index 171e352..bfd003d 100644 +--- a/open-vm-tools/namespacetool/namespacetool.c ++++ b/open-vm-tools/namespacetool/namespacetool.c +@@ -233,6 +233,7 @@ GetValueFromStdin(gchar **data, gsize *length) + *length = 0; + } + g_free(gErr); ++ g_io_channel_unref(iochannel); + return retVal; + } + +-- +1.8.3.1 + diff --git a/SOURCES/ovt-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch b/SOURCES/ovt-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch deleted file mode 100644 index a32ee73..0000000 --- a/SOURCES/ovt-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 6536375aa0f30fe9226ec687d7854d5c2aef5a7d Mon Sep 17 00:00:00 2001 -From: Cathy Avery -Date: Fri, 14 Feb 2020 12:23:09 +0100 -Subject: [PATCH] Rectify a log spew in vmsvc logging (vmware-vmsvc-root.log ) - -RH-Author: Cathy Avery -Message-id: <20200214122309.5769-1-cavery@redhat.com> -Patchwork-id: 93876 -O-Subject: [RHEL8.2 open-vm-tools PATCH] Rectify a log spew in vmsvc logging (vmware-vmsvc-root.log ) -Bugzilla: 1800812 -RH-Acked-by: Eduardo Otubo -RH-Acked-by: Mohammed Gamal - -Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1800812 -Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=26372468 -Branch: rhel8/master-11.0.0 -Tested: By QE -Upstream Status: stable-11.0.5-suse-bug-1162435 targeted for 11.1.0 - -commit 4ee0bd3c8ead89541ab7d196fb54e940e397420d -Author: Oliver Kurth -Date: Fri, 7 Feb 2020 10:39:38 -0800 - - Rectify a log spew in vmsvc logging (vmware-vmsvc-root.log ) - - When a LSI Logic Parallel SCSI controller sits in PCI bus 0 - (SCSI controller 0), the Linux disk device enumeration does not provide - a "label" file with the controller name. This results in messages like - - "GuestInfoGetDiskDevice: Missing disk device name; VMDK mapping unavailable for "/var/log", fsName: "/dev/sda2" - - repeatedly appearing in the vmsvc logging. The patch converts what previously - was a warning message to a debug message and thus avoids the log spew. - -Signed-off-by: Cathy Avery -Signed-off-by: Miroslav Rezanina ---- - open-vm-tools/services/plugins/guestInfo/diskInfo.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/open-vm-tools/services/plugins/guestInfo/diskInfo.c b/open-vm-tools/services/plugins/guestInfo/diskInfo.c -index a8234a4..c974dbd 100644 ---- a/open-vm-tools/services/plugins/guestInfo/diskInfo.c -+++ b/open-vm-tools/services/plugins/guestInfo/diskInfo.c -@@ -837,9 +837,9 @@ GuestInfoGetDiskDevice(const char *fsName, - */ - for (indx = 0; indx < partEntry->diskDevCnt; indx++) { - if (partEntry->diskDevNames[indx][0] == '\0') { -- g_warning("%s: Missing disk device name; VMDK mapping unavailable " -- "for \"%s\", fsName: \"%s\"\n", __FUNCTION__, -- partEntry->name, fsName); -+ g_debug("%s: Missing disk device name; VMDK mapping unavailable " -+ "for \"%s\", fsName: \"%s\"\n", __FUNCTION__, -+ partEntry->name, fsName); - partEntry->diskDevCnt = 0; - free(partEntry->diskDevNames); - partEntry->diskDevNames = NULL; --- -1.8.3.1 - diff --git a/SOURCES/ovt-Update-copyright-to-reflect-previous-change.patch b/SOURCES/ovt-Update-copyright-to-reflect-previous-change.patch new file mode 100644 index 0000000..e8aa1a2 --- /dev/null +++ b/SOURCES/ovt-Update-copyright-to-reflect-previous-change.patch @@ -0,0 +1,39 @@ +From dd9e505722eeb8e2e5e8db6ab903b2bd9480a224 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 21 Apr 2020 10:38:48 +0200 +Subject: [PATCH 2/3] Update copyright to reflect previous change. + +RH-Author: Cathy Avery +Message-id: <20200331185439.5940-3-cavery@redhat.com> +Patchwork-id: 94517 +O-Subject: [RHEL-8.2.1 open-vm-tools PATCH 2/2] Update copyright to reflect previous change. +Bugzilla: 1811729 +RH-Acked-by: Miroslav Rezanina +RH-Acked-by: Vitaly Kuznetsov + +commit 95bb9273cccfd38e0f3299828a0a6cf5a8c30efb +Author: Oliver Kurth +Date: Tue, 17 Mar 2020 14:36:55 -0700 + + Update copyright to reflect previous change. + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/namespacetool/namespacetool.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/open-vm-tools/namespacetool/namespacetool.c b/open-vm-tools/namespacetool/namespacetool.c +index bfd003d..fc38f06 100644 +--- a/open-vm-tools/namespacetool/namespacetool.c ++++ b/open-vm-tools/namespacetool/namespacetool.c +@@ -1,5 +1,5 @@ + /********************************************************* +- * Copyright (C) 2016-2019 VMware, Inc. All rights reserved. ++ * Copyright (C) 2016-2020 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published +-- +1.8.3.1 + diff --git a/SOURCES/ovt-add-appinfo-plugin.patch b/SOURCES/ovt-add-appinfo-plugin.patch new file mode 100644 index 0000000..e94e60f --- /dev/null +++ b/SOURCES/ovt-add-appinfo-plugin.patch @@ -0,0 +1,1608 @@ +From f3408f83b462d0e24739485e93ea8f8d98909ac5 Mon Sep 17 00:00:00 2001 +From: Cathy Avery +Date: Tue, 21 Apr 2020 10:38:54 +0200 +Subject: [PATCH 3/3] add appinfo plugin + +RH-Author: Cathy Avery +Message-id: <20200327120950.5402-1-cavery@redhat.com> +Patchwork-id: 94452 +O-Subject: [RHEL-8.2.1 open-vm-tools PATCH] add appinfo plugin +Bugzilla: 1809751 +RH-Acked-by: Eduardo Otubo +RH-Acked-by: Vitaly Kuznetsov + +commit f1f0b812e7fb9ccf405fcfd48ddb4d65e8532eef +Author: Oliver Kurth +Date: Wed Feb 5 17:21:52 2020 -0800 + + add appinfo plugin + +Signed-off-by: Cathy Avery +Signed-off-by: Miroslav Rezanina +--- + open-vm-tools/configure.ac | 3 +- + open-vm-tools/lib/include/appInfo.h | 41 ++ + open-vm-tools/services/plugins/Makefile.am | 5 +- + open-vm-tools/services/plugins/appInfo/COPYING | 502 ++++++++++++++++++ + open-vm-tools/services/plugins/appInfo/Makefile.am | 37 ++ + open-vm-tools/services/plugins/appInfo/appInfo.c | 572 +++++++++++++++++++++ + .../services/plugins/appInfo/appInfoInt.h | 64 +++ + .../services/plugins/appInfo/appInfoPosix.c | 124 +++++ + .../services/plugins/appInfo/appInfoUtil.c | 143 ++++++ + 9 files changed, 1489 insertions(+), 2 deletions(-) + create mode 100644 open-vm-tools/lib/include/appInfo.h + create mode 100644 open-vm-tools/services/plugins/appInfo/COPYING + create mode 100644 open-vm-tools/services/plugins/appInfo/Makefile.am + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfo.c + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfoInt.h + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfoPosix.c + create mode 100644 open-vm-tools/services/plugins/appInfo/appInfoUtil.c + +diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac +index 9aa95ab..40f8bdc 100644 +--- a/open-vm-tools/configure.ac ++++ b/open-vm-tools/configure.ac +@@ -1,5 +1,5 @@ + ################################################################################ +-### Copyright (C) 2007-2019 VMware, Inc. All rights reserved. ++### Copyright (C) 2007-2020 VMware, Inc. All rights reserved. + ### + ### Configure script for building the VMware OSS Tools. + ### +@@ -1579,6 +1579,7 @@ AC_CONFIG_FILES([ \ + services/Makefile \ + services/vmtoolsd/Makefile \ + services/plugins/Makefile \ ++ services/plugins/appInfo/Makefile \ + services/plugins/desktopEvents/Makefile \ + services/plugins/dndcp/Makefile \ + services/plugins/guestInfo/Makefile \ +diff --git a/open-vm-tools/lib/include/appInfo.h b/open-vm-tools/lib/include/appInfo.h +new file mode 100644 +index 0000000..122d08e +--- /dev/null ++++ b/open-vm-tools/lib/include/appInfo.h +@@ -0,0 +1,41 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published ++ * by the Free Software Foundation version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++#ifndef _APPINFO_H_ ++#define _APPINFO_H_ ++ ++/** ++ * @file appInfo.h ++ * ++ * Declares few constants for the appInfo plugin. ++ */ ++ ++/** ++ * The guest Variable name for the application information. ++ */ ++#define APP_INFO_GUESTVAR_KEY "appInfo" ++ ++#define APP_INFO_VERSION_1 1 ++#define APP_INFO_KEY_VERSION "version" ++#define APP_INFO_KEY_UPDATE_COUNTER "updateCounter" ++#define APP_INFO_KEY_PUBLISHTIME "publishTime" ++#define APP_INFO_KEY_APPS "applications" ++#define APP_INFO_KEY_APP_NAME "a" ++#define APP_INFO_KEY_APP_VERSION "v" ++ ++#endif /* _APPINFO_H_ */ +diff --git a/open-vm-tools/services/plugins/Makefile.am b/open-vm-tools/services/plugins/Makefile.am +index 7ab22ee..e010ab1 100644 +--- a/open-vm-tools/services/plugins/Makefile.am ++++ b/open-vm-tools/services/plugins/Makefile.am +@@ -1,5 +1,5 @@ + ################################################################################ +-### Copyright (C) 2009-2019 VMware, Inc. All rights reserved. ++### Copyright (C) 2009-2020 VMware, Inc. All rights reserved. + ### + ### This program is free software; you can redistribute it and/or modify + ### it under the terms of version 2 of the GNU General Public License as +@@ -16,6 +16,9 @@ + ################################################################################ + + SUBDIRS = ++if LINUX ++SUBDIRS += appInfo ++endif + if HAVE_X11 + SUBDIRS += desktopEvents + endif +diff --git a/open-vm-tools/services/plugins/appInfo/COPYING b/open-vm-tools/services/plugins/appInfo/COPYING +new file mode 100644 +index 0000000..9c6a6cc +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/COPYING +@@ -0,0 +1,502 @@ ++ GNU LESSER GENERAL PUBLIC LICENSE ++ Version 2.1, February 1999 ++ ++ Copyright (C) 1991, 1999 Free Software Foundation, Inc. ++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++[This is the first released version of the Lesser GPL. It also counts ++ as the successor of the GNU Library Public License, version 2, hence ++ the version number 2.1.] ++ ++ Preamble ++ ++ The licenses for most software are designed to take away your ++freedom to share and change it. By contrast, the GNU General Public ++Licenses are intended to guarantee your freedom to share and change ++free software--to make sure the software is free for all its users. ++ ++ This license, the Lesser General Public License, applies to some ++specially designated software packages--typically libraries--of the ++Free Software Foundation and other authors who decide to use it. You ++can use it too, but we suggest you first think carefully about whether ++this license or the ordinary General Public License is the better ++strategy to use in any particular case, based on the explanations below. ++ ++ When we speak of free software, we are referring to freedom of use, ++not price. Our General Public Licenses are designed to make sure that ++you have the freedom to distribute copies of free software (and charge ++for this service if you wish); that you receive source code or can get ++it if you want it; that you can change the software and use pieces of ++it in new free programs; and that you are informed that you can do ++these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++distributors to deny you these rights or to ask you to surrender these ++rights. These restrictions translate to certain responsibilities for ++you if you distribute copies of the library or if you modify it. ++ ++ For example, if you distribute copies of the library, whether gratis ++or for a fee, you must give the recipients all the rights that we gave ++you. You must make sure that they, too, receive or can get the source ++code. If you link other code with the library, you must provide ++complete object files to the recipients, so that they can relink them ++with the library after making changes to the library and recompiling ++it. And you must show them these terms so they know their rights. ++ ++ We protect your rights with a two-step method: (1) we copyright the ++library, and (2) we offer you this license, which gives you legal ++permission to copy, distribute and/or modify the library. ++ ++ To protect each distributor, we want to make it very clear that ++there is no warranty for the free library. Also, if the library is ++modified by someone else and passed on, the recipients should know ++that what they have is not the original version, so that the original ++author's reputation will not be affected by problems that might be ++introduced by others. ++ ++ Finally, software patents pose a constant threat to the existence of ++any free program. We wish to make sure that a company cannot ++effectively restrict the users of a free program by obtaining a ++restrictive license from a patent holder. Therefore, we insist that ++any patent license obtained for a version of the library must be ++consistent with the full freedom of use specified in this license. ++ ++ Most GNU software, including some libraries, is covered by the ++ordinary GNU General Public License. This license, the GNU Lesser ++General Public License, applies to certain designated libraries, and ++is quite different from the ordinary General Public License. We use ++this license for certain libraries in order to permit linking those ++libraries into non-free programs. ++ ++ When a program is linked with a library, whether statically or using ++a shared library, the combination of the two is legally speaking a ++combined work, a derivative of the original library. The ordinary ++General Public License therefore permits such linking only if the ++entire combination fits its criteria of freedom. The Lesser General ++Public License permits more lax criteria for linking other code with ++the library. ++ ++ We call this license the "Lesser" General Public License because it ++does Less to protect the user's freedom than the ordinary General ++Public License. It also provides other free software developers Less ++of an advantage over competing non-free programs. These disadvantages ++are the reason we use the ordinary General Public License for many ++libraries. However, the Lesser license provides advantages in certain ++special circumstances. ++ ++ For example, on rare occasions, there may be a special need to ++encourage the widest possible use of a certain library, so that it becomes ++a de-facto standard. To achieve this, non-free programs must be ++allowed to use the library. A more frequent case is that a free ++library does the same job as widely used non-free libraries. In this ++case, there is little to gain by limiting the free library to free ++software only, so we use the Lesser General Public License. ++ ++ In other cases, permission to use a particular library in non-free ++programs enables a greater number of people to use a large body of ++free software. For example, permission to use the GNU C Library in ++non-free programs enables many more people to use the whole GNU ++operating system, as well as its variant, the GNU/Linux operating ++system. ++ ++ Although the Lesser General Public License is Less protective of the ++users' freedom, it does ensure that the user of a program that is ++linked with the Library has the freedom and the wherewithal to run ++that program using a modified version of the Library. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. Pay close attention to the difference between a ++"work based on the library" and a "work that uses the library". The ++former contains code derived from the library, whereas the latter must ++be combined with the library in order to run. ++ ++ GNU LESSER GENERAL PUBLIC LICENSE ++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ++ ++ 0. This License Agreement applies to any software library or other ++program which contains a notice placed by the copyright holder or ++other authorized party saying it may be distributed under the terms of ++this Lesser General Public License (also called "this License"). ++Each licensee is addressed as "you". ++ ++ A "library" means a collection of software functions and/or data ++prepared so as to be conveniently linked with application programs ++(which use some of those functions and data) to form executables. ++ ++ The "Library", below, refers to any such software library or work ++which has been distributed under these terms. A "work based on the ++Library" means either the Library or any derivative work under ++copyright law: that is to say, a work containing the Library or a ++portion of it, either verbatim or with modifications and/or translated ++straightforwardly into another language. (Hereinafter, translation is ++included without limitation in the term "modification".) ++ ++ "Source code" for a work means the preferred form of the work for ++making modifications to it. For a library, complete source code means ++all the source code for all modules it contains, plus any associated ++interface definition files, plus the scripts used to control compilation ++and installation of the library. ++ ++ Activities other than copying, distribution and modification are not ++covered by this License; they are outside its scope. The act of ++running a program using the Library is not restricted, and output from ++such a program is covered only if its contents constitute a work based ++on the Library (independent of the use of the Library in a tool for ++writing it). Whether that is true depends on what the Library does ++and what the program that uses the Library does. ++ ++ 1. You may copy and distribute verbatim copies of the Library's ++complete source code as you receive it, in any medium, provided that ++you conspicuously and appropriately publish on each copy an ++appropriate copyright notice and disclaimer of warranty; keep intact ++all the notices that refer to this License and to the absence of any ++warranty; and distribute a copy of this License along with the ++Library. ++ ++ You may charge a fee for the physical act of transferring a copy, ++and you may at your option offer warranty protection in exchange for a ++fee. ++ ++ 2. You may modify your copy or copies of the Library or any portion ++of it, thus forming a work based on the Library, and copy and ++distribute such modifications or work under the terms of Section 1 ++above, provided that you also meet all of these conditions: ++ ++ a) The modified work must itself be a software library. ++ ++ b) You must cause the files modified to carry prominent notices ++ stating that you changed the files and the date of any change. ++ ++ c) You must cause the whole of the work to be licensed at no ++ charge to all third parties under the terms of this License. ++ ++ d) If a facility in the modified Library refers to a function or a ++ table of data to be supplied by an application program that uses ++ the facility, other than as an argument passed when the facility ++ is invoked, then you must make a good faith effort to ensure that, ++ in the event an application does not supply such function or ++ table, the facility still operates, and performs whatever part of ++ its purpose remains meaningful. ++ ++ (For example, a function in a library to compute square roots has ++ a purpose that is entirely well-defined independent of the ++ application. Therefore, Subsection 2d requires that any ++ application-supplied function or table used by this function must ++ be optional: if the application does not supply it, the square ++ root function must still compute square roots.) ++ ++These requirements apply to the modified work as a whole. If ++identifiable sections of that work are not derived from the Library, ++and can be reasonably considered independent and separate works in ++themselves, then this License, and its terms, do not apply to those ++sections when you distribute them as separate works. But when you ++distribute the same sections as part of a whole which is a work based ++on the Library, the distribution of the whole must be on the terms of ++this License, whose permissions for other licensees extend to the ++entire whole, and thus to each and every part regardless of who wrote ++it. ++ ++Thus, it is not the intent of this section to claim rights or contest ++your rights to work written entirely by you; rather, the intent is to ++exercise the right to control the distribution of derivative or ++collective works based on the Library. ++ ++In addition, mere aggregation of another work not based on the Library ++with the Library (or with a work based on the Library) on a volume of ++a storage or distribution medium does not bring the other work under ++the scope of this License. ++ ++ 3. You may opt to apply the terms of the ordinary GNU General Public ++License instead of this License to a given copy of the Library. To do ++this, you must alter all the notices that refer to this License, so ++that they refer to the ordinary GNU General Public License, version 2, ++instead of to this License. (If a newer version than version 2 of the ++ordinary GNU General Public License has appeared, then you can specify ++that version instead if you wish.) Do not make any other change in ++these notices. ++ ++ Once this change is made in a given copy, it is irreversible for ++that copy, so the ordinary GNU General Public License applies to all ++subsequent copies and derivative works made from that copy. ++ ++ This option is useful when you wish to copy part of the code of ++the Library into a program that is not a library. ++ ++ 4. You may copy and distribute the Library (or a portion or ++derivative of it, under Section 2) in object code or executable form ++under the terms of Sections 1 and 2 above provided that you accompany ++it with the complete corresponding machine-readable source code, which ++must be distributed under the terms of Sections 1 and 2 above on a ++medium customarily used for software interchange. ++ ++ If distribution of object code is made by offering access to copy ++from a designated place, then offering equivalent access to copy the ++source code from the same place satisfies the requirement to ++distribute the source code, even though third parties are not ++compelled to copy the source along with the object code. ++ ++ 5. A program that contains no derivative of any portion of the ++Library, but is designed to work with the Library by being compiled or ++linked with it, is called a "work that uses the Library". Such a ++work, in isolation, is not a derivative work of the Library, and ++therefore falls outside the scope of this License. ++ ++ However, linking a "work that uses the Library" with the Library ++creates an executable that is a derivative of the Library (because it ++contains portions of the Library), rather than a "work that uses the ++library". The executable is therefore covered by this License. ++Section 6 states terms for distribution of such executables. ++ ++ When a "work that uses the Library" uses material from a header file ++that is part of the Library, the object code for the work may be a ++derivative work of the Library even though the source code is not. ++Whether this is true is especially significant if the work can be ++linked without the Library, or if the work is itself a library. The ++threshold for this to be true is not precisely defined by law. ++ ++ If such an object file uses only numerical parameters, data ++structure layouts and accessors, and small macros and small inline ++functions (ten lines or less in length), then the use of the object ++file is unrestricted, regardless of whether it is legally a derivative ++work. (Executables containing this object code plus portions of the ++Library will still fall under Section 6.) ++ ++ Otherwise, if the work is a derivative of the Library, you may ++distribute the object code for the work under the terms of Section 6. ++Any executables containing that work also fall under Section 6, ++whether or not they are linked directly with the Library itself. ++ ++ 6. As an exception to the Sections above, you may also combine or ++link a "work that uses the Library" with the Library to produce a ++work containing portions of the Library, and distribute that work ++under terms of your choice, provided that the terms permit ++modification of the work for the customer's own use and reverse ++engineering for debugging such modifications. ++ ++ You must give prominent notice with each copy of the work that the ++Library is used in it and that the Library and its use are covered by ++this License. You must supply a copy of this License. If the work ++during execution displays copyright notices, you must include the ++copyright notice for the Library among them, as well as a reference ++directing the user to the copy of this License. Also, you must do one ++of these things: ++ ++ a) Accompany the work with the complete corresponding ++ machine-readable source code for the Library including whatever ++ changes were used in the work (which must be distributed under ++ Sections 1 and 2 above); and, if the work is an executable linked ++ with the Library, with the complete machine-readable "work that ++ uses the Library", as object code and/or source code, so that the ++ user can modify the Library and then relink to produce a modified ++ executable containing the modified Library. (It is understood ++ that the user who changes the contents of definitions files in the ++ Library will not necessarily be able to recompile the application ++ to use the modified definitions.) ++ ++ b) Use a suitable shared library mechanism for linking with the ++ Library. A suitable mechanism is one that (1) uses at run time a ++ copy of the library already present on the user's computer system, ++ rather than copying library functions into the executable, and (2) ++ will operate properly with a modified version of the library, if ++ the user installs one, as long as the modified version is ++ interface-compatible with the version that the work was made with. ++ ++ c) Accompany the work with a written offer, valid for at ++ least three years, to give the same user the materials ++ specified in Subsection 6a, above, for a charge no more ++ than the cost of performing this distribution. ++ ++ d) If distribution of the work is made by offering access to copy ++ from a designated place, offer equivalent access to copy the above ++ specified materials from the same place. ++ ++ e) Verify that the user has already received a copy of these ++ materials or that you have already sent this user a copy. ++ ++ For an executable, the required form of the "work that uses the ++Library" must include any data and utility programs needed for ++reproducing the executable from it. However, as a special exception, ++the materials to be distributed need not include anything that is ++normally distributed (in either source or binary form) with the major ++components (compiler, kernel, and so on) of the operating system on ++which the executable runs, unless that component itself accompanies ++the executable. ++ ++ It may happen that this requirement contradicts the license ++restrictions of other proprietary libraries that do not normally ++accompany the operating system. Such a contradiction means you cannot ++use both them and the Library together in an executable that you ++distribute. ++ ++ 7. You may place library facilities that are a work based on the ++Library side-by-side in a single library together with other library ++facilities not covered by this License, and distribute such a combined ++library, provided that the separate distribution of the work based on ++the Library and of the other library facilities is otherwise ++permitted, and provided that you do these two things: ++ ++ a) Accompany the combined library with a copy of the same work ++ based on the Library, uncombined with any other library ++ facilities. This must be distributed under the terms of the ++ Sections above. ++ ++ b) Give prominent notice with the combined library of the fact ++ that part of it is a work based on the Library, and explaining ++ where to find the accompanying uncombined form of the same work. ++ ++ 8. You may not copy, modify, sublicense, link with, or distribute ++the Library except as expressly provided under this License. Any ++attempt otherwise to copy, modify, sublicense, link with, or ++distribute the Library is void, and will automatically terminate your ++rights under this License. However, parties who have received copies, ++or rights, from you under this License will not have their licenses ++terminated so long as such parties remain in full compliance. ++ ++ 9. You are not required to accept this License, since you have not ++signed it. However, nothing else grants you permission to modify or ++distribute the Library or its derivative works. These actions are ++prohibited by law if you do not accept this License. Therefore, by ++modifying or distributing the Library (or any work based on the ++Library), you indicate your acceptance of this License to do so, and ++all its terms and conditions for copying, distributing or modifying ++the Library or works based on it. ++ ++ 10. Each time you redistribute the Library (or any work based on the ++Library), the recipient automatically receives a license from the ++original licensor to copy, distribute, link with or modify the Library ++subject to these terms and conditions. You may not impose any further ++restrictions on the recipients' exercise of the rights granted herein. ++You are not responsible for enforcing compliance by third parties with ++this License. ++ ++ 11. If, as a consequence of a court judgment or allegation of patent ++infringement or for any other reason (not limited to patent issues), ++conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot ++distribute so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you ++may not distribute the Library at all. For example, if a patent ++license would not permit royalty-free redistribution of the Library by ++all those who receive copies directly or indirectly through you, then ++the only way you could satisfy both it and this License would be to ++refrain entirely from distribution of the Library. ++ ++If any portion of this section is held invalid or unenforceable under any ++particular circumstance, the balance of the section is intended to apply, ++and the section as a whole is intended to apply in other circumstances. ++ ++It is not the purpose of this section to induce you to infringe any ++patents or other property right claims or to contest validity of any ++such claims; this section has the sole purpose of protecting the ++integrity of the free software distribution system which is ++implemented by public license practices. Many people have made ++generous contributions to the wide range of software distributed ++through that system in reliance on consistent application of that ++system; it is up to the author/donor to decide if he or she is willing ++to distribute software through any other system and a licensee cannot ++impose that choice. ++ ++This section is intended to make thoroughly clear what is believed to ++be a consequence of the rest of this License. ++ ++ 12. If the distribution and/or use of the Library is restricted in ++certain countries either by patents or by copyrighted interfaces, the ++original copyright holder who places the Library under this License may add ++an explicit geographical distribution limitation excluding those countries, ++so that distribution is permitted only in or among countries not thus ++excluded. In such case, this License incorporates the limitation as if ++written in the body of this License. ++ ++ 13. The Free Software Foundation may publish revised and/or new ++versions of the Lesser General Public License from time to time. ++Such new versions will be similar in spirit to the present version, ++but may differ in detail to address new problems or concerns. ++ ++Each version is given a distinguishing version number. If the Library ++specifies a version number of this License which applies to it and ++"any later version", you have the option of following the terms and ++conditions either of that version or of any later version published by ++the Free Software Foundation. If the Library does not specify a ++license version number, you may choose any version ever published by ++the Free Software Foundation. ++ ++ 14. If you wish to incorporate parts of the Library into other free ++programs whose distribution conditions are incompatible with these, ++write to the author to ask for permission. For software which is ++copyrighted by the Free Software Foundation, write to the Free ++Software Foundation; we sometimes make exceptions for this. Our ++decision will be guided by the two goals of preserving the free status ++of all derivatives of our free software and of promoting the sharing ++and reuse of software generally. ++ ++ NO WARRANTY ++ ++ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO ++WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. ++EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR ++OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY ++KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE ++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE ++LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME ++THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN ++WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY ++AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU ++FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR ++CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE ++LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING ++RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A ++FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF ++SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH ++DAMAGES. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Libraries ++ ++ If you develop a new library, and you want it to be of the greatest ++possible use to the public, we recommend making it free software that ++everyone can redistribute and change. You can do so by permitting ++redistribution under these terms (or, alternatively, under the terms of the ++ordinary General Public License). ++ ++ To apply these terms, attach the following notices to the library. It is ++safest to attach them to the start of each source file to most effectively ++convey the exclusion of warranty; and each file should have at least the ++"copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ This library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++You should also get your employer (if you work as a programmer) or your ++school, if any, to sign a "copyright disclaimer" for the library, if ++necessary. Here is a sample; alter the names: ++ ++ Yoyodyne, Inc., hereby disclaims all copyright interest in the ++ library `Frob' (a library for tweaking knobs) written by James Random Hacker. ++ ++ , 1 April 1990 ++ Ty Coon, President of Vice ++ ++That's all there is to it! +diff --git a/open-vm-tools/services/plugins/appInfo/Makefile.am b/open-vm-tools/services/plugins/appInfo/Makefile.am +new file mode 100644 +index 0000000..fd1e466 +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/Makefile.am +@@ -0,0 +1,37 @@ ++################################################################################ ++### Copyright (C) 2020 VMware, Inc. All rights reserved. ++### ++### This program is free software; you can redistribute it and/or modify ++### it under the terms of version 2 of the GNU General Public License as ++### published by the Free Software Foundation. ++### ++### This program is distributed in the hope that it will be useful, ++### but WITHOUT ANY WARRANTY; without even the implied warranty of ++### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++### GNU General Public License for more details. ++### ++### You should have received a copy of the GNU General Public License ++### along with this program; if not, write to the Free Software ++### Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++################################################################################ ++ ++SUBDIRS = ++ ++plugindir = @VMSVC_PLUGIN_INSTALLDIR@ ++plugin_LTLIBRARIES = libappInfo.la ++ ++libappInfo_la_CPPFLAGS = ++libappInfo_la_CPPFLAGS += @PLUGIN_CPPFLAGS@ ++ ++libappInfo_la_LDFLAGS = ++libappInfo_la_LDFLAGS += @PLUGIN_LDFLAGS@ ++ ++libappInfo_la_LIBADD = ++libappInfo_la_LIBADD += @VMTOOLS_LIBS@ ++libappInfo_la_LIBADD += @GOBJECT_LIBS@ ++ ++libappInfo_la_SOURCES = ++libappInfo_la_SOURCES += appInfo.c ++libappInfo_la_SOURCES += appInfoInt.h ++libappInfo_la_SOURCES += appInfoUtil.c ++libappInfo_la_SOURCES += appInfoPosix.c +diff --git a/open-vm-tools/services/plugins/appInfo/appInfo.c b/open-vm-tools/services/plugins/appInfo/appInfo.c +new file mode 100644 +index 0000000..b0db092 +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfo.c +@@ -0,0 +1,572 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published ++ * by the Free Software Foundation version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++/* ++ * appInfo.c -- ++ * ++ * Captures the information about running applications inside the guest ++ * and publishes it to a guest variable. ++ */ ++ ++ ++#include ++#include ++#include ++ ++#include "appInfo.h" ++#include "appInfoInt.h" ++#include "vmware.h" ++#include "conf.h" ++#include "dynbuf.h" ++#include "escape.h" ++#include "str.h" ++#include "util.h" ++#include "vm_atomic.h" ++#include "vmcheck.h" ++#include "vmware/tools/log.h" ++#include "vmware/tools/threadPool.h" ++#include "vmware/tools/utils.h" ++ ++#if !defined(__APPLE__) ++#include "vm_version.h" ++#include "embed_version.h" ++#include "vmtoolsd_version.h" ++VM_EMBED_VERSION(VMTOOLSD_VERSION_STRING); ++#endif ++ ++#if defined(_WIN32) ++#include "codeset.h" ++#endif ++ ++/** ++ * Maximum size of the packet size that appInfo plugin should send ++ * to the VMX. Currently, this is set to 62 KB. ++ */ ++#define MAX_APP_INFO_SIZE (62 * 1024) ++ ++/** ++ * Default poll interval for appInfo is 30m ++ */ ++#define APP_INFO_POLL_INTERVAL (30 * 60) ++ ++/** ++ * Default value for CONFNAME_APPINFO_DISABLED setting in ++ * tools configuration file. ++ * ++ * FALSE will enable the plugin. TRUE will disable the plugin. ++ */ ++#define APP_INFO_CONF_DEFAULT_DISABLED_VALUE FALSE ++ ++/** ++ * Defines the current poll interval (in seconds). ++ * ++ * This value is controlled by the appinfo.poll-interval config file option. ++ */ ++int appInfoPollInterval = 0; ++ ++/** ++ * AppInfo gather loop timeout source. ++ */ ++static GSource *appInfoTimeoutSource = NULL; ++ ++ ++/* ++ ***************************************************************************** ++ * EscapeJSONString -- ++ * ++ * Escapes a string to be included in JSON content. ++ * ++ * @param[in] str The string to be escaped. ++ * ++ * @retval Pointer to a heap-allocated memory. This holds the escaped content ++ * of the string passed by the caller. ++ * ++ ***************************************************************************** ++ */ ++ ++static char * ++EscapeJSONString(const char *str) // IN ++{ ++ /* ++ * Escape '"' and '\' characters in the JSON string. ++ */ ++ ++ static const int bytesToEscape[] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // " ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, // '\' ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ }; ++ ++ return Escape_DoString("\\u00", bytesToEscape, str, strlen(str), ++ NULL); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * SetGuestInfo -- ++ * ++ * Sends a simple key-value update request to the VMX. ++ * ++ * @param[in] ctx Application context. ++ * @param[in] key Key sent to the VMX ++ * @param[in] value GuestInfo data sent to the VMX ++ * ++ * @retval TRUE RPCI succeeded. ++ * @retval FALSE RPCI failed. ++ * ++ ***************************************************************************** ++ */ ++ ++static Bool ++SetGuestInfo(ToolsAppCtx *ctx, // IN: ++ const char *guestVariableName, // IN: ++ const char *value) // IN: ++{ ++ Bool status; ++ char *reply = NULL; ++ gchar *msg; ++ size_t replyLen; ++ ++ ASSERT(guestVariableName); ++ ASSERT(value); ++ ++ msg = g_strdup_printf("info-set guestinfo.%s %s", ++ guestVariableName, ++ value); ++ ++ status = RpcChannel_Send(ctx->rpc, ++ msg, ++ strlen(msg) + 1, ++ &reply, ++ &replyLen); ++ g_free(msg); ++ ++ if (!status) { ++ g_warning("Error sending RPC message: %s\n", reply ? reply : "NULL"); ++ vm_free(reply); ++ return FALSE; ++ } else { ++ g_info("Successfully sent the app information.\n"); ++ } ++ ++ status = (*reply == '\0'); ++ vm_free(reply); ++ return status; ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoGatherTask -- ++ * ++ * Collects all the desired application related information and updates VMX. ++ * ++ * @param[in] data The application context. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++AppInfoGatherTask(ToolsAppCtx *ctx, ++ void *data) ++{ ++ DynBuf dynBuffer; ++ char tmpBuf[1024]; ++ int len; ++ gchar *tstamp = NULL; ++ char *escapedCmd = NULL; ++ char *escapedVersion = NULL; ++ GSList *appList = NULL; ++ GSList *appNode; ++ static Atomic_uint64 updateCounter = {0}; ++ uint64 counter = (uint64) Atomic_ReadInc64(&updateCounter) + 1; ++ ++ static char headerFmt[] = "{\n" ++ "\"" APP_INFO_KEY_VERSION "\":\"%d\", \n" ++ "\"" APP_INFO_KEY_UPDATE_COUNTER "\":\"%"FMT64"d\", \n" ++ "\"" APP_INFO_KEY_PUBLISHTIME "\":\"%s\", \n" ++ "\"" APP_INFO_KEY_APPS "\":["; ++ static char jsonPerAppFmt[] = ++ "%s\n" // , for all the elements after the first one ++ "{" ++ "\"" APP_INFO_KEY_APP_NAME "\":\"%s\"" ++ "," ++ "\"" APP_INFO_KEY_APP_VERSION "\":\"%s\"" ++ "}"; ++ static char jsonSuffix[] = "]}"; ++ ++ DynBuf_Init(&dynBuffer); ++ ++ tstamp = VMTools_GetTimeAsString(); ++ ++ len = Str_Snprintf(tmpBuf, sizeof tmpBuf, headerFmt, ++ APP_INFO_VERSION_1, ++ counter, ++ tstamp != NULL ? tstamp : ""); ++ ++ if (len < 0) { ++ g_warning("Insufficient space for the header.\n"); ++ goto abort; ++ } ++ ++ DynBuf_Append(&dynBuffer, tmpBuf, len); ++ ++ appList = AppInfo_SortAppList(AppInfo_GetAppList()); ++ ++ for (appNode = appList; appNode != NULL; appNode = appNode->next) { ++ size_t currentBufferSize = DynBuf_GetSize(&dynBuffer); ++ AppInfo *appInfo = (AppInfo *) appNode->data; ++ ++ if (appInfo->appName == NULL || ++ appInfo->version == NULL) { ++ goto next_entry; ++ } ++ ++ escapedCmd = EscapeJSONString(appInfo->appName); ++ ++ if (NULL == escapedCmd) { ++ g_warning("Failed to escape the content of cmdName\n"); ++ goto abort; ++ } ++ ++ escapedVersion = EscapeJSONString(appInfo->version); ++ if (NULL == escapedVersion) { ++ g_warning("Failed to escape the content of version information.\n"); ++ goto abort; ++ } ++ ++ if (appNode == appList) { ++ len = Str_Snprintf(tmpBuf, sizeof tmpBuf, jsonPerAppFmt, ++ "", escapedCmd, escapedVersion); ++ } else { ++ /* ++ * If this is not the first element, then add ',' at the beginning. ++ */ ++ len = Str_Snprintf(tmpBuf, sizeof tmpBuf, jsonPerAppFmt, ++ ",", escapedCmd, escapedVersion); ++ } ++ ++ if (len < 0) { ++ g_warning("Insufficient space for the application information.\n"); ++ goto next_entry; ++ } ++ ++ if (currentBufferSize + len + sizeof jsonSuffix > MAX_APP_INFO_SIZE) { ++ g_warning("Exceeded the max info packet size." ++ " Truncating the rest of the applications.\n"); ++ break; ++ } ++ ++ DynBuf_Append(&dynBuffer, tmpBuf, len); ++ ++next_entry: ++ free(escapedCmd); ++ escapedCmd = NULL; ++ free(escapedVersion); ++ escapedVersion = NULL; ++ } ++ ++ DynBuf_Append(&dynBuffer, jsonSuffix, sizeof jsonSuffix - 1); ++ SetGuestInfo(ctx, APP_INFO_GUESTVAR_KEY, DynBuf_GetString(&dynBuffer)); ++ ++abort: ++ free(escapedCmd); ++ free(escapedVersion); ++ AppInfo_DestroyAppList(appList); ++ g_free(tstamp); ++ DynBuf_Destroy(&dynBuffer); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoGather -- ++ * ++ * Creates a new thread that collects all the desired application related ++ * information and udates the VMX. ++ * ++ * @param[in] data The application context. ++ * ++ * @return TRUE to indicate that the timer should be rescheduled. ++ * ++ ***************************************************************************** ++ */ ++ ++static gboolean ++AppInfoGather(gpointer data) ++{ ++ ToolsAppCtx *ctx = data; ++ if (!ToolsCorePool_SubmitTask(ctx, AppInfoGatherTask, NULL, NULL)) { ++ g_warning("%s: failed to start information gather thread\n", ++ __FUNCTION__); ++ } ++ ++ return TRUE; ++} ++ ++ ++/* ++ ***************************************************************************** ++ * TweakGatherLoop -- ++ * ++ * @brief Start, stop, reconfigure a GuestInfoGather poll loop. ++ * ++ * This function is responsible for creating, manipulating, and resetting a ++ * AppDiscoveryGather loop timeout source. ++ * ++ * @param[in] ctx The app context. ++ * @param[in] enable Whether to enable the gather loop. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++TweakGatherLoop(ToolsAppCtx *ctx, ++ gboolean enable) ++{ ++ gint pollInterval = 0; ++ ++ if (enable) { ++ pollInterval = APP_INFO_POLL_INTERVAL * 1000; ++ ++ /* ++ * Check the config registry for custom poll interval, ++ * converting from seconds to milliseconds. ++ */ ++ if (g_key_file_has_key(ctx->config, CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_POLLINTERVAL, NULL)) { ++ GError *gError = NULL; ++ ++ pollInterval = g_key_file_get_integer(ctx->config, ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_POLLINTERVAL, ++ &gError); ++ pollInterval *= 1000; ++ ++ if (pollInterval < 0 || gError) { ++ g_warning("Invalid %s.%s value. Using default %us.\n", ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_POLLINTERVAL, ++ APP_INFO_POLL_INTERVAL); ++ pollInterval = APP_INFO_POLL_INTERVAL * 1000; ++ } ++ ++ g_clear_error(&gError); ++ } ++ } ++ ++ if (appInfoTimeoutSource != NULL) { ++ /* ++ * If the interval hasn't changed, let's not interfere with the existing ++ * timeout source. ++ */ ++ if (pollInterval == appInfoPollInterval) { ++ ASSERT(pollInterval); ++ return; ++ } ++ ++ /* ++ * Destroy the existing timeout source since the interval has changed. ++ */ ++ ++ g_source_destroy(appInfoTimeoutSource); ++ appInfoTimeoutSource = NULL; ++ } ++ ++ /* ++ * All checks have passed. Create a new timeout source and attach it. ++ */ ++ appInfoPollInterval = pollInterval; ++ ++ if (appInfoPollInterval) { ++ g_info("New value for %s is %us.\n", ++ CONFNAME_APPINFO_POLLINTERVAL, ++ appInfoPollInterval / 1000); ++ ++ appInfoTimeoutSource = g_timeout_source_new(appInfoPollInterval); ++ VMTOOLSAPP_ATTACH_SOURCE(ctx, appInfoTimeoutSource, ++ AppInfoGather, ctx, NULL); ++ g_source_unref(appInfoTimeoutSource); ++ } else { ++ g_info("Poll loop for %s disabled.\n", CONFNAME_APPINFO_POLLINTERVAL); ++ SetGuestInfo(ctx, APP_INFO_GUESTVAR_KEY, ""); ++ } ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoServerConfReload -- ++ * ++ * @brief Reconfigures the poll loop interval upon config file reload. ++ * ++ * @param[in] src The source object. ++ * @param[in] ctx The application context. ++ * @param[in] data Unused. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++AppInfoServerConfReload(gpointer src, ++ ToolsAppCtx *ctx, ++ gpointer data) ++{ ++ gboolean disabled = ++ VMTools_ConfigGetBoolean(ctx->config, ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_DISABLED, ++ APP_INFO_CONF_DEFAULT_DISABLED_VALUE); ++ TweakGatherLoop(ctx, !disabled); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * AppInfoServerShutdown -- ++ * ++ * Cleanup internal data on shutdown. ++ * ++ * @param[in] src The source object. ++ * @param[in] ctx Unused. ++ * @param[in] data Unused. ++ * ++ ***************************************************************************** ++ */ ++ ++static void ++AppInfoServerShutdown(gpointer src, ++ ToolsAppCtx *ctx, ++ gpointer data) ++{ ++ if (appInfoTimeoutSource != NULL) { ++ g_source_destroy(appInfoTimeoutSource); ++ appInfoTimeoutSource = NULL; ++ } ++ ++ SetGuestInfo(ctx, APP_INFO_GUESTVAR_KEY, ""); ++} ++ ++ ++/* ++ ***************************************************************************** ++ * ToolsOnLoad -- ++ * ++ * Plugin entry point. Initializes internal plugin state. ++ * ++ * @param[in] ctx The app context. ++ * ++ * @return The registration data. ++ * ++ ***************************************************************************** ++ */ ++ ++TOOLS_MODULE_EXPORT ToolsPluginData * ++ToolsOnLoad(ToolsAppCtx *ctx) ++{ ++ static ToolsPluginData regData = { ++ "appInfo", ++ NULL, ++ NULL ++ }; ++ ++ uint32 vmxVersion = 0; ++ uint32 vmxType = VMX_TYPE_UNSET; ++ ++ /* ++ * Return NULL to disable the plugin if not running in a VMware VM. ++ */ ++ if (!ctx->isVMware) { ++ g_info("Not running in a VMware VM.\n"); ++ return NULL; ++ } ++ ++ /* ++ * Return NULL to disable the plugin if VM is not running on ESX host. ++ */ ++ if (!VmCheck_GetVersion(&vmxVersion, &vmxType) || ++ vmxType != VMX_TYPE_SCALABLE_SERVER) { ++ g_info("VM is not running on ESX host.\n"); ++ return NULL; ++ } ++ ++ /* ++ * Return NULL to disable the plugin if not running in vmsvc daemon. ++ */ ++ if (!TOOLS_IS_MAIN_SERVICE(ctx)) { ++ g_info("Not running in vmsvc daemon: container name='%s'.\n", ++ ctx->name); ++ return NULL; ++ } ++ ++ /* ++ * This plugin is useless without an RpcChannel. If we don't have one, ++ * just bail. ++ */ ++ if (ctx->rpc != NULL) { ++ ToolsPluginSignalCb sigs[] = { ++ { TOOLS_CORE_SIG_CONF_RELOAD, AppInfoServerConfReload, NULL }, ++ { TOOLS_CORE_SIG_SHUTDOWN, AppInfoServerShutdown, NULL } ++ }; ++ ToolsAppReg regs[] = { ++ { TOOLS_APP_SIGNALS, ++ VMTools_WrapArray(sigs, sizeof *sigs, ARRAYSIZE(sigs)) ++ } ++ }; ++ ++ gboolean disabled = FALSE; ++ ++ regData.regs = VMTools_WrapArray(regs, ++ sizeof *regs, ++ ARRAYSIZE(regs)); ++ ++ /* ++ * Set up the AppInfo gather loop. ++ */ ++ disabled = ++ VMTools_ConfigGetBoolean(ctx->config, ++ CONFGROUPNAME_APPINFO, ++ CONFNAME_APPINFO_DISABLED, ++ APP_INFO_CONF_DEFAULT_DISABLED_VALUE); ++ TweakGatherLoop(ctx, !disabled); ++ ++ return ®Data; ++ } ++ ++ return NULL; ++} ++ ++ ++/* ++ * END Tools Core Services goodies. ++ ***************************************************************************** ++ */ +diff --git a/open-vm-tools/services/plugins/appInfo/appInfoInt.h b/open-vm-tools/services/plugins/appInfo/appInfoInt.h +new file mode 100644 +index 0000000..1897926 +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfoInt.h +@@ -0,0 +1,64 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published ++ * by the Free Software Foundation version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++#ifndef _APPINFOINT_H_ ++#define _APPINFOINT_H_ ++ ++/** ++ * @file appInfoInt.h ++ * ++ * Header file with few functions that are internal to appInfo plugin. ++ */ ++ ++#define G_LOG_DOMAIN "appInfo" ++#include "vm_basic_types.h" ++#include ++#include "vmware/tools/plugin.h" ++ ++#if defined(_WIN32) ++ ++#include ++typedef DWORD AppInfo_Pid; ++ ++#else /* POSIX */ ++ ++#include ++typedef pid_t AppInfo_Pid; ++ ++#endif ++ ++/* ++ * Application information structure. ++ * This holds basic information we return per process ++ * when listing process information inside the guest. ++ */ ++ ++typedef struct AppInfo { ++ AppInfo_Pid procId; ++ char *appName; // UTF-8 ++ char *version; ++#if defined(_WIN32) ++ size_t memoryUsed; ++#endif ++} AppInfo; ++ ++GSList *AppInfo_GetAppList(void); ++GSList *AppInfo_SortAppList(GSList *appList); ++ ++void AppInfo_DestroyAppList(GSList *appList); ++#endif /* _APPINFOINT_H_ */ +diff --git a/open-vm-tools/services/plugins/appInfo/appInfoPosix.c b/open-vm-tools/services/plugins/appInfo/appInfoPosix.c +new file mode 100644 +index 0000000..d7b05be +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfoPosix.c +@@ -0,0 +1,124 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published ++ * by the Free Software Foundation version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++/* ++ * appInfoPosix.c -- ++ * ++ * Functions to capture the information about running applications inside ++ * a Linux guest. ++ * ++ */ ++ ++#ifndef __linux__ ++# error This file should not be compiled. ++#endif ++ ++ ++#include ++#include ++#include ++ ++#include "appInfoInt.h" ++#include "procMgr.h" ++#include "vmware.h" ++#include "str.h" ++#include "util.h" ++ ++ ++/* ++ *---------------------------------------------------------------------- ++ * AppInfoGetAppInfo -- ++ * ++ * Retrieves the application information for a specified process. ++ * ++ * @param[in] procInfo Information about a process. ++ * ++ * @retval The application information. The caller must free the memory ++ * allocated for the application information. ++ * NULL if any error happens. ++ * ++ *---------------------------------------------------------------------- ++ */ ++ ++AppInfo * ++AppInfoGetAppInfo(ProcMgrProcInfo *procInfo) // IN ++{ ++ AppInfo *appInfo = NULL; ++ ++ if (procInfo == NULL) { ++ return appInfo; ++ } ++ ++ if (procInfo->procCmdName == NULL) { ++ return appInfo; ++ } ++ ++ appInfo = Util_SafeMalloc(sizeof (*appInfo) * 1); ++ appInfo->procId = procInfo->procId; ++ appInfo->appName = Util_SafeStrdup(procInfo->procCmdName); ++ appInfo->version = Util_SafeStrdup(""); ++ ++ return appInfo; ++} ++ ++ ++/* ++ *---------------------------------------------------------------------- ++ * AppInfo_GetAppList -- ++ * ++ * Generates the application information list. ++ * ++ * @retval Pointer to the newly allocated application list. The caller must ++ * free the memory using AppInfoDestroyAppList function. ++ * NULL if any error occurs. ++ * ++ *---------------------------------------------------------------------- ++ */ ++ ++GSList * ++AppInfo_GetAppList(void) { ++ GSList *appList = NULL; ++ int i; ++ ProcMgrProcInfoArray *procList = NULL; ++ size_t procCount; ++ ++#if defined(_WIN32) ++ procList = ProcMgr_ListProcessesEx(); ++#else ++ procList = ProcMgr_ListProcesses(); ++#endif ++ ++ if (procList == NULL) { ++ g_warning("Failed to get the list of processes.\n"); ++ return appList; ++ } ++ ++ procCount = ProcMgrProcInfoArray_Count(procList); ++ for (i = 0; i < procCount; i++) { ++ AppInfo *appInfo; ++ ProcMgrProcInfo *procInfo = ProcMgrProcInfoArray_AddressOf(procList, i); ++ appInfo = AppInfoGetAppInfo(procInfo); ++ if (NULL != appInfo) { ++ appList = g_slist_prepend(appList, appInfo); ++ } ++ } ++ ++ ProcMgr_FreeProcList(procList); ++ ++ return appList; ++} +diff --git a/open-vm-tools/services/plugins/appInfo/appInfoUtil.c b/open-vm-tools/services/plugins/appInfo/appInfoUtil.c +new file mode 100644 +index 0000000..f0327ec +--- /dev/null ++++ b/open-vm-tools/services/plugins/appInfo/appInfoUtil.c +@@ -0,0 +1,143 @@ ++/********************************************************* ++ * Copyright (C) 2020 VMware, Inc. All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU Lesser General Public License as published ++ * by the Free Software Foundation version 2.1 and no later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++ * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public ++ * License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public License ++ * along with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ *********************************************************/ ++ ++/* ++ * appInfoUtil.c -- ++ * ++ * Utility functions for the application list information. ++ */ ++ ++ ++#include ++#include ++#include "appInfoInt.h" ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfoDestroyAppData -- ++ * ++ * Free function for application data. This function is called by the glib ++ * for each element in the application list while freeing. ++ * ++ * @param[in] data Pointer to the application data. ++ * ++ * @retval NONE ++ * ++ ****************************************************************************** ++ */ ++ ++void ++AppInfoDestroyAppData(gpointer data) { ++ AppInfo *appInfo = (AppInfo *) data; ++ ++ if (appInfo == NULL) { ++ return; ++ } ++ ++ free(appInfo->appName); ++ free(appInfo->version); ++ free(appInfo); ++} ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfoDestroyAppList -- ++ * ++ * Frees the entire memory allocated for the application list. ++ * ++ * @param[in] appList Pointer to the application list. ++ * ++ * @retval NONE ++ * ++ ****************************************************************************** ++ */ ++ ++void ++AppInfo_DestroyAppList(GSList *appList) { ++ if (appList == NULL) { ++ return; ++ } ++ ++ g_slist_free_full(appList, AppInfoDestroyAppData); ++} ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfoCompareApps -- ++ * ++ * Compare function used by glib while sorting the application list. ++ * For windows guests, the memory used by the application is used for comparing. ++ * For linux guests, no comparison is done and hence 0 is returned. ++ * ++ * @param[in] a Pointer to the first application that should be compared. ++ * @param[in] b Pointer to the second application that should be compared. ++ * ++ * @retval -1 if a should be kept before b in the sorted list. ++ * 0 if both the elements are same. ++ * 1 if b should be kept before a in the sorted list. ++ * ++ ****************************************************************************** ++ */ ++ ++static gint ++AppInfoCompareApps(gconstpointer a, ++ gconstpointer b) { ++#if defined(_WIN32) ++ if (a != NULL && b != NULL) { ++ size_t aMemory = ((AppInfo *) a)->memoryUsed; ++ size_t bMemory = ((AppInfo *) b)->memoryUsed; ++ if (aMemory < bMemory) { ++ return 1; ++ } else if (aMemory == bMemory) { ++ return 0; ++ } else { ++ return -1; ++ } ++ } ++ return 0; ++#else ++ return 0; ++#endif ++} ++ ++ ++/* ++ ****************************************************************************** ++ * AppInfo_SortAppList -- ++ * ++ * Sorts the provided list of applications. ++ * ++ * @param[in] appList List of applications that need to be sorted. ++ * ++ * @retval The sorted list of applications. ++ * ++ ****************************************************************************** ++ */ ++ ++GSList * ++AppInfo_SortAppList(GSList *appList) // IN/OUT ++{ ++ if (appList == NULL) { ++ return appList; ++ } ++ ++ return g_slist_sort(appList, AppInfoCompareApps); ++} +-- +1.8.3.1 + diff --git "a/SOURCES/run-vmblock\\x2dfuse.mount" "b/SOURCES/run-vmblock\\x2dfuse.mount" new file mode 100644 index 0000000..d7be7c2 --- /dev/null +++ "b/SOURCES/run-vmblock\\x2dfuse.mount" @@ -0,0 +1,17 @@ +[Unit] +Description=VMware vmblock Fuse Mount +Documentation=https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/vmblock-fuse/design.txt +DefaultDependencies=no +Before=umount.target vmtoolsd.service +ConditionVirtualization=vmware +After=sys-fs-fuse-connections.mount +Wants=vmtoolsd.service + +[Mount] +What=vmware-vmblock-fuse +Where=/run/vmblock-fuse +Type=fuse +Options=subtype=vmware-vmblock,default_permissions,allow_other + +[Install] +WantedBy=multi-user.target diff --git a/SPECS/open-vm-tools.spec b/SPECS/open-vm-tools.spec index 379ecbd..bd06422 100644 --- a/SPECS/open-vm-tools.spec +++ b/SPECS/open-vm-tools.spec @@ -20,15 +20,15 @@ %global _hardened_build 1 %global majorversion 11.0 -%global minorversion 0 -%global toolsbuild 14549434 +%global minorversion 5 +%global toolsbuild 15389592 %global toolsversion %{majorversion}.%{minorversion} %global toolsdaemon vmtoolsd %global vgauthdaemon vgauthd Name: open-vm-tools Version: %{toolsversion} -Release: 4%{?dist} +Release: 3%{?dist} Summary: Open Virtual Machine Tools for virtual machines hosted on VMware Group: Applications/System License: GPLv2 @@ -36,19 +36,22 @@ URL: https://github.com/vmware/%{name} Source0: https://github.com/vmware/%{name}/releases/download/stable-%{version}/%{name}-%{version}-%{toolsbuild}.tar.gz Source1: %{toolsdaemon}.service Source2: %{vgauthdaemon}.service +Source3: run-vmblock\x2dfuse.mount +Source4: open-vm-tools.conf + ExclusiveArch: x86_64 -Patch0002: 0002-Fix-leaks-in-ListAliases-and-ListMappedAliases.patch -# For bz#1769881 - [ESXi][RHEL8.2]Important issues found by covscan in "open-vm-tools-11.0.0-2.el8" package -Patch3: ovt-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch -# For bz#1769881 - [ESXi][RHEL8.2]Important issues found by covscan in "open-vm-tools-11.0.0-2.el8" package -Patch4: ovt-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch -# For bz#1769881 - [ESXi][RHEL8.2]Important issues found by covscan in "open-vm-tools-11.0.0-2.el8" package -Patch5: ovt-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch -# For bz#1769881 - [ESXi][RHEL8.2]Important issues found by covscan in "open-vm-tools-11.0.0-2.el8" package -Patch6: ovt-Fix-a-resource-leak-issue-in-deployPkg.patch -# For bz#1800812 - [ESXi][RHEL8]Log spew "[ warning] [guestinfo] GuestInfoGetDiskDevice: Missing disk device name -Patch7: ovt-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch +Patch0002: 0002-Address-Coverity-issues-reported-in-bora-lib-file-fi.patch +Patch0003: 0003-Fix-a-potential-NULL-pointer-dereference-in-the-vmba.patch +Patch0004: 0004-Address-two-Coverity-reported-issues-in-hostinfoPosi.patch +Patch0005: 0005-Fix-a-resource-leak-issue-in-deployPkg.patch +Patch0006: 0006-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch +# For bz#1811729 - [ESXi][RHEL8.2.1]open-vm-tools coverity scan issue +Patch7: ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch +# For bz#1811729 - [ESXi][RHEL8.2.1]open-vm-tools coverity scan issue +Patch8: ovt-Update-copyright-to-reflect-previous-change.patch +# For bz#1809751 - [ESXi][RHEL8.2.1]open-vm-tools add appinfo plugin patch +Patch9: ovt-add-appinfo-plugin.patch BuildRequires: autoconf BuildRequires: automake @@ -190,6 +193,9 @@ mv %{buildroot}%{_sysconfdir}/vmware-tools/vm-support %{buildroot}%{_bindir} # Systemd unit files install -p -m 644 -D %{SOURCE1} %{buildroot}%{_unitdir}/%{toolsdaemon}.service install -p -m 644 -D %{SOURCE2} %{buildroot}%{_unitdir}/%{vgauthdaemon}.service +install -p -m 644 -D '%{SOURCE3}' %{buildroot}%{_unitdir}/run-vmblock\\x2dfuse.mount +install -p -m 644 -D %{SOURCE4} %{buildroot}/usr/lib/modules-load.d/open-vm-tools.conf + # 'make check' in open-vm-tools rebuilds docs and ends up regenerating # the font file. We can add %%check secion once 'make check' is fixed @@ -221,11 +227,12 @@ if [ "$1" = "2" ]; then # Cleanup vmtoolsd-init.service in case of upgrades %{_bindir}/systemctl disable %{toolsdaemon}-init.service &> /dev/null || /bin/true fi - - %systemd_post %{vgauthdaemon}.service %systemd_post %{toolsdaemon}.service +%post desktop +%systemd_post run-vmblock\x2dfuse.mount + %preun %systemd_preun %{toolsdaemon}.service %systemd_preun %{vgauthdaemon}.service @@ -248,6 +255,9 @@ if [ "$1" = "0" -a \ fi fi +%preun desktop +%systemd_preun run-vmblock\x2dfuse.mount + %postun %{?ldconfig} %systemd_postun_with_restart %{toolsdaemon}.service @@ -294,6 +304,9 @@ fi %{_udevrulesdir}/99-vmware-scsi-udev.rules %{_unitdir}/%{toolsdaemon}.service %{_unitdir}/%{vgauthdaemon}.service +%{_unitdir}/run-vmblock\x2dfuse.mount +/usr/lib/modules-load.d/open-vm-tools.conf + %files desktop %{_sysconfdir}/xdg/autostart/*.desktop @@ -317,6 +330,20 @@ fi %{_bindir}/vmware-vgauth-smoketest %changelog +* Tue Apr 21 2020 Miroslav Rezanina - 11.0.5-3.el8 +- ovt-Fix-a-trivial-memory-leak-in-namespacetool.c.patch [bz#1811729] +- ovt-Update-copyright-to-reflect-previous-change.patch [bz#1811729] +- ovt-add-appinfo-plugin.patch [bz#1809751] +- Resolves: bz#1809751 + ([ESXi][RHEL8.2.1]open-vm-tools add appinfo plugin patch) +- Resolves: bz#1811729 + ([ESXi][RHEL8.2.1]open-vm-tools coverity scan issue) + +* Wed Apr 08 2020 Miroslav Rezanina - 11.0.5-1.el8 +- Rebase to 11.0.5 (bz#1798285) +- Resolves: bz#1798285 + ([ESXi][RHEL8.2.1]Rebase open-vm-tools to 11.0.5 for 8.2.1) + * Tue Feb 18 2020 Miroslav Rezanina - 11.0.0-4.el8 - ovt-Rectify-a-log-spew-in-vmsvc-logging-vmware-vmsvc-roo.patch [bz#1800812] - Resolves: bz#1800812 @@ -330,9 +357,6 @@ fi - Resolves: bz#1769881 ([ESXi][RHEL8.2]Important issues found by covscan in "open-vm-tools-11.0.0-2.el8" package) -* Tue Oct 15 2019 Miroslav Rezanina - 11.0.0-2.el8 -- Add missing gating tests - * Mon Oct 14 2019 Miroslav Rezanina - 11.0.0-1.el8 - Rebase to 11.0.0 [bz#1754658] - Resolves: bz#1754658