rem: spec = xmalloc (strlen (user) + 1 + strlen (group) + 1); stpcpy (stpcpy (stpcpy (spec, user), ":"), group); spec_allocated = 1;
add: spec_allocated = xmalloc (strlen (user) + 1 + strlen (group) + 1); stpcpy (stpcpy (stpcpy (spec_allocated, user), ":"), group); spec = spec_allocated;
context: describe_change (const char *file, enum Change_status changed,		 char const *user, char const *group){  const char *fmt;  char *spec;  int spec_allocated = 0;  if (changed == CH_NOT_APPLIED)    {      printf (_("neither symbolic link %s nor referent has been changed\n"),	      quote (file));      return;    }  if (user)    {      if (group)	{	  spec = xmalloc (strlen (user) + 1 + strlen (group) + 1);	  stpcpy (stpcpy (stpcpy (spec, user), ":"), group);	  spec_allocated = 1;	}      else	{	  spec = (char *) user;	}    }  else    {      spec = (char *) group;    }  switch (changed)    {    case CH_SUCCEEDED:      fmt = (user	     ? _("changed ownership of %s to %s\n")	     : _("changed group of %s to %s\n"));      break;    case CH_FAILED:      fmt = (user	     ? _("failed to change ownership of %s to %s\n")	     : _("failed to change group of %s to %s\n"));      break;    case CH_NO_CHANGE_REQUESTED:      fmt = (user	     ? _("ownership of %s retained as %s\n")	     : _("group of %s retained as %s\n"));      break;    default:      abort ();    }  printf (fmt, quote (file), spec);  if (spec_allocated)    free (spec);}