diff options
Diffstat (limited to 'rpmio/macro.c')
-rw-r--r-- | rpmio/macro.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/rpmio/macro.c b/rpmio/macro.c index f5488a685..9667d71e2 100644 --- a/rpmio/macro.c +++ b/rpmio/macro.c @@ -691,16 +691,21 @@ pushMacro(rpmMacroEntry * mep, static void popMacro(rpmMacroEntry * mep) { - rpmMacroEntry me = (*mep ? *mep : NULL); - - if (me) { - /* XXX cast to workaround const */ - if ((*mep = me->prev) == NULL) - me->name = _free(me->name); - me->opts = _free(me->opts); - me->body = _free(me->body); - me = _free(me); - } + if (mep && *mep) { + rpmMacroEntry me = *mep; + + /* restore previous definition of the macro */ + *mep = me->prev; + + /* name is shared between entries, only free if last of its kind */ + if (me->prev == NULL) + free(me->name); + free(me->opts); + free(me->body); + + memset(me, 0, sizeof(*me)); /* trash and burn */ + free(me); + } } /** |