• R
    fix major scanf breakage with unbuffered streams, fmemopen, etc. · c2080450
    Rich Felker 提交于
    the shgetc api, used internally in scanf and int/float scanning code
    to handle field width limiting and pushback, was designed assuming
    that pushback could be achieved via a simple decrement on the file
    buffer pointer. this only worked by chance for regular FILE streams,
    due to the linux readv bug workaround in __stdio_read which moves the
    last requested byte through the buffer rather than directly back to
    the caller. for unbuffered streams and streams not using __stdio_read
    but some other underlying read function, the first character read
    could be completely lost, and replaced by whatever junk happened to be
    in the unget buffer.
    
    to fix this, simply have shgetc, when it performs an underlying read
    operation on the stream, store the character read at the -1 offset
    from the read buffer pointer. this is valid even for unbuffered
    streams, as they have an unget buffer located just below the start of
    the zero-length buffer. the check to avoid storing the character when
    it is already there is to handle the possibility of read-only buffers.
    no application-exposed FILE types are allowed to use read-only
    buffers, but sscanf and strto* may use them internally when calling
    functions which use the shgetc api.
    c2080450
shgetc.c 561 字节