diff options
-rw-r--r-- | libc/stdio/open_memstream.c | 4 | ||||
-rw-r--r-- | libc/stdio/vasprintf.c | 2 | ||||
-rw-r--r-- | test/malloc/tst-asprintf.c | 27 |
3 files changed, 32 insertions, 1 deletions
diff --git a/libc/stdio/open_memstream.c b/libc/stdio/open_memstream.c index 5400fe441..17ef191cb 100644 --- a/libc/stdio/open_memstream.c +++ b/libc/stdio/open_memstream.c @@ -17,6 +17,8 @@ #define COOKIE ((__oms_cookie *) cookie) +#define MEMSTREAM_BUFSIZ 256 + typedef struct { char *buf; size_t len; @@ -134,7 +136,7 @@ FILE *open_memstream(char **bufloc, size_t *sizeloc) register FILE *fp; if ((cookie = malloc(sizeof(__oms_cookie))) != NULL) { - if ((cookie->buf = malloc(cookie->len = BUFSIZ)) == NULL) { + if ((cookie->buf = malloc(cookie->len = MEMSTREAM_BUFSIZ)) == NULL) { goto EXIT_cookie; } *cookie->buf = 0; /* Set nul terminator for buffer. */ diff --git a/libc/stdio/vasprintf.c b/libc/stdio/vasprintf.c index a901ee815..fa7926c60 100644 --- a/libc/stdio/vasprintf.c +++ b/libc/stdio/vasprintf.c @@ -39,6 +39,8 @@ int vasprintf(char **__restrict buf, const char * __restrict format, if (rv < 0) { free(*buf); *buf = NULL; + } else { + *buf = realloc(*buf, rv + 1); } } diff --git a/test/malloc/tst-asprintf.c b/test/malloc/tst-asprintf.c new file mode 100644 index 000000000..d4c3f7676 --- /dev/null +++ b/test/malloc/tst-asprintf.c @@ -0,0 +1,27 @@ +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <malloc.h> + +static void my_stats(void) +{ + malloc_stats(); + fprintf(stderr, "\n"); +} + +int main(int argc, char *argv[]) +{ + char *a, *b; + + my_stats(); + asprintf(&b, "asdsadasd %ssdf\n", "AAAA"); + my_stats(); + asprintf(&a, "asdsadasd %ssdf\n", "AAAA"); + my_stats(); + free(a); + free(b); + my_stats(); + + return 0; +} |