• Jessica Yu's avatar
    sscanf: implement basic character sets · f9310b2f
    Jessica Yu authored
    Implement basic character sets for the '%[' conversion specifier.
    
    The '%[' conversion specifier matches a nonempty sequence of characters
    from the specified set of accepted (or with '^', rejected) characters
    between the brackets.  The substring matched is to be made up of
    characters in (or not in) the set.  This is useful for matching
    substrings that are delimited by something other than spaces.
    
    This implementation differs from its glibc counterpart in the following ways:
     (1) No support for character ranges (e.g., 'a-z' or '0-9')
     (2) The hyphen '-' is not a special character
     (3) The closing bracket ']' cannot be matched
     (4) No support (yet) for discarding matching input ('%*[')
    
    The bitmap code is largely based upon sample code which was provided by
    Rasmus.
    
    The motivation for adding character set support to sscanf originally
    stemmed from the kernel livepatching project.  An ongoing patchset
    utilizes new livepatch Elf symbol and section names to store important
    metadata livepatch needs to properly apply its patches.  Such metadata
    is stored in these section and symbol names as substrings delimited by
    periods '.' and commas ','.  For example, a livepatch symbol name might
    look like this:
    
    .klp.sym.vmlinux.printk,0
    
    However, sscanf currently can only extract "substrings" delimited by
    whitespace using the "%s" specifier.  Thus for the above symbol name,
    one cannot not use sscanf() to extract substrings "vmlinux" or
    "printk", for example.  A number of discussions on the livepatch
    mailing list dealing with string parsing code for extracting these '.'
    and ',' delimited substrings eventually led to the conclusion that such
    code would be completely unnecessary if the kernel sscanf() supported
    character sets.  Thus only a single sscanf() call would be necessary to
    extract these substrings.  In addition, such an addition to sscanf()
    could benefit other areas of the kernel that might have a similar need
    in the future.
    
    [akpm@linux-foundation.org: 80-col tweaks]
    Signed-off-by: default avatarJessica Yu <jeyu@redhat.com>
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Kees Cook <keescook@chromium.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f9310b2f
vsprintf.c 66.8 KB