Fix sscanf() format string type mismatch.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 14 Dec 2015 21:25:02 +0000 (15:25 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 14 Dec 2015 22:22:25 +0000 (16:22 -0600)
ASTERISK-25615
Reported by: George Joseph

Change-Id: Ieff35307254ca193f3d473cff2e396ca57c7ce0b

include/asterisk/utils.h
main/utils.c

index cfb78c0..c7a4737 100644 (file)
@@ -1105,9 +1105,10 @@ int ast_file_is_readable(const char *filename);
  *
  * \param version1.
  * \param version2.
- * \return -1 if version 1 < version 2.
- * \return 0 if version 1 = version 2.
- * \return 1 if version 1 > version 2.
+ *
+ * \return <0 if version 1 < version 2.
+ * \return =0 if version 1 = version 2.
+ * \return >0 if version 1 > version 2.
  */
 int ast_compare_versions(const char *version1, const char *version2);
 
index b4c494e..5cebed1 100644 (file)
@@ -2953,23 +2953,26 @@ int ast_file_is_readable(const char *filename)
 
 int ast_compare_versions(const char *version1, const char *version2)
 {
-       u_int64_t major[2] = { 0 };
-       u_int64_t minor[2] = { 0 };
-       u_int64_t patch[2] = { 0 };
-       u_int64_t extra[2] = { 0 };
-       u_int64_t v1, v2;
-
-       sscanf(version1, "%lu.%lu.%lu.%lu", &major[0], &minor[0], &patch[0], &extra[0]);
-       sscanf(version2, "%lu.%lu.%lu.%lu", &major[1], &minor[1], &patch[1], &extra[1]);
+       unsigned int major[2] = { 0 };
+       unsigned int minor[2] = { 0 };
+       unsigned int patch[2] = { 0 };
+       unsigned int extra[2] = { 0 };
+       int res;
 
-       v1 = major[0] << 48 | minor[0] << 32 | patch[0] << 16 | extra[0];
-       v2 = major[1] << 48 | minor[1] << 32 | patch[1] << 16 | extra[1];
+       sscanf(version1, "%u.%u.%u.%u", &major[0], &minor[0], &patch[0], &extra[0]);
+       sscanf(version2, "%u.%u.%u.%u", &major[1], &minor[1], &patch[1], &extra[1]);
 
-       if (v1 < v2) {
-               return -1;
-       } else if (v1 > v2) {
-               return 1;
-       } else {
-               return 0;
+       res = major[0] - major[1];
+       if (res) {
+               return res;
+       }
+       res = minor[0] - minor[1];
+       if (res) {
+               return res;
+       }
+       res = patch[0] - patch[1];
+       if (res) {
+               return res;
        }
+       return extra[0] - extra[1];
 }