@@ -403,15 +403,28 @@ static int functionality_level_check(char *line)
403403
404404static 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