diff options
| -rw-r--r-- | include/wchar.h | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/include/wchar.h b/include/wchar.h index 916e91a..16895e5 100644 --- a/include/wchar.h +++ b/include/wchar.h | |||
| @@ -23,16 +23,19 @@ __fortify_mbsnrtowcs(wchar_t *d, const char **s, size_t n, | |||
| 23 | size_t wn, mbstate_t *st) | 23 | size_t wn, mbstate_t *st) |
| 24 | { | 24 | { |
| 25 | size_t bos = __builtin_object_size(d, 0); | 25 | size_t bos = __builtin_object_size(d, 0); |
| 26 | size_t actual; | 26 | size_t r; |
| 27 | 27 | ||
| 28 | if (wn > (size_t)-1 / sizeof(wchar_t)) | 28 | if (wn > n / sizeof(wchar_t)) { |
| 29 | __builtin_trap(); | 29 | bos /= sizeof(wchar_t); |
| 30 | actual = wn * sizeof(wchar_t); | 30 | r = mbsnrtowcs(d, s, n, wn > bos ? bos : wn, st); |
| 31 | if (actual > n) | 31 | if (bos < wn && d && *s && r != (size_t)-1) |
| 32 | actual = n; | 32 | __builtin_trap(); |
| 33 | if (actual > bos) | 33 | } else { |
| 34 | __builtin_trap(); | 34 | r = mbsnrtowcs(d, s, n > bos ? bos : n, wn, st); |
| 35 | return mbsnrtowcs(d, s, n, wn, st); | 35 | if (bos < n && d && *s && r != (size_t)-1) |
| 36 | __builtin_trap(); | ||
| 37 | } | ||
| 38 | return r; | ||
| 36 | } | 39 | } |
| 37 | 40 | ||
| 38 | static inline __attribute__ ((always_inline)) | 41 | static inline __attribute__ ((always_inline)) |
| @@ -129,16 +132,19 @@ __fortify_wcsnrtombs(char *d, const wchar_t **s, size_t wn, | |||
| 129 | size_t n, mbstate_t *st) | 132 | size_t n, mbstate_t *st) |
| 130 | { | 133 | { |
| 131 | size_t bos = __builtin_object_size(d, 0); | 134 | size_t bos = __builtin_object_size(d, 0); |
| 132 | size_t actual; | 135 | size_t r; |
| 133 | 136 | ||
| 134 | if (wn > (size_t)-1 / sizeof(wchar_t)) | 137 | if (wn > n / sizeof(wchar_t)) { |
| 135 | __builtin_trap(); | 138 | bos /= sizeof(wchar_t); |
| 136 | actual = wn * sizeof(wchar_t); | 139 | r = wcsnrtombs(d, s, wn > bos ? bos : wn, n, st); |
| 137 | if (actual > n) | 140 | if (bos < wn && d && *s && r != (size_t)-1) |
| 138 | actual = n; | 141 | __builtin_trap(); |
| 139 | if (actual > bos) | 142 | } else { |
| 140 | __builtin_trap(); | 143 | r = wcsnrtombs(d, s, wn, n > bos ? bos : n, st); |
| 141 | return wcsnrtombs(d, s, wn, n, st); | 144 | if (bos < n && d && *s && r != (size_t)-1) |
| 145 | __builtin_trap(); | ||
| 146 | } | ||
| 147 | return r; | ||
| 142 | } | 148 | } |
| 143 | 149 | ||
| 144 | static inline __attribute__ ((always_inline)) | 150 | static inline __attribute__ ((always_inline)) |
