Skip to content

Commit

Permalink
avpops: several pkg free in case of errors in fixup functions
Browse files Browse the repository at this point in the history
- cleaner pkg usage summary in case of errors at start up
  • Loading branch information
miconda committed Jul 16, 2017
1 parent 3d6bf97 commit 51009ab
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 4 deletions.
42 changes: 39 additions & 3 deletions src/modules/avpops/avpops.c
Expand Up @@ -212,7 +212,7 @@ static int fixup_db_avp(void** param, int param_no, int allow_scheme)
LM_ERR("no more pkg mem!\n");
return E_OUT_OF_MEM;
}
memset( sp, 0, sizeof(struct fis_param));
memset(sp, 0, sizeof(struct fis_param));

if ( (p=strchr(s.s,'/'))!=0)
{
Expand All @@ -227,8 +227,8 @@ static int fixup_db_avp(void** param, int param_no, int allow_scheme)
} else if (!strcasecmp("uuid",p)) {
flags|=AVPOPS_FLAG_UUID0;
} else {
LM_ERR("unknown flag "
"<%s>\n",p);
LM_ERR("unknown flag <%s>\n",p);
pkg_free(sp);
return E_UNSPEC;
}
}
Expand All @@ -239,6 +239,7 @@ static int fixup_db_avp(void** param, int param_no, int allow_scheme)
sp->u.s.s = (char*)pkg_malloc(strlen(s.s)+1);
if (sp->u.s.s==0) {
LM_ERR("no more pkg mem!!\n");
pkg_free(sp);
return E_OUT_OF_MEM;
}
sp->u.s.len = strlen(s.s);
Expand All @@ -251,6 +252,7 @@ static int fixup_db_avp(void** param, int param_no, int allow_scheme)
{
LM_ERR("bad param 1; "
"expected : $pseudo-variable or int/str value\n");
pkg_free(sp);
return E_UNSPEC;
}

Expand All @@ -275,6 +277,7 @@ static int fixup_db_avp(void** param, int param_no, int allow_scheme)
if ( parse_avp_db( s.s, dbp, allow_scheme)!=0 )
{
LM_ERR("parse failed\n");
pkg_free(dbp);
return E_UNSPEC;
}
*param=(void*)dbp;
Expand Down Expand Up @@ -379,6 +382,7 @@ static int fixup_delete_avp(void** param, int param_no)
if (ap->u.sval->type!=PVT_AVP)
{
LM_ERR("bad param; expected : $avp(name)\n");
pkg_free(ap);
return E_UNSPEC;
}
ap->opd|=AVPOPS_VAL_PVAR;
Expand Down Expand Up @@ -510,6 +514,7 @@ static int fixup_copy_avp(void** param, int param_no)
break;
default:
LM_ERR("bad flag <%c>\n",*p);
pkg_free(ap);
return E_UNSPEC;
}
}
Expand Down Expand Up @@ -556,13 +561,15 @@ static int fixup_pushto_avp(void** param, int param_no)
&& (ap->opd|=AVPOPS_FLAG_DOMAIN0)) ))
{
LM_ERR("unknown ruri flag \"%s\"!\n",p);
pkg_free(ap);
return E_UNSPEC;
}
break;
case PVT_DSTURI:
if ( p!=0 )
{
LM_ERR("unknown duri flag \"%s\"!\n",p);
pkg_free(ap);
return E_UNSPEC;
}
ap->opd = AVPOPS_VAL_NONE|AVPOPS_USE_DURI;
Expand All @@ -571,19 +578,22 @@ static int fixup_pushto_avp(void** param, int param_no)
/* what's the hdr destination ? request or reply? */
LM_ERR("push to header is obsoleted - use append_hf() "
"or append_to_reply() from textops module!\n");
pkg_free(ap);
return E_UNSPEC;
break;
case PVT_BRANCH:
if ( p!=0 )
{
LM_ERR("unknown branch flag \"%s\"!\n",p);
pkg_free(ap);
return E_UNSPEC;
}
ap->opd = AVPOPS_VAL_NONE|AVPOPS_USE_BRANCH;
break;
default:
LM_ERR("unsupported destination \"%s\"; "
"expected $ru,$du,$br\n",s);
pkg_free(ap);
return E_UNSPEC;
}
} else if (param_no==2) {
Expand Down Expand Up @@ -652,6 +662,7 @@ static int fixup_check_avp(void** param, int param_no)
if (ap->u.sval->type==PVT_NULL)
{
LM_ERR("null pseudo-variable in param 1\n");
pkg_free(ap);
return E_UNSPEC;
}
} else if (param_no==2) {
Expand All @@ -669,12 +680,14 @@ static int fixup_check_avp(void** param, int param_no)
if (re==0)
{
LM_ERR("no more pkg mem\n");
pkg_free(ap);
return E_OUT_OF_MEM;
}
LM_DBG("compiling regexp <%.*s>\n", ap->u.s.len, ap->u.s.s);
if (regcomp(re, ap->u.s.s,REG_EXTENDED|REG_ICASE|REG_NEWLINE))
{
pkg_free(re);
pkg_free(ap);
LM_ERR("bad re <%.*s>\n", ap->u.s.len, ap->u.s.s);
return E_BAD_RE;
}
Expand All @@ -686,6 +699,7 @@ static int fixup_check_avp(void** param, int param_no)
{
LM_ERR("fast_match operation requires string value or "
"avp name/alias (%d/%d)\n", ap->opd, ap->ops);
pkg_free(ap);
return E_UNSPEC;
}
}
Expand Down Expand Up @@ -723,18 +737,22 @@ static int fixup_subst(void** param, int param_no)
if (ap==0)
{
LM_ERR("unable to get pseudo-variable in param 2 [%s]\n", s);
pkg_free(av);
return E_OUT_OF_MEM;
}
if (ap->u.sval->type!=PVT_AVP)
{
LM_ERR("bad attribute name <%s>\n", (char*)*param);
pkg_free(av);
pkg_free(ap);
return E_UNSPEC;
}
/* attr name is mandatory */
if (ap->opd&AVPOPS_VAL_NONE)
{
LM_ERR("you must specify a name for the AVP\n");
pkg_free(av);
pkg_free(ap);
return E_UNSPEC;
}
av[0] = ap;
Expand All @@ -743,6 +761,7 @@ static int fixup_subst(void** param, int param_no)
*param=(void*)av;
return 0;
}
ap = 0;

