]> granicus.if.org Git - handbrake/commitdiff
libhb: Add filter parameter validation.
authorbradleys <bradley@bradleysepos.com>
Wed, 15 Oct 2014 23:48:23 +0000 (23:48 +0000)
committerbradleys <bradley@bradleysepos.com>
Wed, 15 Oct 2014 23:48:23 +0000 (23:48 +0000)
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6447 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/common.h
libhb/param.c
test/test.c

index c4392fd942714f62b4e0bf0e33259872ff5bcf34..77a5b9b31043e79eed1750ce506b9d2dde122a77 100644 (file)
@@ -1253,6 +1253,8 @@ hb_list_t *hb_filter_list_copy(const hb_list_t *src);
 void hb_filter_close( hb_filter_object_t ** );
 char * hb_generate_filter_settings(int filter_id, const char *preset,
                                                   const char *tune);
+int    hb_validate_filter_settings(int filter_id, const char *filter_param);
+int    hb_validate_param_string(const char *regex_pattern, const char *param_string);
 
 typedef void hb_error_handler_t( const char *errmsg );
 
index d95bf147f4edc789de79d8e9043ff6b3f16cc7f3..96b1e2709e628013469ba1d0b101234591a260a7 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include "hb.h"
+#include <regex.h>
 
 /* NL-means presets and tunes
  *
@@ -162,7 +163,7 @@ static char * generate_nlmeans_settings(const char *preset, const char *tune)
         }
         else
         {
-            hb_log("Unrecognized nlmeans tune (%s).\n", tune);
+            fprintf(stderr, "Unrecognized nlmeans tune (%s).\n", tune);
             return NULL;
         }
 
@@ -179,7 +180,7 @@ static char * generate_nlmeans_settings(const char *preset, const char *tune)
         opt = strdup(preset);
         if (tune != NULL)
         {
-            hb_log("Custom nlmeans parameters specified; ignoring nlmeans tune (%s).\n", tune);
+            fprintf(stderr, "Custom nlmeans parameters specified; ignoring nlmeans tune (%s).\n", tune);
         }
     }
 
@@ -196,6 +197,9 @@ static char * generate_nlmeans_settings(const char *preset, const char *tune)
  */
 static char * generate_hqdn3d_settings(const char *preset, const char *tune)
 {
+    if (preset == NULL)
+        return NULL;
+
     if (!strcasecmp(preset, "strong"))
         return strdup("7:7:7:5:5:5");
     else if (!strcasecmp(preset, "medium"))
@@ -208,19 +212,80 @@ static char * generate_hqdn3d_settings(const char *preset, const char *tune)
         return strdup(preset);
 }
 
+int hb_validate_param_string(const char *regex_pattern, const char *param_string)
+{
+    regex_t regex_temp;
+
+    if (regcomp(&regex_temp, regex_pattern, REG_EXTENDED) == 0)
+    {
+        if (regexec(&regex_temp, param_string, 0, NULL, 0) == 0)
+        {
+            regfree(&regex_temp);
+            return 0;
+        }
+    }
+    else
+    {
+        fprintf(stderr, "hb_validate_param_string: Error compiling regex for pattern (%s).\n", param_string);
+    }
+
+    regfree(&regex_temp);
+    return 1;
+}
+
+int hb_validate_filter_settings(int filter_id, const char *filter_param)
+{
+    // Regex matches "number" followed by one or more ":number", where number is uint or ufloat
+    const char *hb_colon_separated_params_regex = "^((([0-9]+([.][0-9]+)?)|([.][0-9]+))((:(([0-9]+([.][0-9]+)?)|([.][0-9]+)))+)?)$";
+
+    char *regex_pattern = NULL;
+
+    switch (filter_id)
+    {
+        case HB_FILTER_NLMEANS:
+        case HB_FILTER_HQDN3D:
+            if (filter_param == NULL)
+            {
+                return 0;
+            }
+            regex_pattern = hb_colon_separated_params_regex;
+            break;
+        default:
+            fprintf(stderr, "hb_validate_filter_settings: Unrecognized filter (%d).\n",
+                   filter_id);
+            return 1;
+            break;
+    }
+
+    if (hb_validate_param_string(regex_pattern, filter_param) == 0)
+    {
+        return 0;
+    }
+    return 1;
+}
+
 char * hb_generate_filter_settings(int filter_id, const char *preset, const char *tune)
 {
+    char *filter_param = NULL;
+
     switch (filter_id)
     {
         case HB_FILTER_NLMEANS:
-            return generate_nlmeans_settings(preset, tune);
+            filter_param = generate_nlmeans_settings(preset, tune);
+            break;
         case HB_FILTER_HQDN3D:
-            return generate_hqdn3d_settings(preset, tune);
+            filter_param = generate_hqdn3d_settings(preset, tune);
+            break;
         default:
-            hb_log("hb_generate_filter_settings: Unrecognized filter %d\n",
+            fprintf(stderr, "hb_generate_filter_settings: Unrecognized filter (%d).\n",
                    filter_id);
             break;
     }
+
+    if (hb_validate_filter_settings(filter_id, filter_param) == 0)
+    {
+        return filter_param;
+    }
     return NULL;
 }
 
index a7299736c9ed1591ef48b444ff506abb82aa691a..bfc9294ffc71c8ee69e93364de4811898e34d2c2 100644 (file)
@@ -4356,11 +4356,6 @@ static int ParseOptions( int argc, char ** argv )
 
     if (nlmeans)
     {
-        if (nlmeans_opt == NULL && nlmeans_tune_opt != NULL)
-        {
-            fprintf(stdout, "Default nlmeans parameters specified; ignoring nlmeans tune (%s).\n", nlmeans_tune_opt);
-        }
-
         char *opt = hb_generate_filter_settings(HB_FILTER_NLMEANS,
                                                 nlmeans_opt, nlmeans_tune_opt);
         if (opt != NULL)
@@ -4368,6 +4363,15 @@ static int ParseOptions( int argc, char ** argv )
             free(nlmeans_opt);
             nlmeans_opt = opt;
         }
+        else if (nlmeans_opt != NULL)
+        {
+            fprintf(stderr, "Invalid parameters for nlmeans (%s).", nlmeans_opt);
+            return -1;
+        }
+        else if (nlmeans_tune_opt != NULL)
+        {
+            fprintf(stdout, "Default nlmeans parameters specified; ignoring nlmeans tune (%s).\n", nlmeans_tune_opt);
+        }
     }
     if (denoise)
     {
@@ -4378,6 +4382,11 @@ static int ParseOptions( int argc, char ** argv )
             free(denoise_opt);
             denoise_opt = opt;
         }
+        else if (denoise_opt != NULL)
+        {
+            fprintf(stderr, "Invalid parameters for hqdn3d (%s).", denoise_opt);
+            return -1;
+        }
     }
 
     return 0;