00db10
commit b50dd3bc8cbb1efe85399b03d7e6c0310c2ead84
00db10
Author: Florian Weimer <fw@deneb.enyo.de>
00db10
Date:   Mon Dec 31 22:04:36 2018 +0100
00db10
00db10
    malloc: Always call memcpy in _int_realloc [BZ #24027]
00db10
    
00db10
    This commit removes the custom memcpy implementation from _int_realloc
00db10
    for small chunk sizes.  The ncopies variable has the wrong type, and
00db10
    an integer wraparound could cause the existing code to copy too few
00db10
    elements (leaving the new memory region mostly uninitialized).
00db10
    Therefore, removing this code fixes bug 24027.
00db10
00db10
diff -rup a/malloc/malloc.c b/malloc/malloc.c
00db10
--- a/malloc/malloc.c	2019-03-26 14:12:59.364333388 -0400
00db10
+++ b/malloc/malloc.c	2019-03-26 14:17:17.373475418 -0400
00db10
@@ -4214,11 +4214,6 @@ _int_realloc(mstate av, mchunkptr oldp,
00db10
   mchunkptr        bck;             /* misc temp for linking */
00db10
   mchunkptr        fwd;             /* misc temp for linking */
00db10
 
00db10
-  unsigned long    copysize;        /* bytes to copy */
00db10
-  unsigned int     ncopies;         /* INTERNAL_SIZE_T words to copy */
00db10
-  INTERNAL_SIZE_T* s;               /* copy source */
00db10
-  INTERNAL_SIZE_T* d;               /* copy destination */
00db10
-
00db10
   const char *errstr = NULL;
00db10
 
00db10
   /* oldmem size */
00db10
@@ -4291,39 +4286,7 @@ _int_realloc(mstate av, mchunkptr oldp,
00db10
 	newp = oldp;
00db10
       }
00db10
       else {
00db10
-	/*
00db10
-	  Unroll copy of <= 36 bytes (72 if 8byte sizes)
00db10
-	  We know that contents have an odd number of
00db10
-	  INTERNAL_SIZE_T-sized words; minimally 3.
00db10
-	*/
00db10
-
00db10
-	copysize = oldsize - SIZE_SZ;
00db10
-	s = (INTERNAL_SIZE_T*)(chunk2mem(oldp));
00db10
-	d = (INTERNAL_SIZE_T*)(newmem);
00db10
-	ncopies = copysize / sizeof(INTERNAL_SIZE_T);
00db10
-	assert(ncopies >= 3);
00db10
-
00db10
-	if (ncopies > 9)
00db10
-	  MALLOC_COPY(d, s, copysize);
00db10
-
00db10
-	else {
00db10
-	  *(d+0) = *(s+0);
00db10
-	  *(d+1) = *(s+1);
00db10
-	  *(d+2) = *(s+2);
00db10
-	  if (ncopies > 4) {
00db10
-	    *(d+3) = *(s+3);
00db10
-	    *(d+4) = *(s+4);
00db10
-	    if (ncopies > 6) {
00db10
-	      *(d+5) = *(s+5);
00db10
-	      *(d+6) = *(s+6);
00db10
-	      if (ncopies > 8) {
00db10
-		*(d+7) = *(s+7);
00db10
-		*(d+8) = *(s+8);
00db10
-	      }
00db10
-	    }
00db10
-	  }
00db10
-	}
00db10
-
00db10
+	memcpy (newmem, chunk2mem (oldp), oldsize - SIZE_SZ);
00db10
 	_int_free(av, oldp, 1);
00db10
 	check_inuse_chunk(av, newp);
00db10
 	return chunk2mem(newp);