From: Miguel Angel Cabrera Moya Date: Wed, 20 Apr 2011 20:52:36 +0000 (+0200) Subject: parse: don't unescape inside quotes X-Git-Tag: RELEASE-0.10.36~331 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f450817d7f3a1dc46d481f7a2285fa0fb451132f;p=platform%2Fupstream%2Fgstreamer.git parse: don't unescape inside quotes 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 --- diff --git a/gst/parse/types.h b/gst/parse/types.h index 7e8b994..db1f585 100644 --- a/gst/parse/types.h +++ b/gst/parse/types.h @@ -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++; diff --git a/tests/check/pipelines/parse-launch.c b/tests/check/pipelines/parse-launch.c index 3c7fdf9..072ef74 100644 --- a/tests/check/pipelines/parse-launch.c +++ b/tests/check/pipelines/parse-launch.c @@ -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;