| Index: third_party/tcmalloc/chromium/src/free_list.cc
 | 
| ===================================================================
 | 
| --- third_party/tcmalloc/chromium/src/free_list.cc	(revision 157450)
 | 
| +++ third_party/tcmalloc/chromium/src/free_list.cc	(working copy)
 | 
| @@ -59,8 +59,10 @@
 | 
|  // head to NULL.
 | 
|  
 | 
|  
 | 
| +#include <limits>
 | 
|  #include <stddef.h>
 | 
|  #include "free_list.h"
 | 
| +#include "system-alloc.h"
 | 
|  
 | 
|  #if defined(TCMALLOC_USE_DOUBLYLINKED_FREELIST)
 | 
|  
 | 
| @@ -78,15 +80,28 @@
 | 
|    Log(kCrash, __FILE__, __LINE__, "Circular loop in list detected: ", next);
 | 
|  }
 | 
|  
 | 
| +inline void* MaskPtr(void* p) {
 | 
| +  // Maximize ASLR entropy and guarantee the result is an invalid address.
 | 
| +  const uintptr_t q = ~(reinterpret_cast<intptr_t>(TCMalloc_SystemAlloc) >> 13);
 | 
| +  // Do not mask NULL pointers, otherwise we could leak address state.
 | 
| +  if (p)
 | 
| +    return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(p) ^ q);
 | 
| +  return p;
 | 
| +}
 | 
| +
 | 
| +inline void* UnmaskPtr(void* p) {
 | 
| +  return MaskPtr(p);
 | 
| +}
 | 
| +
 | 
|  // Returns value of the |previous| pointer w/out running a sanity
 | 
|  // check.
 | 
|  inline void *FL_Previous_No_Check(void *t) {
 | 
| -  return reinterpret_cast<void**>(t)[1];
 | 
| +  return UnmaskPtr(reinterpret_cast<void**>(t)[1]);
 | 
|  }
 | 
|  
 | 
|  // Returns value of the |next| pointer w/out running a sanity check.
 | 
|  inline void *FL_Next_No_Check(void *t) {
 | 
| -  return reinterpret_cast<void**>(t)[0];
 | 
| +  return UnmaskPtr(reinterpret_cast<void**>(t)[0]);
 | 
|  }
 | 
|  
 | 
|  void *FL_Previous(void *t) {
 | 
| @@ -99,12 +114,12 @@
 | 
|  
 | 
|  inline void FL_SetPrevious(void *t, void *n) {
 | 
|    EnsureNonLoop(t, n);
 | 
| -  reinterpret_cast<void**>(t)[1] = n;
 | 
| +  reinterpret_cast<void**>(t)[1] = MaskPtr(n);
 | 
|  }
 | 
|  
 | 
|  inline void FL_SetNext(void *t, void *n) {
 | 
|    EnsureNonLoop(t, n);
 | 
| -  reinterpret_cast<void**>(t)[0] = n;
 | 
| +  reinterpret_cast<void**>(t)[0] = MaskPtr(n);
 | 
|  }
 | 
|  
 | 
|  } // namespace
 | 
| 
 |