static void value_cleanup (struct value *v) { if (v->parent || !LinkedList0_IsEmpty(&v->refs_list)) { return; } switch (v->type) { case NCDVALUE_STRING: { free(v->string.string); } break; case NCDVALUE_LIST: { while (value_list_len(v) > 0) { struct value *ev = value_list_at(v, 0); value_list_remove(v, ev); value_cleanup(ev); } } break; case NCDVALUE_MAP: { while (value_map_len(v) > 0) { struct value *ev = value_map_at(v, 0); value_map_remove(v, ev); value_cleanup(ev); } } break; default: ASSERT(0); } free(v); }
static void delete_action(union pa_policy_context_action **actions, union pa_policy_context_action *action) { union pa_policy_context_action *last; struct pa_policy_set_property *setprop; for (last = (union pa_policy_context_action *)actions; last->any.next != NULL; last = last->any.next) { if (last->any.next == action) { last->any.next = action->any.next; switch (action->any.type) { case pa_policy_set_property: setprop = &action->setprop; match_cleanup(&setprop->object.match); pa_xfree(setprop->property); value_cleanup(&setprop->value); break; case pa_policy_set_default: /* no-op */ break; default: pa_log("%s(): confused with data structure: invalid action " "type %d", __FUNCTION__, action->any.type); return; /* better to leak than corrupt :) */ } pa_xfree(action); return; } } pa_log("%s(): confused with data structures: can't find action", __FUNCTION__); }