parse: don't unescape inside quotes
authorMiguel Angel Cabrera Moya <madmac2501@gmail.com>
Wed, 20 Apr 2011 20:52:36 +0000 (22:52 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 14 May 2011 09:39:34 +0000 (11:39 +0200)
Escaped characters inside quoted strings are supposed to be unescaped by
deserialization functions, not by parsing functions.

https://bugzilla.gnome.org/show_bug.cgi?id=648025

gst/parse/types.h
tests/check/pipelines/parse-launch.c

index 7e8b9944552b0ec4c0460da49062dab27a300eab..db1f585646c5e4e81e4b0b16f2257c61a23dfee9 100644 (file)
@@ -69,17 +69,24 @@ static inline void
 gst_parse_unescape (gchar *str)
 {
   gchar *walk;
+  gboolean in_quotes;
 
   g_return_if_fail (str != NULL);
 
   walk = str;
+  in_quotes = FALSE;
 
   while (*walk) {
-    if (*walk == '\\') {
+    if (*walk == '\\' && !in_quotes) {
       walk++;
       /* make sure we don't read beyond the end of the string */
       if (*walk == '\0')
         break;
+    } else if (*walk == '"' && (!in_quotes || (in_quotes
+                && (*(walk - 1) != '\\')))) {
+      /* don't unescape inside quotes and don't switch
+       * state with escaped quoted inside quotes */
+      in_quotes = !in_quotes;
     }
     *str = *walk;
     str++;
index 3c7fdf9f6588ab64c0f28e266b0f5efc46f2b247..072ef74952ef746c51be77e14a3b875503d6c4ad 100644 (file)
@@ -145,6 +145,8 @@ GST_END_TEST;
 #define PIPELINE11 "fakesink silent=true name = sink identity silent=true name=id ( fakesrc num-buffers=\"4\" ! id. ) id. ! sink."
 #define PIPELINE12 "file:///tmp/test.file ! fakesink silent=true"
 #define PIPELINE13 "fakesrc ! file:///tmp/test.file"
+#define PIPELINE14 "capsfilter caps=application/x-rtp,sprop-parameter-sets=(string)\"x\\,x\""
+#define PIPELINE15 "capsfilter caps=application/x-rtp,sprop-parameter-sets=(string)\"x\\\"x\\,x\""
 
 GST_START_TEST (test_launch_lines2)
 {
@@ -285,6 +287,19 @@ GST_START_TEST (test_launch_lines2)
    * This should warn, but ignore the error and carry on */
   cur = setup_pipeline ("( filesrc blocksize=4 location=/dev/null @ )");
   gst_object_unref (cur);
+
+  /**
+   * Checks if characters inside quotes are not escaped.
+  */
+  cur = setup_pipeline (PIPELINE14);
+  gst_object_unref (cur);
+
+  /**
+   * Checks if escaped quotes inside quotes are not treated as end string quotes.
+   * This would make the rest of characters to be escaped incorrectly.
+   */
+  cur = setup_pipeline (PIPELINE15);
+  gst_object_unref (cur);
 }
 
 GST_END_TEST;