今回のバグは
if ((err = ...) != 0)
 goto fail;
 goto fail;
で、必ずerrに代入されるので、errを初期化しても防げないよ。