diff -Naur open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionCommon.c open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionCommon.c --- open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionCommon.c 2020-12-17 21:11:31.000000000 +0100 +++ open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionCommon.c 2021-06-01 13:39:55.989687060 +0200 @@ -42,25 +42,8 @@ /* Required DRM version for resolutionKMS */ #define RESOLUTION_DRM_MAJOR 2 -#define RESOLUTION_DRM_MINOR 12 +#define RESOLUTION_DRM_MINOR 14 -/* Required Xorg driver version for resolutionKMS default on */ -#define RESOLUTION_XORG_MAJOR 13 -#define RESOLUTION_XORG_MINOR 2 - -/* Recognition token for Xorg driver version scanner */ -#define RESOLUTION_XORG_VERSTRING "version=" - -/* - * Xorg driver file names to scan for. Only the first found will be - * scanned for version info. - */ -static const char *driverNames[]= { - "/usr/lib64/xorg/modules/drivers/vmware_drv.so", - "/usr/lib/xorg/modules/drivers/vmware_drv.so" -}; - -static const int numDriverNames = 2; /* *----------------------------------------------------------------------------- @@ -106,52 +89,52 @@ */ enumerate = udev_enumerate_new(udev); if (udev_enumerate_add_match_subsystem(enumerate, "drm")) - goto outErr; + goto outErr; if (udev_enumerate_add_match_property(enumerate, "DEVTYPE", "drm_minor")) - goto outErr; + goto outErr; if (udev_enumerate_scan_devices(enumerate)) - goto outErr; + goto outErr; devices = udev_enumerate_get_list_entry(enumerate); udev_list_entry_foreach(devListEntry, devices) { - const char *path, *vendor, *device; - struct udev_device *parent; + const char *path, *vendor, *device; + struct udev_device *parent; - path = udev_list_entry_get_name(devListEntry); - if (!path) - continue; - if (!strstr(path, node)) - continue; - - dev = udev_device_new_from_syspath(udev, path); - if (!dev) - goto outErr; - - parent = udev_device_get_parent_with_subsystem_devtype(dev, - "pci", - NULL); - if (!parent) - goto skipCheck; - - vendor = udev_device_get_sysattr_value(parent, "vendor"); - device = udev_device_get_sysattr_value(parent, "device"); - if (!vendor || !device) - goto skipCheck; - - if (strcmp(vendor, RESOLUTION_VENDOR) || - strcmp(device, RESOLUTION_DEVICE)) - goto skipCheck; - - devNode = udev_device_get_devnode(dev); - if (!devNode) - goto outFound; - - fd = open(devNode, O_RDWR); - udev_device_unref(dev); - break; + path = udev_list_entry_get_name(devListEntry); + if (!path) + continue; + if (!strstr(path, node)) + continue; + + dev = udev_device_new_from_syspath(udev, path); + if (!dev) + goto outErr; + + parent = udev_device_get_parent_with_subsystem_devtype(dev, + "pci", + NULL); + if (!parent) + goto skipCheck; + + vendor = udev_device_get_sysattr_value(parent, "vendor"); + device = udev_device_get_sysattr_value(parent, "device"); + if (!vendor || !device) + goto skipCheck; + + if (strcmp(vendor, RESOLUTION_VENDOR) || + strcmp(device, RESOLUTION_DEVICE)) + goto skipCheck; + + devNode = udev_device_get_devnode(dev); + if (!devNode) + goto outFound; + + fd = open(devNode, O_RDWR); + udev_device_unref(dev); + break; skipCheck: - udev_device_unref(dev); + udev_device_unref(dev); } udev_enumerate_unref(enumerate); @@ -199,23 +182,25 @@ static int resolutionDRMCheckVersion(int fd) // IN: An open DRM file descriptor. { - drmVersionPtr ver = drmGetVersion(fd); + drmVersionPtr ver = drmGetVersion(fd); - if (!ver) { - g_debug("%s: Failed to get DRM version.\n", __func__); - return -1; - } + if (!ver) { + g_debug("%s: Failed to get DRM version.\n", __func__); + return -1; + } - if (ver->version_major != RESOLUTION_DRM_MAJOR || - ver->version_minor < RESOLUTION_DRM_MINOR) { - g_debug("%s: Insufficient DRM version %d.%d for resolutionKMS.\n", - __func__, ver->version_major, ver->version_minor); - drmFreeVersion(ver); - return -1; - } + if (ver->version_major != RESOLUTION_DRM_MAJOR || + ver->version_minor < RESOLUTION_DRM_MINOR) { + g_debug("%s: Insufficient DRM version %d.%d for resolutionKMS.\n", + __func__, ver->version_major, ver->version_minor); + drmFreeVersion(ver); + return -1; + } + g_debug("%s: DRM version %d.%d.\n", + __func__, ver->version_major, ver->version_minor); - drmFreeVersion(ver); - return 0; + drmFreeVersion(ver); + return 0; } @@ -241,27 +226,27 @@ static int resolutionDRMRPrimaryCheckOpen(void) { - int fd = -1; + int fd = -1; - fd = resolutionOpenDRM("renderD"); - if (fd < 0) { - g_debug("%s: Failed to open DRM render node.\n", __func__); - fd = resolutionOpenDRM("card"); - if (fd >= 0) - (void) drmDropMaster(fd); - } - if (fd < 0) { - g_debug("%s: Failed to open DRM card node.\n", __func__); - goto outErr; - } + fd = resolutionOpenDRM("renderD"); + if (fd < 0) { + g_debug("%s: Failed to open DRM render node.\n", __func__); + fd = resolutionOpenDRM("card"); + if (fd >= 0) + (void) drmDropMaster(fd); + } + if (fd < 0) { + g_debug("%s: Failed to open DRM card node.\n", __func__); + goto outErr; + } - if (!resolutionDRMCheckVersion(fd)) { - return fd; - } + if (!resolutionDRMCheckVersion(fd)) { + return fd; + } - close(fd); - outErr: - return -1; + close(fd); +outErr: + return -1; } @@ -288,60 +273,43 @@ resolutionCheckForKMS(ToolsAppCtx *ctx) // IN: The ToolsAppCtx for // configuration db access. { - GError *err = NULL; - gboolean doResolutionKMS; - int fd; - - doResolutionKMS = g_key_file_get_boolean(ctx->config, "resolutionKMS", - "enable", &err); - if (err) { - /* - * If there is nothing in the configuration file, require - * at least Xorg driver version 13.2.0, which has the autolayout - * feature, to enable resolutionKMS. - */ - int major, minor, level; - g_clear_error(&err); - doResolutionKMS = FALSE; - if (!resolutionXorgDriverVersion(numDriverNames, driverNames, - RESOLUTION_XORG_VERSTRING, &major, - &minor, &level) && - (major > RESOLUTION_XORG_MAJOR || - (major == RESOLUTION_XORG_MAJOR && - minor >= RESOLUTION_XORG_MINOR))) { - doResolutionKMS = TRUE; - g_debug("%s: ResolutionKMS enabled based on Xorg driver version.\n", - __func__); - } else { - g_debug("%s: ResolutionKMS disabled. (No configuration).\n", - __func__); - doResolutionKMS = FALSE; - } - } else { - g_debug("%s: ResolutionKMS %s using configuration file info.\n", - __func__, (doResolutionKMS) ? "enabled" : "disabled"); - } + GError *err = NULL; + gboolean doResolutionKMS; + int fd; + + doResolutionKMS = g_key_file_get_boolean(ctx->config, "resolutionKMS", + "enable", &err); + if (err) { + g_clear_error(&err); + /* + * We are going to try to see if we can load a valid vmwgfx + */ + doResolutionKMS = TRUE; + } else { + g_debug("%s: ResolutionKMS %s using configuration file info.\n", + __func__, (doResolutionKMS) ? "enabled" : "disabled"); + } - if (!doResolutionKMS) - return -1; + if (!doResolutionKMS) + return -1; - if (resolutionDLOpen()) { - g_warning("%s: Failed to find needed system libraries for " - "resolutionKMS.\n", __func__); - return -1; - } else { - g_message("%s: dlopen succeeded.\n", __func__); - } + if (resolutionDLOpen()) { + g_warning("%s: Failed to find needed system libraries for " + "resolutionKMS.\n", __func__); + return -1; + } else { + g_message("%s: dlopen succeeded.\n", __func__); + } - fd = resolutionDRMRPrimaryCheckOpen(); + fd = resolutionDRMRPrimaryCheckOpen(); - if (fd < 0) - g_warning("%s: No system support for resolutionKMS.\n", __func__); - else - g_message("%s: System support available for resolutionKMS.\n", - __func__); + if (fd < 0) + g_warning("%s: No system support for resolutionKMS.\n", __func__); + else + g_message("%s: System support available for resolutionKMS.\n", + __func__); - return fd; + return fd; } /* @@ -364,84 +332,8 @@ void resolutionDRMClose(int fd) { - close(fd); - resolutionDLClose(); + close(fd); + resolutionDLClose(); } #endif /* ENABLE_RESOLUTIONKMS */ - -/* - *----------------------------------------------------------------------------- - * - * resolutionXorgDriverVersion -- - * - * Scans for VMWare Xorg driver files and tries to determine the Xorg - * driver version. - * - * Results: - * If succesful returns zero and outputs the driver version in the - * parameters major, minor and level. If not successful, returns -1. - * - * Side effects: - * None. - * - *----------------------------------------------------------------------------- - */ -int -resolutionXorgDriverVersion(int numPaths, // IN: Number of strings - // in paths. - const char *paths[], // IN: Possible driver - // paths. - const char versionString[], // IN: Version token. - int *major, // OUT: Major version # - int *minor, // OUT: Minor version # - int *level) // OUT: Patchlevel - // version # -{ - FILE *driver = NULL; - const char *curMatch; - int curFileChar; - int i; - - g_debug("%s: Scanning for VMWare Xorg drivers.\n", __func__); - for(i = 0; i < numPaths; ++i) { - g_debug("%s: Looking for \"%s\".\n", __func__, paths[i]); - driver = fopen(paths[i], "r"); - if (driver) - break; - } - - if (!driver) { - g_debug("%s: No driver found.\n", __func__); - return -1; - } - - g_debug("%s: Driver found. Looking for version info.\n", __func__); - curMatch = versionString; - while (*curMatch) { - if (feof(driver)) - goto outNotFound; - - curFileChar = fgetc(driver); - if (curFileChar != EOF && curFileChar == *curMatch) { - curMatch++; - continue; - } else if (curMatch != versionString) { - curMatch = versionString; - (void) ungetc(curFileChar, driver); - } - } - - if (fscanf(driver, "%d.%d.%d", major, minor, level) != 3) - goto outNotFound; - - fclose(driver); - g_debug("%s: Version info found: %d.%d.%d\n", __func__, *major, *minor, - *level); - return 0; - - outNotFound: - fclose(driver); - g_debug("%s: No version info found.\n", __func__); - return -1; -} diff -Naur open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionCommon.h open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionCommon.h --- open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionCommon.h 2020-12-17 21:11:31.000000000 +0100 +++ open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionCommon.h 2021-06-01 13:39:55.989687060 +0200 @@ -42,12 +42,4 @@ #endif /* !ENABLE_RESOLUTIONKMS */ -int -resolutionXorgDriverVersion(int numPaths, - const char *paths[], - const char versionString[], - int *major, - int *minor, - int *level); - #endif /* _RESOLUTION_COMMON_H_ */ diff -Naur open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionDL.c open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionDL.c --- open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionDL.c 2020-12-17 21:11:31.000000000 +0100 +++ open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionDL.c 2021-06-01 13:39:55.989687060 +0200 @@ -34,44 +34,44 @@ struct FuncToResolv { - size_t offset; - const char *name; + size_t offset; + const char *name; }; #define UDEV_RESOLV(_name) \ - {.offset = offsetof(struct Udev1Interface, _name), \ - .name = "udev"#_name} + {.offset = offsetof(struct Udev1Interface, _name), \ + .name = "udev"#_name} #define LIBDRM_RESOLV(_name) \ - {.offset = offsetof(struct Drm2Interface, _name), \ - .name = "drm"#_name} + {.offset = offsetof(struct Drm2Interface, _name), \ + .name = "drm"#_name} static struct FuncToResolv udev1Table[] = { - UDEV_RESOLV(_device_get_devnode), - UDEV_RESOLV(_device_get_parent_with_subsystem_devtype), - UDEV_RESOLV(_device_get_sysattr_value), - UDEV_RESOLV(_device_new_from_syspath), - UDEV_RESOLV(_device_unref), - UDEV_RESOLV(_enumerate_add_match_property), - UDEV_RESOLV(_enumerate_add_match_subsystem), - UDEV_RESOLV(_enumerate_get_list_entry), - UDEV_RESOLV(_enumerate_new), - UDEV_RESOLV(_enumerate_scan_devices), - UDEV_RESOLV(_enumerate_unref), - UDEV_RESOLV(_list_entry_get_name), - UDEV_RESOLV(_list_entry_get_next), - UDEV_RESOLV(_new), - UDEV_RESOLV(_unref) + UDEV_RESOLV(_device_get_devnode), + UDEV_RESOLV(_device_get_parent_with_subsystem_devtype), + UDEV_RESOLV(_device_get_sysattr_value), + UDEV_RESOLV(_device_new_from_syspath), + UDEV_RESOLV(_device_unref), + UDEV_RESOLV(_enumerate_add_match_property), + UDEV_RESOLV(_enumerate_add_match_subsystem), + UDEV_RESOLV(_enumerate_get_list_entry), + UDEV_RESOLV(_enumerate_new), + UDEV_RESOLV(_enumerate_scan_devices), + UDEV_RESOLV(_enumerate_unref), + UDEV_RESOLV(_list_entry_get_name), + UDEV_RESOLV(_list_entry_get_next), + UDEV_RESOLV(_new), + UDEV_RESOLV(_unref) }; static struct FuncToResolv drm2Table[] = { - LIBDRM_RESOLV(Open), - LIBDRM_RESOLV(Close), - LIBDRM_RESOLV(GetVersion), - LIBDRM_RESOLV(FreeVersion), - LIBDRM_RESOLV(DropMaster), - LIBDRM_RESOLV(CommandWrite) + LIBDRM_RESOLV(Open), + LIBDRM_RESOLV(Close), + LIBDRM_RESOLV(GetVersion), + LIBDRM_RESOLV(FreeVersion), + LIBDRM_RESOLV(DropMaster), + LIBDRM_RESOLV(CommandWrite) }; struct Udev1Interface *udevi = NULL; @@ -95,20 +95,20 @@ void resolutionDLClose(void) { - if (udevi) { - free(udevi); - udevi = NULL; - } - - if (drmi) { - free(drmi); - drmi = NULL; - } - - if (dlhandle) { - dlclose(dlhandle); - dlhandle = NULL; - } + if (udevi) { + free(udevi); + udevi = NULL; + } + + if (drmi) { + free(drmi); + drmi = NULL; + } + + if (dlhandle) { + dlclose(dlhandle); + dlhandle = NULL; + } } /* @@ -128,47 +128,47 @@ */ static int resolutionDLResolve(void **ptr, // OUT: pointer to - // function table. - size_t size, // IN: Size of ft. - const char name[], // IN: Library name. - const struct FuncToResolv table[], // IN: Table of name- - // offset pairs - int numEntries) // IN: Num entries in + // function table. + size_t size, // IN: Size of ft. + const char name[], // IN: Library name. + const struct FuncToResolv table[], // IN: Table of name- + // offset pairs + int numEntries) // IN: Num entries in // table. { - void **func_ptr; - int i; + void **func_ptr; + int i; - if (*ptr) - return 0; + if (*ptr) + return 0; - *ptr = malloc(size); - if (!*ptr) - return -1; - - dlhandle = dlopen(name, RTLD_NOW); - if (!dlhandle) { - g_debug("%s: Failed to open shared library \"%s\".\n", __func__, - name); - goto out_err; - } - - for (i = 0; i < numEntries; ++i) { - func_ptr = (void *) ((unsigned long) *ptr + table[i].offset); - *func_ptr = dlsym(dlhandle, table[i].name); - if (!*func_ptr) { - g_debug("%s: Failed to resolve %s symbol \"%s\".\n", __func__, - name,table[i].name); - goto out_err; - } - } + *ptr = malloc(size); + if (!*ptr) + return -1; + + dlhandle = dlopen(name, RTLD_NOW); + if (!dlhandle) { + g_debug("%s: Failed to open shared library \"%s\".\n", __func__, + name); + goto out_err; + } + + for (i = 0; i < numEntries; ++i) { + func_ptr = (void *) ((unsigned long) *ptr + table[i].offset); + *func_ptr = dlsym(dlhandle, table[i].name); + if (!*func_ptr) { + g_debug("%s: Failed to resolve %s symbol \"%s\".\n", __func__, + name,table[i].name); + goto out_err; + } + } - return 0; + return 0; - out_err: - resolutionDLClose(); +out_err: + resolutionDLClose(); - return -1; + return -1; } /* @@ -190,18 +190,18 @@ int resolutionDLOpen(void) { - /* We support libudev major versions 0 and 1 for now. */ - if (resolutionDLResolve((void **)&udevi, sizeof(*udevi), "libudev.so.1", - udev1Table, ARRAYSIZE(udev1Table)) && - resolutionDLResolve((void **)&udevi, sizeof(*udevi), "libudev.so.0", - udev1Table, ARRAYSIZE(udev1Table))) - return -1; - - if (resolutionDLResolve((void **)&drmi, sizeof(*drmi), "libdrm.so.2", - drm2Table, ARRAYSIZE(drm2Table))) - return -1; + /* We support libudev major versions 0 and 1 for now. */ + if (resolutionDLResolve((void **)&udevi, sizeof(*udevi), "libudev.so.1", + udev1Table, ARRAYSIZE(udev1Table)) && + resolutionDLResolve((void **)&udevi, sizeof(*udevi), "libudev.so.0", + udev1Table, ARRAYSIZE(udev1Table))) + return -1; + + if (resolutionDLResolve((void **)&drmi, sizeof(*drmi), "libdrm.so.2", + drm2Table, ARRAYSIZE(drm2Table))) + return -1; - return 0; + return 0; } #endif /* !HAVE_LIBUDEV */ diff -Naur open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionX11.c open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionX11.c --- open-vm-tools-11.2.5-17337674.old/services/plugins/resolutionSet/resolutionX11.c 2020-12-17 21:11:31.000000000 +0100 +++ open-vm-tools-11.2.5-17337674/services/plugins/resolutionSet/resolutionX11.c 2021-06-01 13:39:55.990687078 +0200 @@ -82,6 +82,83 @@ /* + *----------------------------------------------------------------------------- + * + * resolutionXorgDriverVersion -- + * + * Scans for VMWare Xorg driver files and tries to determine the Xorg + * driver version. + * + * Results: + * If succesful returns zero and outputs the driver version in the + * parameters major, minor and level. If not successful, returns -1. + * + * Side effects: + * None. + * + *----------------------------------------------------------------------------- + */ +static int +resolutionXorgDriverVersion(int numPaths, // IN: Number of strings + // in paths. + const char *paths[], // IN: Possible driver + // paths. + const char versionString[], // IN: Version token. + int *major, // OUT: Major version # + int *minor, // OUT: Minor version # + int *level) // OUT: Patchlevel + // version # +{ + FILE *driver = NULL; + const char *curMatch; + int curFileChar; + int i; + + g_debug("%s: Scanning for VMWare Xorg drivers.\n", __func__); + for(i = 0; i < numPaths; ++i) { + g_debug("%s: Looking for \"%s\".\n", __func__, paths[i]); + driver = fopen(paths[i], "r"); + if (driver) + break; + } + + if (!driver) { + g_debug("%s: No driver found.\n", __func__); + return -1; + } + + g_debug("%s: Driver found. Looking for version info.\n", __func__); + curMatch = versionString; + while (*curMatch) { + if (feof(driver)) + goto outNotFound; + + curFileChar = fgetc(driver); + if (curFileChar != EOF && curFileChar == *curMatch) { + curMatch++; + continue; + } else if (curMatch != versionString) { + curMatch = versionString; + (void) ungetc(curFileChar, driver); + } + } + + if (fscanf(driver, "%d.%d.%d", major, minor, level) != 3) + goto outNotFound; + + fclose(driver); + g_debug("%s: Version info found: %d.%d.%d\n", __func__, *major, *minor, + *level); + return 0; + +outNotFound: + fclose(driver); + g_debug("%s: No version info found.\n", __func__); + return -1; +} + + +/* * Global function definitions */