Skip to content
  • Jeff King's avatar
    interpret_branch_name: always respect "namelen" parameter · 8cd4249c
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    interpret_branch_name gets passed a "name" buffer to parse,
    along with a "namelen" parameter representing its length. If
    "namelen" is zero, we fallback to the NUL-terminated
    string-length of "name".
    
    However, it does not necessarily follow that if we have
    gotten a non-zero "namelen", it is the NUL-terminated
    string-length of "name". E.g., when get_sha1() is parsing
    "foo:bar", we will be asked to operate only on the first
    three characters.
    
    Yet in interpret_branch_name and its helpers, we use string
    functions like strchr() to operate on "name", looking past
    the length we were given.  This can result in us mis-parsing
    object names.  We should instead be limiting our search to
    "namelen" bytes.
    
    There are three distinct types of object names this patch
    addresses:
    
      - The intrepret_empty_at helper uses strchr to find the
        next @-expression after our potential empty-at.  In an
        expression like "@:foo@bar", it erroneously thinks that
        the second "@" is relevant, even if we were asked only
        to look at the first character. This case is easy to
        trigger (and we test it in this patch).
    
      - When finding the initial @-mark for @{upstream}, we use
        strchr.  This means we might treat "foo:@{upstream}" as
        the upstream for "foo:", even though we were asked only
        to look at "foo". We cannot test this one in practice,
        because it is masked by another bug (which is fixed in
        the next patch).
    
      - The interpret_nth_prior_checkout helper did not receive
        the name length at all. This turns out not to be a
        problem in practice, though, because its parsing is so
        limited: it always starts from the far-left of the
        string, and will not tolerate a colon (which is
        currently the only way to get a smaller-than-strlen
        "namelen"). However, it's still worth fixing to make the
        code more obviously correct, and to future-proof us
        against callers with more exotic buffers.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    8cd4249c