From 4c203e04021d44b18508bf5626bd67d03872df9f Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 8 Jan 2018 15:28:20 +0100 Subject: [PATCH] htsmsg: binary field cleanups --- src/htsmsg.c | 26 ++++++++++++++++++++++++-- src/htsmsg.h | 12 +++++++++++- src/htsp_server.c | 9 ++++----- src/http.c | 18 ++++++++++++------ 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/htsmsg.c b/src/htsmsg.c index 9b3ab7de1..65a3b4cbb 100644 --- a/src/htsmsg.c +++ b/src/htsmsg.c @@ -337,7 +337,6 @@ htsmsg_add_dbl(htsmsg_t *msg, const char *name, double dbl) } - /* * */ @@ -349,6 +348,17 @@ htsmsg_add_str(htsmsg_t *msg, const char *name, const char *str) f->hmf_flags |= HMF_INALLOCED; } +/* + * + */ +void +htsmsg_add_str_alloc(htsmsg_t *msg, const char *name, char *str) +{ + htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_STR, 0, 0); + f->hmf_str = str; + f->hmf_flags |= HMF_ALLOCED; +} + /* * */ @@ -501,7 +511,19 @@ htsmsg_add_bin(htsmsg_t *msg, const char *name, const void *bin, size_t len) * */ void -htsmsg_add_binptr(htsmsg_t *msg, const char *name, const void *bin, size_t len) +htsmsg_add_bin_alloc(htsmsg_t *msg, const char *name, const void *bin, size_t len) +{ + htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, 0, 0); + f->hmf_flags |= HMF_ALLOCED; + f->hmf_bin = bin; + f->hmf_binsize = len; +} + +/* + * + */ +void +htsmsg_add_bin_ptr(htsmsg_t *msg, const char *name, const void *bin, size_t len) { htsmsg_field_t *f = htsmsg_field_add(msg, name, HMF_BIN, 0, 0); f->hmf_bin = bin; diff --git a/src/htsmsg.h b/src/htsmsg.h index 26b01e5a1..83ab91288 100644 --- a/src/htsmsg.h +++ b/src/htsmsg.h @@ -175,6 +175,11 @@ void htsmsg_add_str(htsmsg_t *msg, const char *name, const char *str); */ void htsmsg_add_str2(htsmsg_t *msg, const char *name, const char *str); +/** + * Add a string field (allocated using malloc). + */ +void htsmsg_add_str_alloc(htsmsg_t *msg, const char *name, char *str); + /** * Add a string field to a list only once. */ @@ -225,12 +230,17 @@ int htsmsg_field_set_bin_force(htsmsg_field_t *f, const void *bin, size_t len); */ void htsmsg_add_bin(htsmsg_t *msg, const char *name, const void *bin, size_t len); +/** + * Add an binary field. The passed data must be mallocated. + */ +void htsmsg_add_bin_alloc(htsmsg_t *msg, const char *name, const void *bin, size_t len); + /** * Add an binary field. The data is not copied, instead the caller * is responsible for keeping the data valid for as long as the message * is around. */ -void htsmsg_add_binptr(htsmsg_t *msg, const char *name, const void *bin, size_t len); +void htsmsg_add_bin_ptr(htsmsg_t *msg, const char *name, const void *bin, size_t len); /** * Get an integer as an unsigned 32 bit integer. diff --git a/src/htsp_server.c b/src/htsp_server.c index 1ac7c19f3..fbdb8d9d3 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -2868,8 +2868,7 @@ htsp_method_file_read(htsp_connection_t *htsp, htsmsg_t *in) htsp_file_update_stats(hf, r); rep = htsmsg_create_map(); - htsmsg_add_bin(rep, "data", m, r); - free(m); + htsmsg_add_bin_alloc(rep, "data", m, r); error: pthread_mutex_lock(&global_lock); @@ -4002,7 +4001,7 @@ htsp_stream_deliver(htsp_subscription_t *hs, th_pkt_t *pkt) * object that just points to data, thus avoiding a copy. */ payloadlen = pktbuf_len(pkt->pkt_payload); - htsmsg_add_binptr(m, "payload", pktbuf_ptr(pkt->pkt_payload), payloadlen); + htsmsg_add_bin_ptr(m, "payload", pktbuf_ptr(pkt->pkt_payload), payloadlen); htsp_send_subscription(htsp, m, pkt->pkt_payload, hs, payloadlen); atomic_add(&hs->hs_s_bytes_out, payloadlen); @@ -4138,8 +4137,8 @@ htsp_subscription_start(htsp_subscription_t *hs, const streaming_start_t *ss) } if (ssc->ssc_gh) - htsmsg_add_binptr(m, "meta", pktbuf_ptr(ssc->ssc_gh), - pktbuf_len(ssc->ssc_gh)); + htsmsg_add_bin_ptr(m, "meta", pktbuf_ptr(ssc->ssc_gh), + pktbuf_len(ssc->ssc_gh)); htsmsg_add_msg(streams, NULL, c); } diff --git a/src/http.c b/src/http.c index c43ac84aa..f741992bc 100644 --- a/src/http.c +++ b/src/http.c @@ -1769,14 +1769,15 @@ again: if (p == NULL) return -1; if (tcp_read(hc->hc_fd, bl, 4)) - return -1; + goto err1; if (tcp_read(hc->hc_fd, p, plen)) - return -1; + goto err1; /* apply mask descrambling */ for (pi = 0; pi < plen; pi++) p[pi] ^= bl[pi & 3]; if (op == HTTP_WSOP_PING) { http_websocket_send(hc, p, plen, HTTP_WSOP_PONG); + free(p); goto again; } msg = htsmsg_create_map(); @@ -1785,15 +1786,20 @@ again: p[plen] = '\0'; msg1 = p[0] == '{' || p[0] == '[' ? htsmsg_json_deserialize((char *)p) : NULL; - if (msg1) + if (msg1) { htsmsg_add_msg(msg, "json", msg1); - else - htsmsg_add_str(msg, "text", (char *)p); + free(p); + } else { + htsmsg_add_str_alloc(msg, "text", (char *)p); + } } else { - htsmsg_add_bin(msg, "bin", p, plen); + htsmsg_add_bin_alloc(msg, "bin", p, plen); } *_res = msg; return 0; +err1: + free(p); + return -1; } /** -- 2.47.3