そもそも
 #define FREE(p) do{ free(p); (p) = NULL;}while(0)
↑これ自体がだめなコードだと思う。