Unix v6 Ported to ANSI C
There is a bug in the memmove() function from ulib.c:    void*
    memmove(void *vdst, void *vsrc, int n)
    {
      char *dst, *src;
  
      dst = vdst;
      src = vsrc;
      while(n-- > 0)
        *dst++ = *src++;
      return vdst;
    }

If the two blocks overlap, and the address of dst is greater than the address of src, then parts of the source will be overwritten before it can be copied.