diff options
| author | sin | 2015-03-04 17:10:16 +0000 |
|---|---|---|
| committer | sin | 2015-03-04 17:10:50 +0000 |
| commit | 7392bcaef8dfdfba67253f3b84f1f1a611e7bab3 (patch) | |
| tree | 739035879df06ffa2622f6f7939421bc993ee66f | |
| parent | 3d237352de2832b07b2f61349cf618f5880a1e7b (diff) | |
Handle early termination in wcsnrtombs() and mbsnrtowcs()
| -rw-r--r-- | include/wchar.h | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/include/wchar.h b/include/wchar.h index 4d329a8..9e5413f 100644 --- a/include/wchar.h +++ b/include/wchar.h | |||
| @@ -23,8 +23,14 @@ __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 | 27 | ||
| 27 | if (wn > bos / sizeof(wchar_t)) | 28 | if (wn > (size_t)-1 / sizeof(wchar_t)) |
| 29 | __builtin_trap(); | ||
| 30 | actual = wn * sizeof(wchar_t); | ||
| 31 | if (actual > n) | ||
| 32 | actual = n; | ||
| 33 | if (actual > bos) | ||
| 28 | __builtin_trap(); | 34 | __builtin_trap(); |
| 29 | return mbsnrtowcs(d, s, n, wn, st); | 35 | return mbsnrtowcs(d, s, n, wn, st); |
| 30 | } | 36 | } |
| @@ -120,8 +126,14 @@ __fortify_wcsnrtombs(char *d, const wchar_t **s, size_t wn, | |||
| 120 | size_t n, mbstate_t *st) | 126 | size_t n, mbstate_t *st) |
| 121 | { | 127 | { |
| 122 | size_t bos = __builtin_object_size(d, 0); | 128 | size_t bos = __builtin_object_size(d, 0); |
| 129 | size_t actual; | ||
| 123 | 130 | ||
| 124 | if (n > bos) | 131 | if (wn > (size_t)-1 / sizeof(wchar_t)) |
| 132 | __builtin_trap(); | ||
| 133 | actual = wn * sizeof(wchar_t); | ||
| 134 | if (actual > n) | ||
| 135 | actual = n; | ||
| 136 | if (actual > bos) | ||
| 125 | __builtin_trap(); | 137 | __builtin_trap(); |
| 126 | return wcsnrtombs(d, s, wn, n, st); | 138 | return wcsnrtombs(d, s, wn, n, st); |
| 127 | } | 139 | } |
