1. 17 8月, 2020 1 次提交
  2. 15 3月, 2019 1 次提交
    • R
      fix crash/out-of-bound read in sscanf · 8f12c4e1
      Rich Felker 提交于
      commit d6c855ca caused this
      "regression", though the behavior was undefined before, overlooking
      that f->shend=0 was being used as a sentinel for "EOF" status (actual
      EOF or hitting the scanf field width) of the stream helper (shgetc)
      functions.
      
      obviously the shgetc macro could be adjusted to check for a null
      pointer in addition to the != comparison, but it's the hot path, and
      adding extra code/branches to it begins to defeat the purpose.
      
      so instead of setting shend to a null pointer to block further reads,
      which no longer works, set it to the current position (rpos). this
      makes the shgetc macro work with no change, but it breaks shunget,
      which can no longer look at the value of shend to determine whether to
      back up. Szabolcs Nagy suggested a solution which I'm using here:
      setting shlim to a negative value is inexpensive to test at shunget
      time, and automatically re-trips the cnt>=shlim stop condition in
      __shgetc no matter what the original limit was.
      8f12c4e1
  3. 15 9月, 2018 1 次提交
    • R
      fix undefined behavior in strto* via FILE buffer pointer abuse · d6c855ca
      Rich Felker 提交于
      in order to produce FILE objects to pass to the intscan/floatscan
      backends without any (prohibitively costly) extra buffering layer, the
      strto* functions set the FILE's rend (read end) buffer pointer to an
      invalid value at the end of the address space, or SIZE_MAX/2 past the
      beginning of the string. this led to undefined behavior comparing and
      subtracting the end pointer with the buffer position pointer (rpos).
      
      the comparison issue is easily eliminated by using != instead of <.
      however the subtractions require nontrivial changes:
      
      previously, f->shcnt stored the count that would have been read if
      consuming the whole buffer, which required an end pointer for the
      buffer. the purpose for this was that it allowed reading it and adding
      rpos-rend at any time to get the actual count so far, and required no
      adjustment at the time of __shgetc (actual function call) since the
      call would only happen when reaching the end of the buffer.
      
      to get rid of the dependency on rend, instead offset shcnt by buf-rpos
      (start of buffer) at the time of last __shlim/__shgetc call. this
      makes for slightly more work in __shgetc the function, but for the
      inline macro it's still just as easy to compute the current count.
      
      since the scan helper interfaces used here are a big hack, comments
      are added to document their contracts and what's going on with their
      implementations.
      d6c855ca
  4. 13 9月, 2018 1 次提交
  5. 16 4月, 2012 1 次提交
  6. 13 4月, 2012 1 次提交
    • R
      use macros instead of inline functions in shgetc.h · 26832d04
      Rich Felker 提交于
      at -Os optimization level, gcc refuses to inline these functions even
      though the inlined code would roughly the same size as the function
      call, and much faster. the easy solution is to make them into macros.
      26832d04
  7. 11 4月, 2012 1 次提交
    • R
      add "scan helper getc" and rework strtod, etc. to use it · 2162541f
      Rich Felker 提交于
      the immediate benefit is a significant debloating of the float parsing
      code by moving the responsibility for keeping track of the number of
      characters read to a different module.
      
      by linking shgetc with the stdio buffer logic, counting logic is
      defered to buffer refill time, keeping the calls to shgetc fast and
      light.
      
      in the future, shgetc will also be useful for integrating the new
      float code with scanf, which needs to not only count the characters
      consumed, but also limit the number of characters read based on field
      width specifiers.
      
      shgetc may also become a useful tool for simplifying the integer
      parsing code.
      2162541f