[FFmpeg-devel] Escaping from the escaping madness

Nicolas George nicolas.george at normalesup.org
Thu Nov 15 15:11:53 CET 2012


Hi.

With filters and options and various parsers, we have reached a point where
some part of options need to be escaped four times. This is insane and very
user-unfriendly. We may want to look for solutions.

1. Rework the parsing mechanism to reduce the need for escaping. For
   example, "foo,bar\\:qux" parsed into "foo" and "bar\:qux", and then the
   second into "bar" and "qux": it would be possible to rework the parser to
   avoid the need for doubling the backslash.

   I am rather against this solution, because it is probably quite complex
   to implement, and also because it is very program-unfriendly: if you are
   using ffmpeg directly, you can fiddle with escaping until you find the
   right level, but if you are writing a program that calls ffmpeg or the
   library API, you need accurate and predictable rules for escaping level
   interactions.

2. Read from files. It solves the problem, but it is rather annoying:
   creating temporary files and ensuring that they are cleaned up is always
   a hassle, and also a security concern if done improperly; it also raises
   security issues by itself ("-vf drawtext=text=@</etc/passwd" anyone?).
   Not a very good general solution IMHO.

3. Use environment variables. It can be a very easy and immediate fix: patch
   av_get_token so that if the string is "optional spaces; dollar sign;
   alphanumeric characters; optional spaces; end of string or delimiter", it
   returns the contents of the corresponding environment variable. Then it
   is only a matter of putting enough (2^n) backslashed in front of the
   dollar.

   I can propose a patch rather soon if people think it is a good idea.

4. Use configurable and/or asymmetric quotes. In Perl, instead of "foo", you
   can write q/foo/, and then you do not need to escape the double-quote
   (but you need to escape the slash instead); even better, you can write
   q{foo}, and then you only need to escape the braces if they do not nest
   properly. Similar concern: in shell, $(cmd) is preferred to `cmd` because
   parentheses will be matched and avoid escaping madness for nested command
   expansions. Another example: in M4, strings are quoted using `...', and
   can be nested if the quotes properly match.

   We could adopt a similar scheme for ffmpeg.
   
   Also, notice that we are in the XXIth century: Unicode exists, and has a
   hoard of quote pairs that nobody uses:

   U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
   U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
   U+275B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
   U+275C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
   U+275D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
   U+275E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
   U+301D REVERSED DOUBLE PRIME QUOTATION MARK
   U+301E DOUBLE PRIME QUOTATION MARK
   
   Or, simpler:

   U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   U+2018 LEFT SINGLE QUOTATION MARK
   U+2019 RIGHT SINGLE QUOTATION MARK
   U+201C LEFT DOUBLE QUOTATION MARK
   U+201D RIGHT DOUBLE QUOTATION MARK

   which are sometimes directly available on keyboards (at least X11/fr;
   (the first two are even in latin-1), but that some people may actually be
   using.

   I am not sure what is the best solution to make something without
   breaking compatibility too much, but I believe there are some solutions
   to be found.

Regards,

-- 
  Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121115/fb893a9e/attachment.asc>


More information about the ffmpeg-devel mailing list