Switch ssh_config parsing to use argv_split()
authordjm <djm@openbsd.org>
Tue, 8 Jun 2021 07:07:15 +0000 (07:07 +0000)
committerdjm <djm@openbsd.org>
Tue, 8 Jun 2021 07:07:15 +0000 (07:07 +0000)
commit96ef22bdb07a9b39b814baeac32e04e0a0f99ad6
tree3307f283f9f494efe2cd8acea76eb5487666fbf9
parent4373d11768ba5bcdf7980a3fe858aef4f2c9ed10
Switch ssh_config parsing to use argv_split()

This fixes a couple of problems with the previous tokeniser,
strdelim()

1. strdelim() is permissive wrt accepting '=' characters. This is
   intended to allow it to tokenise "Option=value" but because it
   cannot keep state, it will incorrectly split "Opt=val=val2".
2. strdelim() has rudimentry handling of quoted strings, but it
   is incomplete and inconsistent. E.g. it doesn't handle escaped
   quotes inside a quoted string.
3. It has no support for stopping on a (unquoted) comment. Because
   of this readconf.c r1.343 added chopping of lines at '#', but
   this caused a regression because these characters may legitimately
   appear inside quoted strings.

The new tokeniser is stricter is a number of cases, including #1 above
but previously it was also possible for some directives to appear
without arguments. AFAIK these were nonsensical in all cases, and the
new tokeniser refuses to accept them.

The new code handles quotes much better, permitting quoted space as
well as escaped closing quotes. Finally, comment handling should be
fixed - the tokeniser will terminate only on unquoted # characters.

feedback & ok markus@

tested in snaps for the last five or so days - thanks Theo and those who
caught bugs
usr.bin/ssh/readconf.c
usr.bin/ssh/ssh.c