Is this goto appropriate?

As many of you know go to is usually signs of code smell. However, I thought that this could be an appropriate case and I would like confirmation or criticism.

Unnecessary sections such as called functions have been removed. Any non-standard function returns a int as a status, 0 is OK"; except linkedlist_open () which returns a pointer that could be NO if the system is out of memory

packagetarget_close () implements the necessary NO checks.

packagetarget * packagetarget_open ()
{
packagetarget * target = (packagetarget *) malloc (sizeof (packagetarget));

if (! target) returns NULL;

if (packagetarget_setname (target, ""))
goto crusher;
if (packagetarget_setsys (target, PACKAGETARGET_SYS))
goto crusher;
if (packagetarget_setarch (target, PACKAGETARGET_ARCH))
goto crusher;
if (packagetarget_setmin (target, PACKAGETARGET_MIN))
goto crusher;
if (packagetarget_setver (target, PACKAGETARGET_VER))
goto crusher;
if (packagetarget_setmax (target, PACKAGETARGET_MAX))
goto crusher;

linkedlist * comp = linkedlist_open ();

if (! comp) goto crusher;

target-> comp = comp;

return target;

mill:
packagetarget_close (target);
return NULL;
}

`` `