Skip to content
  • Jeff King's avatar
    avoid sprintf and strcpy with flex arrays · c7ab0ba3
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When we are allocating a struct with a FLEX_ARRAY member, we
    generally compute the size of the array and then sprintf or
    strcpy into it. Normally we could improve a dynamic allocation
    like this by using xstrfmt, but it doesn't work here; we
    have to account for the size of the rest of the struct.
    
    But we can improve things a bit by storing the length that
    we use for the allocation, and then feeding it to xsnprintf
    or memcpy, which makes it more obvious that we are not
    writing more than the allocated number of bytes.
    
    It would be nice if we had some kind of helper for
    allocating generic flex arrays, but it doesn't work that
    well:
    
     - the call signature is a little bit unwieldy:
    
          d = flex_struct(sizeof(*d), offsetof(d, path), fmt, ...);
    
       You need offsetof here instead of just writing to the
       end of the base size, because we don't know how the
       struct is packed (partially this is because FLEX_ARRAY
       might not be zero, though we can account for that; but
       the size of the struct may actually be rounded up for
       alignment, and we can't know that).
    
     - some sites do clever things, like over-allocating because
       they know they will write larger things into the buffer
       later (e.g., struct packed_git here).
    
    So we're better off to just write out each allocation (or
    add type-specific helpers, though many of these are one-off
    allocations anyway).
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    c7ab0ba3