... | ... |
@@ -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); |