diff options
author | Warner Losh <imp@FreeBSD.org> | 2015-12-27 23:04:11 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2015-12-27 23:04:11 +0000 |
commit | 267668803ab0a24e57084df13dce132d4c007a89 (patch) | |
tree | 738e22ce5f535bb3cb23f43dbbb8df5930fcf1f3 | |
parent | 728a116911587f97824aff20dbd2135e873bceb0 (diff) |
Notes
-rw-r--r-- | lib/libc/stdio/findfp.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c index b8bb5afb551c1..6a68958d50f4c 100644 --- a/lib/libc/stdio/findfp.c +++ b/lib/libc/stdio/findfp.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include <unistd.h> #include <stdio.h> #include <stdlib.h> +#include <stdint.h> #include <string.h> #include <spinlock.h> @@ -96,11 +97,22 @@ moreglue(int n) struct glue *g; static FILE empty = { ._fl_mutex = PTHREAD_MUTEX_INITIALIZER }; FILE *p; + size_t align; - g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE)); + /* + * FILE has a mbstate_t variable. This variable tries to be int64_t + * aligned through its definition. int64_t may be larger than void *, + * which is the size traditionally used for ALIGNBYTES. So, use our own + * rounding instead of the MI ALIGN macros. If for some reason + * ALIGNBYTES is larger than int64_t, respect that too. There appears to + * be no portable way to ask for FILE's alignment requirements other + * than just knowing here. + */ + align = MAX(ALIGNBYTES, sizeof(int64_t)); + g = (struct glue *)malloc(sizeof(*g) + align + n * sizeof(FILE)); if (g == NULL) return (NULL); - p = (FILE *)ALIGN(g + 1); + p = (FILE *)roundup((uintptr_t)(g + 1), align); g->next = NULL; g->niobs = n; g->iobs = p; |