]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
htsmsg: binary field cleanups
authorJaroslav Kysela <perex@perex.cz>
Mon, 8 Jan 2018 14:28:20 +0000 (15:28 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 8 Jan 2018 14:28:20 +0000 (15:28 +0100)
src/htsmsg.c
src/htsmsg.h
src/htsp_server.c
src/http.c

index 9b3ab7de1a1679cc31d250cfce73c3ac8e048ddd..65a3b4cbbdc3508535d72bb969a2295b526bd5b0 100644 (file)
@@ -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;
index 26b01e5a190bcd275592bc15499c4a97ac2cfd54..83ab91288ceac226a939e61d6f70f4bd5b6a72d2 100644 (file)
@@ -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.
index 1ac7c19f3a86893ba29f204493abe91fd844f8e9..fbdb8d9d37b16b34c58131f6565def596b4d8394 100644 (file)
@@ -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);
   }
index c43ac84aaa06cfe255a18377031f15081d5968e9..f741992bcc8607ce7407edf29f3288c13c606420 100644 (file)
@@ -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;
 }
 
 /**