そもそも buffer が unsigned short int * だろう。
malloc の cast も無駄。