• Show log

    Commit

  • Hash : 208f1d7a
    Author : Patrick Steinhardt
    Date : 2019-09-19T12:46:37

    buffer: fix infinite loop when growing buffers
    
    When growing buffers, we repeatedly multiply the currently allocated
    number of bytes by 1.5 until it exceeds the requested number of bytes.
    This has two major problems:
    
        1. If the current number of bytes is tiny and one wishes to resize
           to a comparatively huge number of bytes, then we may need to loop
           thousands of times.
    
        2. If resizing to a value close to `SIZE_MAX` (which would fail
           anyway), then we probably hit an infinite loop as multiplying the
           current amount of bytes will repeatedly result in integer
           overflows.
    
    When reallocating buffers, one typically chooses values close to 1.5 to
    enable re-use of resulting memory holes in later reallocations. But
    because of this, it really only makes sense to use a factor of 1.5
    _once_, but not looping until we finally are able to fit it. Thus, we
    can completely avoid the loop and just opt for the much simpler
    algorithm of multiplying with 1.5 once and, if the result doesn't fit,
    just use the target size. This avoids both problems of looping
    extensively and hitting overflows.
    
    This commit also adds a test that would've previously resulted in an
    infinite loop.