]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: accept char limiting for title and subtitle formatters, fixes #3541.
authorJaroslav Kysela <perex@perex.cz>
Fri, 19 Feb 2016 16:22:23 +0000 (17:22 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 19 Feb 2016 16:23:07 +0000 (17:23 +0100)
src/dvr/dvr_rec.c
src/htsstr.c

index 878a7a536f73860d0fab6b0381d40805eaf9a15d..86dfc149ff8a8531882ae9db1f604364d08b36c0 100644 (file)
@@ -281,6 +281,16 @@ dvr_clean_directory_separator(char *s, char *tmp, size_t tmplen)
 static const char *
 dvr_do_prefix(const char *id, const char *s, char *tmp, size_t tmplen)
 {
+  if (id[0] == '?') {
+    if (*s >= '0' && *s <= '9') {
+      char *endptr;
+      long l = strtol(s, &endptr, 10);
+      if (l && tmplen > l)
+        tmplen = l;
+      s = endptr;
+    }
+    id++;
+  }
   if (s == NULL) {
     tmp[0] = '\0';
   } else if (s[0] && !isalpha(id[0])) {
@@ -398,42 +408,42 @@ dvr_sub_stop(const char *id, const void *aux, char *tmp, size_t tmplen)
 }
 
 static htsstr_substitute_t dvr_subs_entry[] = {
-  { .id = "t",  .getval = dvr_sub_title },
-  { .id = " t", .getval = dvr_sub_title },
-  { .id = "-t", .getval = dvr_sub_title },
-  { .id = "_t", .getval = dvr_sub_title },
-  { .id = ".t", .getval = dvr_sub_title },
-  { .id = ",t", .getval = dvr_sub_title },
-  { .id = ";t", .getval = dvr_sub_title },
-  { .id = "s",  .getval = dvr_sub_subtitle },
-  { .id = " s", .getval = dvr_sub_subtitle },
-  { .id = "-s", .getval = dvr_sub_subtitle },
-  { .id = "_s", .getval = dvr_sub_subtitle },
-  { .id = ".s", .getval = dvr_sub_subtitle },
-  { .id = ",s", .getval = dvr_sub_subtitle },
-  { .id = ";s", .getval = dvr_sub_subtitle },
-  { .id = "e",  .getval = dvr_sub_episode },
-  { .id = " e", .getval = dvr_sub_episode },
-  { .id = "-e", .getval = dvr_sub_episode },
-  { .id = "_e", .getval = dvr_sub_episode },
-  { .id = ".e", .getval = dvr_sub_episode },
-  { .id = ",e", .getval = dvr_sub_episode },
-  { .id = ";e", .getval = dvr_sub_episode },
-  { .id = "c",  .getval = dvr_sub_channel },
-  { .id = " c", .getval = dvr_sub_channel },
-  { .id = "-c", .getval = dvr_sub_channel },
-  { .id = "_c", .getval = dvr_sub_channel },
-  { .id = ".c", .getval = dvr_sub_channel },
-  { .id = ",c", .getval = dvr_sub_channel },
-  { .id = ";c", .getval = dvr_sub_channel },
-  { .id = "g",  .getval = dvr_sub_genre },
-  { .id = " g", .getval = dvr_sub_genre },
-  { .id = "-g", .getval = dvr_sub_genre },
-  { .id = "_g", .getval = dvr_sub_genre },
-  { .id = ".g", .getval = dvr_sub_genre },
-  { .id = ",g", .getval = dvr_sub_genre },
-  { .id = ";g", .getval = dvr_sub_genre },
-  { .id = NULL, .getval = NULL }
+  { .id = "?t",  .getval = dvr_sub_title },
+  { .id = "? t", .getval = dvr_sub_title },
+  { .id = "?-t", .getval = dvr_sub_title },
+  { .id = "?_t", .getval = dvr_sub_title },
+  { .id = "?.t", .getval = dvr_sub_title },
+  { .id = "?,t", .getval = dvr_sub_title },
+  { .id = "?;t", .getval = dvr_sub_title },
+  { .id = "?s",  .getval = dvr_sub_subtitle },
+  { .id = "? s", .getval = dvr_sub_subtitle },
+  { .id = "?-s", .getval = dvr_sub_subtitle },
+  { .id = "?_s", .getval = dvr_sub_subtitle },
+  { .id = "?.s", .getval = dvr_sub_subtitle },
+  { .id = "?,s", .getval = dvr_sub_subtitle },
+  { .id = "?;s", .getval = dvr_sub_subtitle },
+  { .id = "e",   .getval = dvr_sub_episode },
+  { .id = " e",  .getval = dvr_sub_episode },
+  { .id = "-e",  .getval = dvr_sub_episode },
+  { .id = "_e",  .getval = dvr_sub_episode },
+  { .id = ".e",  .getval = dvr_sub_episode },
+  { .id = ",e",  .getval = dvr_sub_episode },
+  { .id = ";e",  .getval = dvr_sub_episode },
+  { .id = "c",   .getval = dvr_sub_channel },
+  { .id = " c",  .getval = dvr_sub_channel },
+  { .id = "-c",  .getval = dvr_sub_channel },
+  { .id = "_c",  .getval = dvr_sub_channel },
+  { .id = ".c",  .getval = dvr_sub_channel },
+  { .id = ",c",  .getval = dvr_sub_channel },
+  { .id = ";c",  .getval = dvr_sub_channel },
+  { .id = "g",   .getval = dvr_sub_genre },
+  { .id = " g",  .getval = dvr_sub_genre },
+  { .id = "-g",  .getval = dvr_sub_genre },
+  { .id = "_g",  .getval = dvr_sub_genre },
+  { .id = ".g",  .getval = dvr_sub_genre },
+  { .id = ",g",  .getval = dvr_sub_genre },
+  { .id = ";g",  .getval = dvr_sub_genre },
+  { .id = NULL,  .getval = NULL }
 };
 
 static const char *
index e435d38f3852356f05f698766ec5b0bed21158b4..19d0badcf5b88acf6e24542f81fae1345f532d98 100644 (file)
@@ -250,9 +250,16 @@ htsstr_substitute(const char *src, char *dst, size_t dstlen,
       src++;
     }
     for (s = sub; s->id; s++) {
-      for (p = s->id, x = src; *p; p++, x++)
+      for (p = s->id, x = src; *p; p++, x++) {
+        if (*p == '?') {
+          while (*x >= '0' && *x <= '9')
+            x++;
+          x--;
+          continue;
+        }
         if (*p != *x)
           break;
+      }
       if (*p == '\0') {
         src = x;
         if ((l = dstlen) > 0) {