Properly bzero unaligned small blocks. Fixes #11184.
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 15 Mar 2013 20:30:15 +0000 (16:30 -0400)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 15 Mar 2013 20:30:15 +0000 (16:30 -0400)
mcs/class/corlib/Test/System/ArrayTest.cs
mono/metadata/gc.c

index 668fee1d63b62eb95584835501cb5f4292dd1ff7..4c74ee9d3d447f36f1acebe0d60d2c0ec11310a5 100644 (file)
@@ -3292,6 +3292,16 @@ public class ArrayTest
                }
        }
 
+       [Test] //bxc #11184
+       public void UnalignedArrayClear ()
+       {
+               byte[] input = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
+               byte[] expected = new byte[] { 1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+               Array.Clear (input, 5, 11);
+               
+               Assert.AreEqual (input, expected);
+       }
+
 #if NET_4_0
        [Test]
        [ExpectedException (typeof (ArgumentException))]
index 60c2b8b87edefdad1354885d67eb9ca28a1d391b..f0a6ef10c95fe8714d6884224cb9c6574eff6d69 100644 (file)
@@ -1604,16 +1604,16 @@ mono_gc_bzero (void *dest, size_t size)
        word_bytes = (size_t)align_down (size);
        switch (word_bytes) {
        case sizeof (void*) * 1:
-               BZERO_WORDS (dest, 1);
+               BZERO_WORDS (d, 1);
                break;
        case sizeof (void*) * 2:
-               BZERO_WORDS (dest, 2);
+               BZERO_WORDS (d, 2);
                break;
        case sizeof (void*) * 3:
-               BZERO_WORDS (dest, 3);
+               BZERO_WORDS (d, 3);
                break;
        case sizeof (void*) * 4:
-               BZERO_WORDS (dest, 4);
+               BZERO_WORDS (d, 4);
                break;
        default:
                memset (d, 0, word_bytes);