/* dst || flags */
s = p;
Expand All @@ -756,19 +775,23 @@ static int fixup_subst(void** param, int param_no)
if (ap==0)
{
LM_ERR("unable to get pseudo-variable in param 2 [%s]\n",s);
pkg_free(av);
return E_OUT_OF_MEM;
}

if (ap->u.sval->type!=PVT_AVP)
{
LM_ERR("bad attribute name <%s>!\n", s);
pkg_free(av);
pkg_free(ap);
return E_UNSPEC;
}
/* attr name is mandatory */
if (ap->opd&AVPOPS_VAL_NONE)
{
LM_ERR("you must specify a name for the AVP!\n");
pkg_free(av);
pkg_free(ap);
return E_UNSPEC;
}
av[1] = ap;
Expand All @@ -794,6 +817,9 @@ static int fixup_subst(void** param, int param_no)
break;
default:
LM_ERR("bad flag <%c>\n",*p);
pkg_free(av[0]);
if(av[1]) pkg_free(av[1]);
pkg_free(av);
return E_UNSPEC;
}
}
Expand Down Expand Up @@ -843,11 +869,13 @@ static int fixup_op_avp(void** param, int param_no)
if (av[0]==0)
{
LM_ERR("unable to get pseudo-variable in param 1\n");
pkg_free(av);
return E_OUT_OF_MEM;
}
if (av[0]->u.sval->type!=PVT_AVP)
{
LM_ERR("bad attribute name <%s>\n", (char*)*param);
pkg_free(av[0]);
pkg_free(av);
return E_UNSPEC;
}
Expand All @@ -862,11 +890,14 @@ static int fixup_op_avp(void** param, int param_no)
if (ap==0)
{
LM_ERR("unable to get pseudo-variable in param 1 (2)\n");
pkg_free(av[0]);
pkg_free(av);
return E_OUT_OF_MEM;
}
if (ap->u.sval->type!=PVT_AVP)
{
LM_ERR("bad attribute name/alias <%s>!\n", s);
pkg_free(av[0]);
pkg_free(av);
return E_UNSPEC;
}
Expand All @@ -883,6 +914,7 @@ static int fixup_op_avp(void** param, int param_no)
if ( (ap->opd&AVPOPS_VAL_STR)!=0 && (ap->opd&AVPOPS_VAL_PVAR)==0)
{
LM_ERR("operations requires integer values\n");
pkg_free(ap);
return E_UNSPEC;
}
*param=(void*)ap;
Expand Down Expand Up @@ -913,6 +945,7 @@ static int fixup_is_avp_set(void** param, int param_no)
if (ap->u.sval->type!=PVT_AVP)
{
LM_ERR("bad attribute name <%s>\n", (char*)*param);
pkg_free(ap);
return E_UNSPEC;
}
if(p==0 || *p=='\0')
Expand All @@ -931,6 +964,7 @@ static int fixup_is_avp_set(void** param, int param_no)
if(ap->ops&AVPOPS_FLAG_CASTS)
{
LM_ERR("invalid flag combination <%c> and 's|S'\n",*p);
pkg_free(ap);
return E_UNSPEC;
}
ap->ops|=AVPOPS_FLAG_CASTN;
Expand All @@ -940,12 +974,14 @@ static int fixup_is_avp_set(void** param, int param_no)
if(ap->ops&AVPOPS_FLAG_CASTN)
{
LM_ERR("invalid flag combination <%c> and 'n|N'\n",*p);
pkg_free(ap);
return E_UNSPEC;
}
ap->ops|=AVPOPS_FLAG_CASTS;
break;
default:
LM_ERR("bad flag <%c>\n",*p);
pkg_free(ap);
return E_UNSPEC;
}
}
Expand Down
1 change: 1 addition & 0 deletions src/modules/avpops/avpops_db.c
Expand Up @@ -136,6 +136,7 @@ int avp_add_db_scheme( modparam_t type, void* val)

return 0;
error:
if(scheme) pkg_free(scheme);
return -1;
}

Expand Down
3 changes: 2 additions & 1 deletion src/modules/avpops/avpops_parse.c
Expand Up @@ -237,7 +237,7 @@ int parse_avp_db(char *s, struct db_param *dbp, int allow_scheme)

struct fis_param* parse_intstr_value(char *p, int len)
{
struct fis_param *vp;
struct fis_param *vp = 0;
unsigned int uint;
str val_str;
int flags;
Expand Down Expand Up @@ -313,6 +313,7 @@ struct fis_param* parse_intstr_value(char *p, int len)

return vp;
error:
if(vp) pkg_free(vp);
return 0;
}

Expand Down

0 comments on commit 51009ab

Please sign in to comment.