typically i've seen gotos which creep up the list as new things are allocated

foo = malloc(10);
if (!foo) goto cleannone;
bar = malloc(10);
if (!bar) goto cleanfoo;
baz = malloc(10);
if (!baz) goto cleanbar;

free(baz)
cleanbar:
free(bar);
cleanfoo:
free(foo);
cleannone
return;