1. 05 10月, 2013 1 次提交
  2. 20 9月, 2013 1 次提交
    • R
      fix potential deadlock bug in libc-internal locking logic · e803829e
      Rich Felker 提交于
      if a multithreaded program became non-multithreaded (i.e. all other
      threads exited) while one thread held an internal lock, the remaining
      thread would fail to release the lock. the the program then became
      multithreaded again at a later time, any further attempts to obtain
      the lock would deadlock permanently.
      
      the underlying cause is that the value of libc.threads_minus_1 at
      unlock time might not match the value at lock time. one solution would
      be returning a flag to the caller indicating whether the lock was
      taken and needs to be unlocked, but there is a simpler solution: using
      the lock itself as such a flag.
      
      note that this flag is not needed anyway for correctness; if the lock
      is not held, the unlock code is harmless. however, the memory
      synchronization properties associated with a_store are costly on some
      archs, so it's best to avoid executing the unlock code when it is
      unnecessary.
      e803829e
  3. 20 7月, 2013 1 次提交
    • R
      harden realloc/free to detect simple overflows · 8389520e
      Rich Felker 提交于
      the sizes in the header and footer for a chunk should always match. if
      they don't, the program has definitely invoked undefined behavior, and
      the most likely cause is a simple overflow, either of a buffer in the
      block being freed or the one just below it.
      
      crashing here should not only improve security of buggy programs, but
      also aid in debugging, since the crash happens in a context where you
      have a pointer to the likely-overflowed buffer.
      8389520e
  4. 08 12月, 2012 1 次提交
    • R
      page-align initial brk value used by malloc in shared libc · b8ccf8e4
      Rich Felker 提交于
      this change fixes an obscure issue with some nonstandard kernels,
      where the initial brk syscall returns a pointer just past the end of
      bss rather than the beginning of a new page. in that case, the dynamic
      linker has already reclaimed the space between the end of bss and the
      page end for use by malloc, and memory corruption (allocating the same
      memory twice) will occur when malloc again claims it on the first call
      to brk.
      b8ccf8e4
  5. 15 9月, 2012 1 次提交
  6. 17 11月, 2011 1 次提交
    • R
      fix issue with excessive mremap syscalls on realloc · e5d78fe8
      Rich Felker 提交于
      CHUNK_SIZE macro was defined incorrectly and shaving off at least one
      significant bit in the size of mmapped chunks, resulting in the test
      for oldlen==newlen always failing and incurring a syscall. fortunately
      i don't think this issue caused any other observable behavior; the
      definition worked correctly for all non-mmapped chunks where its
      correctness matters more, since their lengths are always multiples of
      the alignment.
      e5d78fe8
  7. 23 8月, 2011 1 次提交
    • R
      use new a_crash() asm to optimize double-free handler. · 1c8bead3
      Rich Felker 提交于
      gcc generates extremely bad code (7 byte immediate mov) for the old
      null pointer write approach. it should be generating something like
      "xor %eax,%eax ; mov %al,(%eax)". in any case, using a dedicated
      crashing opcode accomplishes the same thing in one byte.
      1c8bead3
  8. 15 8月, 2011 1 次提交
    • R
      simplify and improve double-free check · ce7c6341
      Rich Felker 提交于
      a valid mmapped block will have an even (actually aligned) "extra"
      field, whereas a freed chunk on the heap will always have an in-use
      neighbor.
      
      this fixes a potential bug if mmap ever allocated memory below the
      main program/brk (in which case it would be wrongly-detected as a
      double-free by the old code) and allows the double-free check to work
      for donated memory outside of the brk area (or, in the future,
      secondary heap zones if support for their creation is added).
      ce7c6341
  9. 27 6月, 2011 1 次提交
  10. 12 6月, 2011 1 次提交
    • R
      malloc: cast size down to int in bin_index functions · 2afebbbc
      Rich Felker 提交于
      even if size_t was 32-bit already, the fact that the value was
      unsigned and that gcc is too stupid to figure out it would be positive
      as a signed quantity (due to the immediately-prior arithmetic and
      conditionals) results in gcc compiling the integer-to-float conversion
      as zero extension to 64 bits followed by an "fildll" (64 bit)
      instruction rather than a simple "fildl" (32 bit) instruction on x86.
      reportedly fildll is very slow on certain p4-class machines; even if
      not, the new code is slightly smaller.
      2afebbbc
  11. 07 6月, 2011 1 次提交
  12. 21 4月, 2011 1 次提交
  13. 05 4月, 2011 1 次提交
    • R
      fix rare but nasty under-allocation bug in malloc with large requests · b761bd19
      Rich Felker 提交于
      the bug appeared only with requests roughly 2*sizeof(size_t) to
      4*sizeof(size_t) bytes smaller than a multiple of the page size, and
      only for requests large enough to be serviced by mmap instead of the
      normal heap. it was only ever observed on 64-bit machines but
      presumably could also affect 32-bit (albeit with a smaller window of
      opportunity).
      b761bd19
  14. 02 4月, 2011 1 次提交
    • R
      avoid over-allocation of brk on first malloc · bf878582
      Rich Felker 提交于
      if init_malloc returns positive (successful first init), malloc will
      retry getting a chunk from the free bins rather than expanding the
      heap again. also pass init_malloc a hint for the size of the initial
      allocation.
      bf878582
  15. 24 3月, 2011 1 次提交
  16. 21 2月, 2011 1 次提交
    • R
      make malloc(0) return unique pointers rather than NULL · 26031da0
      Rich Felker 提交于
      this change is made with some reluctance, but i think it's for the
      best. correct programs must handle either behavior, so there is little
      advantage to having malloc(0) return NULL. and i managed to actually
      make the malloc code slightly smaller with this change.
      26031da0
  17. 12 2月, 2011 1 次提交