]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
htsmsg: fix crash caused by wrong htsmsg_set_str() update, fixes #3631
authorJaroslav Kysela <perex@perex.cz>
Tue, 15 Mar 2016 15:46:07 +0000 (16:46 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 15 Mar 2016 15:46:07 +0000 (16:46 +0100)
src/htsmsg.c
src/htsmsg.h

index 844b14b3f52298676446ef54b90f9ba0630667b4..11e36ea36c355cf11c4d3bd5b260242b3ad05153 100644 (file)
@@ -417,6 +417,20 @@ htsmsg_field_set_str(htsmsg_field_t *f, const char *str)
   return 0;
 }
 
+/*
+ *
+ */
+int
+htsmsg_field_set_str_force(htsmsg_field_t *f, const char *str)
+{
+  if (f->hmf_type != HMF_STR) {
+    htsmsg_field_data_destroy(f);
+    f->hmf_type = HMF_STR;
+    f->hmf_str = "";
+  }
+  return htsmsg_field_set_str(f, str);
+}
+
 /*
  *
  */
@@ -781,15 +795,15 @@ htsmsg_field_get_string(htsmsg_field_t *f)
   case HMF_STR:
     break;
   case HMF_BOOL:
-    htsmsg_field_set_str(f, f->hmf_bool ? "true" : "false");
+    htsmsg_field_set_str_force(f, f->hmf_bool ? "true" : "false");
     break;
   case HMF_S64:
     snprintf(buf, sizeof(buf), "%"PRId64, f->hmf_s64);
-    htsmsg_field_set_str(f, buf);
+    htsmsg_field_set_str_force(f, buf);
     break;
   case HMF_DBL:
     snprintf(buf, sizeof(buf), "%lf", f->hmf_dbl);
-    htsmsg_field_set_str(f, buf);
+    htsmsg_field_set_str_force(f, buf);
     break;
   }
   return f->hmf_str;
index 0f899630752c40d198f4108d4425cdf16a843a13..b278cbe3ac548d0934bdd644434efe84e0bc9ac2 100644 (file)
@@ -183,6 +183,7 @@ int  htsmsg_set_str(htsmsg_t *msg, const char *name, const char *str);
  * Update a string field
  */
 int  htsmsg_field_set_str(htsmsg_field_t *f, const char *str);
+int  htsmsg_field_set_str_force(htsmsg_field_t *f, const char *str);
 
 /**
  * Add an field where source is a list or map message.