diff --git a/base/include/util/string.h b/base/include/util/string.h index b43b5f19e3..b5e7beb180 100644 --- a/base/include/util/string.h +++ b/base/include/util/string.h @@ -49,6 +49,29 @@ namespace Genode { } + /** + * Simple memmove + * + * \param dst destination memory block + * \param src source memory block + * \param size number of bytes to move + * + * \return pointer to destination memory block + */ + inline void *memmove(void *dst, const void *src, size_t size) + { + char *d = (char *)dst, *s = (char *)src; + size_t i; + + if (s > d) + for (i = 0; i < size; i++, *d++ = *s++); + else + for (s += size - 1, d += size - 1, i = size; i-- > 0; *d-- = *s--); + + return dst; + } + + /** * Copy memory block * @@ -63,6 +86,10 @@ namespace Genode { char *d = (char *)dst, *s = (char *)src; size_t i; + /* check for overlap */ + if ((d + size > s) && (s + size > d)) + return memmove(dst, src, size); + /* try cpu specific version first */ if ((i = size - memcpy_cpu(dst, src, size)) == size) return dst; @@ -86,13 +113,6 @@ namespace Genode { } - /** - * Memmove wrapper for sophisticated overlapping-aware memcpy - */ - inline void *memmove(void *dst, const void *src, size_t size) { - return memcpy(dst, src, size); } - - /** * Copy string *