From 419f48d0d1b7dc10c4c25814f4d4d6067f56b6de Mon Sep 17 00:00:00 2001 From: Miguel Angel Cabrera Moya Date: Wed, 20 Apr 2011 22:52:36 +0200 Subject: [PATCH] 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 --- gst/parse/types.h | 9 ++++++++- tests/check/pipelines/parse-launch.c | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) 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 8dbe32f..e693d11 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; -- 2.7.4