In case of horizontal blitting of less than width of blitted area,
memcpy is used on overlapping areas which is not allowed. The behavior
is undefined in such case, probably leading to graphical artifact when
blitting in specific direction.
---
 fb/fb.h    |   14 ++++++++++----
 fb/fbblt.c |    4 ++--
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/fb/fb.h b/fb/fb.h
index b327ce6..b4f2ffd 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -49,11 +49,17 @@
 #define WRITE(ptr, val) ((*wfbWriteMemory)((ptr), (val), sizeof(*(ptr))))
 #define READ(ptr) ((*wfbReadMemory)((ptr), sizeof(*(ptr))))
 
-#define MEMCPY_WRAPPED(dst, src, size) do {                       \
+#define MEMMOVE_WRAPPED(dst, src, size) do {                      \
     size_t _i;                                                    \
     CARD8 *_dst = (CARD8*)(dst), *_src = (CARD8*)(src);           \
-    for(_i = 0; _i < size; _i++) {                                \
-        WRITE(_dst +_i, READ(_src + _i));                         \
+    if(_src < _dst) {                                             \
+        for(_i = 0; _i < size; _i++) {                            \
+            WRITE(_dst +_i, READ(_src + _i));                     \
+        }                                                         \
+    } else {                                                      \
+        for(_i = 0; _i < size; _i++) {                            \
+            WRITE(_dst + size - _i - 1, READ(_src + size - _i - 1)); \
+        }                                                         \
     }                                                             \
 } while(0)
 
@@ -70,7 +76,7 @@
 #define FBPREFIX(x) fb##x
 #define WRITE(ptr, val) (*(ptr) = (val))
 #define READ(ptr) (*(ptr))
-#define MEMCPY_WRAPPED(dst, src, size) memcpy((dst), (src), (size))
+#define MEMMOVE_WRAPPED(dst, src, size) memmove((dst), (src), (size))
 #define MEMSET_WRAPPED(dst, val, size) memset((dst), (val), (size))
 
 #endif
diff --git a/fb/fbblt.c b/fb/fbblt.c
index 17bd698..b4dfeb7 100644
--- a/fb/fbblt.c
+++ b/fb/fbblt.c
@@ -84,10 +84,10 @@ fbBlt(FbBits * srcLine,
 
         if (!upsidedown)
             for (i = 0; i < height; i++)
-                MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, 
width);
+                MEMMOVE_WRAPPED(dst + i * dstStride, src + i * srcStride, 
width);
         else
             for (i = height - 1; i >= 0; i--)
-                MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, 
width);
+                MEMMOVE_WRAPPED(dst + i * dstStride, src + i * srcStride, 
width);
 
         return;
     }
-- 
1.7.7


_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to