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