Skip to content

Commit

Permalink
Freshclam: fix issue DatabaseCustomURL CVD prune issue
Browse files Browse the repository at this point in the history
If using DatabaseCustomURL to download a CVD that Freshclam doesn't know
about, i.e. one that is not in the hardcoded standard or optional
database lists in freshclam.c, Freshclam will prune the database and
then re-download it.

This change makes it so we look for URL's with ".cvd" at the end and
then take those into consideration when checking which CVD's (or CLD's)
should be pruned.

Note that I didn't change the interface to
fc_prune_database_directory(). That would have been cleaner, but
would've changed the public API and I want to backport this fix.
  • Loading branch information
micahsnyder committed Apr 15, 2024
1 parent e422c12 commit d36280b
Showing 1 changed file with 46 additions and 1 deletion.
47 changes: 46 additions & 1 deletion freshclam/freshclam.c
Original file line number Diff line number Diff line change
Expand Up @@ -1453,6 +1453,10 @@ fc_error_t perform_database_update(
uint32_t nUpdated = 0;
uint32_t nTotalUpdated = 0;

uint32_t i;
char **doNotPruneDatabaseList = NULL;
uint32_t nDoNotPruneDatabases = 0;

STATBUF statbuf;

if (NULL == serverList) {
Expand All @@ -1473,7 +1477,38 @@ fc_error_t perform_database_update(
* Prune database directory of official databases
* that are no longer available or no longer desired.
*/
(void)fc_prune_database_directory(databaseList, nDatabases);

// include the URL databases in the prune process
doNotPruneDatabaseList = (char **)malloc(sizeof(char *) * (nDatabases + nUrlDatabases));
if (NULL == doNotPruneDatabaseList) {
logg(LOGG_ERROR, "perform_database_update: Can't allocate memory for doNotPruneDatabaseList\n");
status = FC_EMEM;
goto done;
}

for (i = 0; i < nDatabases; i++) {
doNotPruneDatabaseList[i] = strdup(databaseList[i]);
if (doNotPruneDatabaseList[i] == NULL) {
logg(LOGG_ERROR, "perform_database_update: Can't allocate memory for database name in doNotPruneDatabaseList\n");
status = FC_EMEM;
goto done;
}
}
nDoNotPruneDatabases = nDatabases;

for (i = 0; i < nUrlDatabases; i++) {
// Only append the URL databases that end with '.cvd'
if (strlen(urlDatabaseList[i]) > 4 && 0 == strcasecmp(urlDatabaseList[i] + strlen(urlDatabaseList[i]) - 4, ".cvd")) {
const char *startOfFilename = strrchr(urlDatabaseList[i], '/') + 1;
if (NULL != startOfFilename) {
// Add the base database name to the do-not-prune list, excluding the '.cvd' extension.
doNotPruneDatabaseList[nDatabases + i] = CLI_STRNDUP(startOfFilename, strlen(startOfFilename) - strlen(".cvd"));
nDoNotPruneDatabases++;
}
}
}

(void)fc_prune_database_directory(doNotPruneDatabaseList, nDoNotPruneDatabases);
}

/*
Expand Down Expand Up @@ -1544,6 +1579,16 @@ fc_error_t perform_database_update(

done:

// Free up the database list
if (NULL != doNotPruneDatabaseList) {
for (i = 0; i < nDoNotPruneDatabases; i++) {
free(doNotPruneDatabaseList[i]);
doNotPruneDatabaseList[i] = NULL;
}
free(doNotPruneDatabaseList);
doNotPruneDatabaseList = NULL;
}

if (LSTAT(g_freshclamTempDirectory, &statbuf) != -1) {
/* Remove temp directory */
if (*g_freshclamTempDirectory) {
Expand Down

0 comments on commit d36280b

Please sign in to comment.