Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
pacemaker.8750
pacemaker-libcrmcommon-handle-schema-versions-p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File pacemaker-libcrmcommon-handle-schema-versions-properly.patch of Package pacemaker.8750
commit 2f176ae6af6e436cc64181221c1c5296336cd7a0 Author: Ken Gaillot <kgaillot@redhat.com> Date: Tue Jul 18 16:51:09 2017 -0500 Fix: libcrmcommon: handle schema versions properly As a byproduct, this eliminates a dependency on the math library. Index: pacemaker-1.1.16+20170320.77ea74d/lib/common/Makefile.am =================================================================== --- pacemaker-1.1.16+20170320.77ea74d.orig/lib/common/Makefile.am +++ pacemaker-1.1.16+20170320.77ea74d/lib/common/Makefile.am @@ -36,7 +36,7 @@ libcrmcommon_la_LDFLAGS = -version-info libcrmcommon_la_CFLAGS = $(CFLAGS_HARDENED_LIB) libcrmcommon_la_LDFLAGS += $(LDFLAGS_HARDENED_LIB) -libcrmcommon_la_LIBADD = @LIBADD_DL@ $(GNUTLSLIBS) -lm +libcrmcommon_la_LIBADD = @LIBADD_DL@ $(GNUTLSLIBS) libcrmcommon_la_SOURCES = compat.c digest.c ipc.c io.c procfs.c utils.c xml.c \ iso8601.c remote.c mainloop.c logging.c watchdog.c \ Index: pacemaker-1.1.16+20170320.77ea74d/lib/common/schemas.c =================================================================== --- pacemaker-1.1.16+20170320.77ea74d.orig/lib/common/schemas.c +++ pacemaker-1.1.16+20170320.77ea74d/lib/common/schemas.c @@ -22,7 +22,6 @@ #include <string.h> #include <dirent.h> #include <errno.h> -#include <math.h> #include <sys/stat.h> #if HAVE_LIBXML2 @@ -45,7 +44,7 @@ typedef struct { struct schema_s { int type; - float version; + int version[2]; char *name; char *location; char *transform; @@ -83,13 +82,10 @@ xml_minimum_schema_index(void) static int best = 0; if (best == 0) { int lpc = 0; - float target = 0.0; best = xml_latest_schema_index(); - target = floor(known_schemas[best].version); - for (lpc = best; lpc > 0; lpc--) { - if (known_schemas[lpc].version < target) { + if (known_schemas[lpc].version[0] < known_schemas[best].version[0]) { return best; } else { best = lpc; @@ -131,11 +127,19 @@ get_schema_path(const char *name, const return crm_strdup_printf("%s/%s.rng", base, name); } +static inline bool +version_from_filename(const char *filename, int version[2]) +{ + int rc = sscanf(filename, "pacemaker-%d.%d.rng", &version[0], &version[1]); + + return (rc == 2)? TRUE : FALSE; +} + static int schema_filter(const struct dirent *a) { int rc = 0; - float version = 0; + int version[2] = {0, 0}; if (strstr(a->d_name, "pacemaker-") != a->d_name) { /* crm_trace("%s - wrong prefix", a->d_name); */ @@ -143,7 +147,7 @@ schema_filter(const struct dirent *a) } else if (!crm_ends_with(a->d_name, ".rng")) { /* crm_trace("%s - wrong suffix", a->d_name); */ - } else if (sscanf(a->d_name, "pacemaker-%f.rng", &version) == 0) { + } else if (!version_from_filename(a->d_name, version)) { /* crm_trace("%s - wrong format", a->d_name); */ } else if (strcmp(a->d_name, "pacemaker-1.1.rng") == 0) { @@ -161,29 +165,28 @@ schema_filter(const struct dirent *a) static int schema_sort(const struct dirent **a, const struct dirent **b) { - int rc = 0; - float a_version = 0.0; - float b_version = 0.0; + int a_version[2] = {0, 0}, b_version[2] = {0, 0}; - sscanf(a[0]->d_name, "pacemaker-%f.rng", &a_version); - sscanf(b[0]->d_name, "pacemaker-%f.rng", &b_version); + version_from_filename(a[0]->d_name, a_version); + version_from_filename(b[0]->d_name, b_version); - if (a_version > b_version) { - rc = 1; - } else if(a_version < b_version) { - rc = -1; + for (int i = 0; i < 2; ++i) { + if (a_version[i] < b_version[i]) { + return -1; + } else if (a_version[i] > b_version[i]) { + return 1; + } } - - /* crm_trace("%s (%f) vs. %s (%f) : %d", a[0]->d_name, a_version, b[0]->d_name, b_version, rc); */ - return rc; + return 0; } static void -__xml_schema_add(int type, float version, const char *name, +__xml_schema_add(int type, int version[2], const char *name, const char *location, const char *transform, int after_transform) { int last = xml_schema_max; + bool have_version = FALSE; xml_schema_max++; known_schemas = realloc_safe(known_schemas, @@ -193,17 +196,23 @@ __xml_schema_add(int type, float version known_schemas[last].type = type; known_schemas[last].after_transform = after_transform; - if (version > 0.0) { - known_schemas[last].version = version; - known_schemas[last].name = crm_strdup_printf("pacemaker-%.1f", version); - known_schemas[last].location = crm_strdup_printf("%s.rng", known_schemas[last].name); - + for (int i = 0; i < 2; ++i) { + known_schemas[last].version[i] = version[i]; + if (version[i]) { + have_version = TRUE; + } + } + if (have_version) { + known_schemas[last].name = crm_strdup_printf("pacemaker-%d.%d", + version[0], version[1]); + known_schemas[last].location = crm_strdup_printf("%s.rng", + known_schemas[last].name); } else { - char dummy[1024]; CRM_ASSERT(name); CRM_ASSERT(location); - sscanf(name, "%[^-]-%f", dummy, &version); - known_schemas[last].version = version; + sscanf(name, "%*[^-]-%d.%d", + &known_schemas[last].version[0], + &known_schemas[last].version[1]); known_schemas[last].name = strdup(name); known_schemas[last].location = strdup(location); } @@ -243,12 +252,13 @@ crm_schema_init(void) int lpc, max; const char *base = get_schema_root(); struct dirent **namelist = NULL; + int zero[2] = {0, 0}; max = scandir(base, &namelist, schema_filter, schema_sort); - __xml_schema_add(1, 0.0, "pacemaker-0.6", "crm.dtd", "upgrade06.xsl", 3); - __xml_schema_add(1, 0.0, "transitional-0.6", "crm-transitional.dtd", + __xml_schema_add(1, zero, "pacemaker-0.6", "crm.dtd", "upgrade06.xsl", 3); + __xml_schema_add(1, zero, "transitional-0.6", "crm-transitional.dtd", "upgrade06.xsl", 3); - __xml_schema_add(2, 0.0, "pacemaker-0.7", "pacemaker-1.0.rng", NULL, 0); + __xml_schema_add(2, zero, "pacemaker-0.7", "pacemaker-1.0.rng", NULL, 0); if (max < 0) { crm_notice("scandir(%s) failed: %s (%d)", base, strerror(errno), errno); @@ -256,21 +266,21 @@ crm_schema_init(void) } else { for (lpc = 0; lpc < max; lpc++) { int next = 0; - float version = 0.0; + int version[2] = { 0, 0 }; char *transform = NULL; - sscanf(namelist[lpc]->d_name, "pacemaker-%f.rng", &version); + version_from_filename(namelist[lpc]->d_name, version); if ((lpc + 1) < max) { - float next_version = 0.0; + int next_version[2] = { 0, 0 }; - sscanf(namelist[lpc+1]->d_name, "pacemaker-%f.rng", - &next_version); + version_from_filename(namelist[lpc+1]->d_name, next_version); - if (floor(version) < floor(next_version)) { + if (version[0] < next_version[0]) { struct stat s; char *xslt = NULL; - transform = crm_strdup_printf("upgrade-%.1f.xsl", version); + transform = crm_strdup_printf("upgrade-%d.%d.xsl", + version[0], version[1]); xslt = get_schema_path(NULL, transform); if (stat(xslt, &s) != 0) { crm_err("Transform %s not found", xslt); @@ -292,9 +302,9 @@ crm_schema_init(void) } /* 1.1 was the old name for -next */ - __xml_schema_add(2, 0.0, "pacemaker-1.1", "pacemaker-next.rng", NULL, 0); - __xml_schema_add(2, 0.0, "pacemaker-next", "pacemaker-next.rng", NULL, -1); - __xml_schema_add(0, 0.0, "none", "N/A", NULL, -1); + __xml_schema_add(2, zero, "pacemaker-1.1", "pacemaker-next.rng", NULL, 0); + __xml_schema_add(2, zero, "pacemaker-next", "pacemaker-next.rng", NULL, -1); + __xml_schema_add(0, zero, "none", "N/A", NULL, -1); free(namelist); }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor