summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdio/findfp.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c
index b8bb5af..6a68958 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;
OpenPOWER on IntegriCloud