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++;
#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)
{
* 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;