• Show log

    Commit

  • Hash : b7dcea04
    Author : Patrick Steinhardt
    Date : 2019-09-26T15:06:12

    config_entries: micro-optimize storage of multivars
    
    Multivars are configuration entries that have many values for the same
    name; we can thus micro-optimize this case by just retaining the name of
    the first configuration entry and freeing all the others, letting them
    point to the string of the first entry.
    
    The attached test case is an extreme example that demonstrates this. It
    contains a section name that is approximately 500kB in size with 20.000
    entries "a=b". Without the optimization, this would require at least
    20000*500kB bytes, which is around 10GB. With this patch, it only
    requires 500kB+20000*1B=20500kB.
    
    The obvious culprit here is the section header, which we repeatedly
    include in each of the configuration entry's names. This makes it very
    easier for an adversary to provide a small configuration file that
    disproportionally blows up in memory during processing and is thus a
    feasible way for a denial-of-service attack. Unfortunately, we cannot
    fix the root cause by e.g. having a separate "section" field that may
    easily be deduplicated due to the `git_config_entry` structure being
    part of our public API. So this micro-optimization is the best we can do
    for now.