Skip to content

Commit d02e948

Browse files
committed
Handle case of empty regex in database
1 parent ebe59ef commit d02e948

1 file changed

Lines changed: 44 additions & 19 deletions

File tree

libclamav/regex_list.c

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -403,15 +403,28 @@ static int functionality_level_check(char *line)
403403

404404
static int add_hash(struct regex_matcher *matcher, char *pattern, const char fl, int is_prefix)
405405
{
406-
int rc;
407-
struct cli_bm_patt *pat = MPOOL_CALLOC(matcher->mempool, 1, sizeof(*pat));
408-
struct cli_matcher *bm;
409-
const char *vname = NULL;
410-
if (!pat)
411-
return CL_EMEM;
406+
int rc = CL_SUCCESS;
407+
struct cli_bm_patt *pat = NULL;
408+
struct cli_matcher *bm = NULL;
409+
const char *vname = NULL;
410+
bool patternAdded = false;
411+
412+
if (0 == strlen(pattern)) {
413+
cli_errmsg("add_hash: Invalid pattern '%s' in database\n", pattern);
414+
rc = CL_EMALFDB;
415+
goto done;
416+
}
417+
418+
pat = MPOOL_CALLOC(matcher->mempool, 1, sizeof(*pat));
419+
if (!pat) {
420+
rc = CL_EMEM;
421+
goto done;
422+
}
412423
pat->pattern = (unsigned char *)CLI_MPOOL_HEX2STR(matcher->mempool, pattern);
413-
if (!pat->pattern)
414-
return CL_EMALFDB;
424+
if (!pat->pattern) {
425+
rc = CL_EMALFDB;
426+
goto done;
427+
}
415428
pat->length = 32;
416429
if (is_prefix) {
417430
pat->length = 4;
@@ -422,7 +435,7 @@ static int add_hash(struct regex_matcher *matcher, char *pattern, const char fl,
422435

423436
if (!matcher->sha256_pfx_set.keys) {
424437
if ((rc = cli_hashset_init(&matcher->sha256_pfx_set, 1048576, 90))) {
425-
return rc;
438+
goto done;
426439
}
427440
}
428441

@@ -432,27 +445,39 @@ static int add_hash(struct regex_matcher *matcher, char *pattern, const char fl,
432445
if (*vname == 'W') {
433446
/* hash is allowed in local.gdb */
434447
cli_dbgmsg("Skipping hash %s\n", pattern);
435-
MPOOL_FREE(matcher->mempool, pat->pattern);
436-
MPOOL_FREE(matcher->mempool, pat);
437-
return CL_SUCCESS;
448+
rc = CL_SUCCESS;
449+
goto done;
438450
}
439451
}
440452
pat->virname = MPOOL_MALLOC(matcher->mempool, 1);
441453
if (!pat->virname) {
442-
free(pat);
443454
cli_errmsg("add_hash: Unable to allocate memory for path->virname\n");
444-
return CL_EMEM;
455+
rc = CL_EMEM;
456+
goto done;
445457
}
446458
*pat->virname = fl;
447459
cli_hashset_addkey(&matcher->sha256_pfx_set, cli_readint32(pat->pattern));
448460
if ((rc = cli_bm_addpatt(bm, pat, "*"))) {
449461
cli_errmsg("add_hash: failed to add BM pattern\n");
450-
free(pat->pattern);
451-
free(pat->virname);
452-
free(pat);
453-
return CL_EMALFDB;
462+
rc = CL_EMALFDB;
463+
goto done;
454464
}
455-
return CL_SUCCESS;
465+
466+
patternAdded = true;
467+
done:
468+
if (!patternAdded) {
469+
if (pat) {
470+
if (pat->pattern) {
471+
MPOOL_FREE(matcher->mempool, pat->pattern);
472+
}
473+
if (pat->virname) {
474+
MPOOL_FREE(matcher->mempool, pat->virname);
475+
}
476+
MPOOL_FREE(matcher->mempool, pat);
477+
}
478+
}
479+
480+
return rc;
456481
}
457482

458483
/* Load patterns/regexes from file */

0 commit comments

Comments
 (0)