From 01831b2ed58bf1e87fa34186fd7a0e44b8725550 Mon Sep 17 00:00:00 2001 From: Snaipe Date: Tue, 8 Sep 2015 19:21:53 +0200 Subject: [PATCH] Fixed crashes introduced by the API change --- include/criterion/assert.h | 8 ++++---- src/event.c | 24 +++++++++--------------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/include/criterion/assert.h b/include/criterion/assert.h index 4aeaa9b..092f7a1 100644 --- a/include/criterion/assert.h +++ b/include/criterion/assert.h @@ -68,9 +68,10 @@ struct criterion_assert_args { const char *default_msg = "" CR_VA_HEAD(__VA_ARGS__); \ char *formatted_msg = NULL; \ int msglen = asprintf(&formatted_msg, "" CR_VA_TAIL(__VA_ARGS__)); \ - MsgVar = formatted_msg ? formatted_msg : default_msg; \ + MsgVar = formatted_msg && *formatted_msg ? \ + formatted_msg : default_msg; \ \ - if (!formatted_msg) \ + if (!formatted_msg || !*formatted_msg) \ msglen = strlen(default_msg); \ \ BufSize = sizeof(struct criterion_assert_stats) \ @@ -78,10 +79,9 @@ struct criterion_assert_args { \ char *buf = (char*) CR_STDN malloc(BufSize); \ stat = (struct criterion_assert_stats*) buf; \ - \ CR_STDN memset(buf, 0, sizeof (struct criterion_assert_stats)); \ buf += sizeof (struct criterion_assert_stats); \ - *((size_t*) buf) = msglen; \ + *((size_t*) buf) = msglen + 1; \ buf += sizeof (size_t); \ CR_STDN strcpy(buf, MsgVar); \ CR_STDN free(formatted_msg); \ diff --git a/src/event.c b/src/event.c index ba91d73..abb85a6 100644 --- a/src/event.c +++ b/src/event.c @@ -39,7 +39,7 @@ void destroy_event(void *ptr, UNUSED void *meta) { void destroy_assert_event(void *ptr, UNUSED void *meta) { struct event *ev = ptr; - free((void*) ((struct criterion_assert_stats *) ev)->message); + free((void*) ((struct criterion_assert_stats *) ev->data)->message); free(ev->data); } @@ -52,19 +52,18 @@ struct event *read_event(FILE *f) { case ASSERT: { const size_t assert_size = sizeof (struct criterion_assert_stats); struct criterion_assert_stats *buf = NULL; - size_t *len = NULL; char *msg = NULL; buf = malloc(assert_size); if (fread(buf, assert_size, 1, f) == 0) goto fail_assert; - len = malloc(sizeof (size_t)); - if (fread(len, sizeof (size_t), 1, f) == 0) + size_t len = 0; + if (fread(&len, sizeof (size_t), 1, f) == 0) goto fail_assert; - msg = malloc(*len); - if (fread(buf, *len, 1, f) == 0) + msg = malloc(len); + if (fread(msg, len, 1, f) == 0) goto fail_assert; buf->message = msg; @@ -77,25 +76,20 @@ struct event *read_event(FILE *f) { return ev; fail_assert: - free(len); free(buf); free(msg); return NULL; } case THEORY_FAIL: { - size_t *len = malloc(sizeof (size_t)); - if (fread(len, sizeof (size_t), 1, f) == 0) { - free(len); + size_t len = 0; + if (fread(&len, sizeof (size_t), 1, f) == 0) return NULL; - } - char *buf = malloc(*len); - if (fread(buf, *len, 1, f) == 0) { - free(len); + char *buf = malloc(len); + if (fread(buf, len, 1, f) == 0) { free(buf); return NULL; } - free(len); struct event *ev = smalloc( .size = sizeof (struct event),