Browse code

Adds version string comparison logic to prevent freshclam from thinking a newer version is out of date.

Micah Snyder authored on 2019/08/07 06:59:11
Showing 1 changed files
... ...
@@ -379,6 +379,41 @@ done:
379 379
     return status;
380 380
 }
381 381
 
382
+/**
383
+ * @brief Compare two version strings.
384
+ *
385
+ * @param v1 Version string 1
386
+ * @param v2 Version string 2
387
+ * @return int 1 if v1 is greater, 0 if equal, -1 if smaller.
388
+ */
389
+int version_string_compare(char *v1, size_t v1_len, char *v2, size_t v2_len)
390
+{
391
+    size_t i, j;
392
+    int vnum1 = 0, vnum2 = 0;
393
+
394
+    for (i = 0, j = 0; (i < v1_len || j < v2_len);) {
395
+        while (i < v1_len && v1[i] != '.') {
396
+            vnum1 = vnum1 * 10 + (v1[i] - '0');
397
+            i++;
398
+        }
399
+
400
+        while (j < v2_len && v2[j] != '.') {
401
+            vnum2 = vnum2 * 10 + (v2[j] - '0');
402
+            j++;
403
+        }
404
+
405
+        if (vnum1 > vnum2)
406
+            return 1;
407
+        if (vnum2 > vnum1)
408
+            return -1;
409
+
410
+        vnum1 = vnum2 = 0;
411
+        i++;
412
+        j++;
413
+    }
414
+    return 0;
415
+}
416
+
382 417
 fc_error_t fc_test_database(const char *dbFilename, int bBytecodeEnabled)
383 418
 {
384 419
     fc_error_t status        = FC_EARG;
... ...
@@ -528,8 +563,8 @@ fc_error_t fc_dns_query_update_info(
528 528
 
529 529
             char *suffix = strchr(version_string, '-');
530 530
 
531
-            if ((suffix && strncmp(version_string, reply_token, suffix - version_string)) ||
532
-                (!suffix && strcmp(version_string, reply_token))) {
531
+            if ((suffix && (0 > version_string_compare(version_string, suffix - version_string, reply_token, strlen(reply_token)))) ||
532
+                (!suffix && (0 > version_string_compare(version_string, strlen(version_string), reply_token, strlen(reply_token))))) {
533 533
 
534 534
                 logg("^Your ClamAV installation is OUTDATED!\n");
535 535
                 logg("^Local version: %s Recommended version: %s\n", version_string, reply_token);