I have a litany of reasons why you shouldn't bother checking malloc returns, and instead invest a little effort in making sure your platform malloc is configured to abort instead of returning NULL. The simplest and most compelling of those reasons is that it's easier and cleaner.
I'm also not a fan of a macro that introduces an implicit dependency on a goto label.
do { } while(0)
is a pretty convenient way of expressing single-return; you just use "break" instead of "return".