diff options
| -rw-r--r-- | include/stdio.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/include/stdio.h b/include/stdio.h index 8486804..d55df07 100644 --- a/include/stdio.h +++ b/include/stdio.h | |||
| @@ -16,6 +16,19 @@ __fortify_fgets(char *s, int n, FILE *fp) | |||
| 16 | return fgets(s, n, fp); | 16 | return fgets(s, n, fp); |
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | static inline __attribute__ ((always_inline)) | ||
| 20 | size_t | ||
| 21 | __fortify_fread(void *dst, size_t n, size_t nmemb, FILE *fp) | ||
| 22 | { | ||
| 23 | size_t bos = __builtin_object_size(dst, 0); | ||
| 24 | |||
| 25 | if (n != 0 && (n * nmemb) / n != nmemb) | ||
| 26 | __builtin_trap(); | ||
| 27 | if (n * nmemb > bos) | ||
| 28 | __builtin_trap(); | ||
| 29 | return fread(dst, n, nmemb, fp); | ||
| 30 | } | ||
| 31 | |||
| 19 | static inline | 32 | static inline |
| 20 | __attribute__ ((always_inline)) | 33 | __attribute__ ((always_inline)) |
| 21 | __attribute__ ((__format__ (printf, 2, 0))) | 34 | __attribute__ ((__format__ (printf, 2, 0))) |
| @@ -52,6 +65,8 @@ __fortify_vsnprintf(char *s, size_t n, const char *fmt, __builtin_va_list ap) | |||
| 52 | 65 | ||
| 53 | #undef fgets | 66 | #undef fgets |
| 54 | #define fgets(s, n, fp) __fortify_fgets(s, n, fp) | 67 | #define fgets(s, n, fp) __fortify_fgets(s, n, fp) |
| 68 | #undef fread | ||
| 69 | #define fread(dst, n, nmemb, fp) __fortify_fread(dst, n, nmemb, fp) | ||
| 55 | #undef vsprintf | 70 | #undef vsprintf |
| 56 | #define vsprintf(s, fmt, ap) __fortify_vsprintf(s, fmt, ap) | 71 | #define vsprintf(s, fmt, ap) __fortify_vsprintf(s, fmt, ap) |
| 57 | #undef vsnprintf | 72 | #undef vsnprintf |
