From 67de17a511c60a474910a653bdd11c182d423df9 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Tue, 5 Aug 2014 13:10:03 +0200 Subject: [PATCH] rtsp/wpas: pass va_list by reference As it turns out, the C standard forbids passing va_list by value and then continue using it in the parent function (C Standard, 7.16, paragraph 3). Luckily, there's a footnote stating: "It is permitted to create a pointer to a va_list and pass that pointer to another function, in which case the original function may take further use of the original list after the other function returns." Therefore, we're safe passing va_list by reference and thus can keep the current coding style. This fixes weird bugs on ARM32 which really doesn't allow passing va_list by value. Signed-off-by: David Herrmann --- src/shared/rtsp.c | 36 ++++++++++++++++++------------------ src/shared/rtsp.h | 8 ++++---- src/shared/wpas.c | 18 +++++++++--------- src/shared/wpas.h | 4 ++-- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/shared/rtsp.c b/src/shared/rtsp.c index 818644d..d4f10a2 100644 --- a/src/shared/rtsp.c +++ b/src/shared/rtsp.c @@ -1028,7 +1028,7 @@ int rtsp_message_append_basic(struct rtsp_message *m, int r; va_start(args, type); - r = rtsp_message_appendv_basic(m, type, args); + r = rtsp_message_appendv_basic(m, type, &args); va_end(args); return r; @@ -1036,7 +1036,7 @@ int rtsp_message_append_basic(struct rtsp_message *m, int rtsp_message_appendv_basic(struct rtsp_message *m, char type, - va_list args) + va_list *args) { char buf[128] = { }; const char *orig; @@ -1050,7 +1050,7 @@ int rtsp_message_appendv_basic(struct rtsp_message *m, switch (type) { case RTSP_TYPE_RAW: - orig = va_arg(args, const char*); + orig = va_arg(*args, const char*); if (!orig) orig = ""; @@ -1062,7 +1062,7 @@ int rtsp_message_appendv_basic(struct rtsp_message *m, else return rtsp_message_append_line(m, orig); case RTSP_TYPE_HEADER_START: - orig = va_arg(args, const char*); + orig = va_arg(*args, const char*); return rtsp_message_open_header(m, orig); case RTSP_TYPE_HEADER_END: @@ -1078,18 +1078,18 @@ int rtsp_message_appendv_basic(struct rtsp_message *m, switch (type) { case RTSP_TYPE_STRING: - orig = va_arg(args, const char*); + orig = va_arg(*args, const char*); if (!orig) orig = ""; break; case RTSP_TYPE_INT32: - i32 = va_arg(args, int32_t); + i32 = va_arg(*args, int32_t); sprintf(buf, "%" PRId32, i32); orig = buf; break; case RTSP_TYPE_UINT32: - u32 = va_arg(args, uint32_t); + u32 = va_arg(*args, uint32_t); sprintf(buf, "%" PRIu32, u32); orig = buf; break; @@ -1108,7 +1108,7 @@ int rtsp_message_append(struct rtsp_message *m, int r; va_start(args, types); - r = rtsp_message_appendv(m, types, args); + r = rtsp_message_appendv(m, types, &args); va_end(args); return r; @@ -1116,7 +1116,7 @@ int rtsp_message_append(struct rtsp_message *m, int rtsp_message_appendv(struct rtsp_message *m, const char *types, - va_list args) + va_list *args) { int r; @@ -1474,7 +1474,7 @@ int rtsp_message_read_basic(struct rtsp_message *m, int r; va_start(args, type); - r = rtsp_message_readv_basic(m, type, args); + r = rtsp_message_readv_basic(m, type, &args); va_end(args); return r; @@ -1482,7 +1482,7 @@ int rtsp_message_read_basic(struct rtsp_message *m, int rtsp_message_readv_basic(struct rtsp_message *m, char type, - va_list args) + va_list *args) { const char *key; const char **out_str, *entry; @@ -1499,13 +1499,13 @@ int rtsp_message_readv_basic(struct rtsp_message *m, if (!m->iter_header) return -EINVAL; - out_str = va_arg(args, const char**); + out_str = va_arg(*args, const char**); if (out_str) *out_str = m->iter_header->value ? : ""; return 0; case RTSP_TYPE_HEADER_START: - key = va_arg(args, const char*); + key = va_arg(*args, const char*); return rtsp_message_enter_header(m, key); case RTSP_TYPE_HEADER_END: @@ -1527,7 +1527,7 @@ int rtsp_message_readv_basic(struct rtsp_message *m, switch (type) { case RTSP_TYPE_STRING: - out_str = va_arg(args, const char**); + out_str = va_arg(*args, const char**); if (out_str) *out_str = entry; @@ -1536,7 +1536,7 @@ int rtsp_message_readv_basic(struct rtsp_message *m, if (sscanf(entry, "%" SCNd32, &i32) != 1) return -EINVAL; - out_i32 = va_arg(args, int32_t*); + out_i32 = va_arg(*args, int32_t*); if (out_i32) *out_i32 = i32; @@ -1545,7 +1545,7 @@ int rtsp_message_readv_basic(struct rtsp_message *m, if (sscanf(entry, "%" SCNu32, &u32) != 1) return -EINVAL; - out_u32 = va_arg(args, uint32_t*); + out_u32 = va_arg(*args, uint32_t*); if (out_u32) *out_u32 = u32; @@ -1567,7 +1567,7 @@ int rtsp_message_read(struct rtsp_message *m, int r; va_start(args, types); - r = rtsp_message_readv(m, types, args); + r = rtsp_message_readv(m, types, &args); va_end(args); return r; @@ -1575,7 +1575,7 @@ int rtsp_message_read(struct rtsp_message *m, int rtsp_message_readv(struct rtsp_message *m, const char *types, - va_list args) + va_list *args) { int r; diff --git a/src/shared/rtsp.h b/src/shared/rtsp.h index e86a41d..fad7a01 100644 --- a/src/shared/rtsp.h +++ b/src/shared/rtsp.h @@ -217,13 +217,13 @@ int rtsp_message_append_basic(struct rtsp_message *m, ...); int rtsp_message_appendv_basic(struct rtsp_message *m, char type, - va_list args); + va_list *args); int rtsp_message_append(struct rtsp_message *m, const char *types, ...); int rtsp_message_appendv(struct rtsp_message *m, const char *types, - va_list args); + va_list *args); int rtsp_message_set_cookie(struct rtsp_message *m, uint64_t cookie); int rtsp_message_seal(struct rtsp_message *m); @@ -240,13 +240,13 @@ int rtsp_message_read_basic(struct rtsp_message *m, ...); int rtsp_message_readv_basic(struct rtsp_message *m, char type, - va_list args); + va_list *args); int rtsp_message_read(struct rtsp_message *m, const char *types, ...); int rtsp_message_readv(struct rtsp_message *m, const char *types, - va_list args); + va_list *args); int rtsp_message_skip_basic(struct rtsp_message *m, char type); int rtsp_message_skip(struct rtsp_message *m, const char *types); diff --git a/src/shared/wpas.c b/src/shared/wpas.c index 9e003d5..8e14d43 100644 --- a/src/shared/wpas.c +++ b/src/shared/wpas.c @@ -374,7 +374,7 @@ int wpas_message_append_basic(struct wpas_message *m, char type, ...) int r; va_start(args, type); - r = wpas_message_appendv_basic(m, type, args); + r = wpas_message_appendv_basic(m, type, &args); va_end(args); return r; @@ -382,7 +382,7 @@ int wpas_message_append_basic(struct wpas_message *m, char type, ...) int wpas_message_appendv_basic(struct wpas_message *m, char type, - va_list args) + va_list *args) { _shl_free_ char *str = NULL; char buf[128] = { }; @@ -401,27 +401,27 @@ int wpas_message_appendv_basic(struct wpas_message *m, switch (type) { case WPAS_TYPE_STRING: - orig = va_arg(args, const char*); + orig = va_arg(*args, const char*); if (!orig) return -EINVAL; break; case WPAS_TYPE_INT32: - i32 = va_arg(args, int32_t); + i32 = va_arg(*args, int32_t); sprintf(buf, "%" PRId32, i32); orig = buf; break; case WPAS_TYPE_UINT32: - u32 = va_arg(args, uint32_t); + u32 = va_arg(*args, uint32_t); sprintf(buf, "%" PRIu32, u32); orig = buf; break; case WPAS_TYPE_DICT: - s = va_arg(args, const char*); + s = va_arg(*args, const char*); if (!s) return -EINVAL; - t = va_arg(args, const char*); + t = va_arg(*args, const char*); if (!t) return -EINVAL; @@ -451,7 +451,7 @@ int wpas_message_append(struct wpas_message *m, const char *types, ...) int r; va_start(args, types); - r = wpas_message_appendv(m, types, args); + r = wpas_message_appendv(m, types, &args); va_end(args); return r; @@ -459,7 +459,7 @@ int wpas_message_append(struct wpas_message *m, const char *types, ...) int wpas_message_appendv(struct wpas_message *m, const char *types, - va_list args) + va_list *args) { int r; diff --git a/src/shared/wpas.h b/src/shared/wpas.h index 7cdafda..89200fc 100644 --- a/src/shared/wpas.h +++ b/src/shared/wpas.h @@ -131,11 +131,11 @@ void wpas_message_set_peer(struct wpas_message *msg, const char *peer); int wpas_message_append_basic(struct wpas_message *m, char type, ...); int wpas_message_appendv_basic(struct wpas_message *m, char type, - va_list args); + va_list *args); int wpas_message_append(struct wpas_message *m, const char *types, ...); int wpas_message_appendv(struct wpas_message *m, const char *types, - va_list args); + va_list *args); int wpas_message_seal(struct wpas_message *m); int wpas_message_read_basic(struct wpas_message *m, char type, void *out);