if ((xdrp->x_handy -= need) < 0) return FALSE; because by repeatedly calling this we can cause overflow, and then overwrite valid memory. Instead do: if (xdrp->x_handy < need) return FALSE; xdrp->x_handy -= need;