unbreak parsing of IPv6 addresses in file-backed table(5)s
authorop <op@openbsd.org>
Thu, 2 May 2024 18:14:33 +0000 (18:14 +0000)
committerop <op@openbsd.org>
Thu, 2 May 2024 18:14:33 +0000 (18:14 +0000)
commit6d4e484edc121fc89f0411ffe0e2b306f11c6e0a
tree9cb4e6c947bbe3d4f4359b4523a0386e4e2804d3
parentdb2d50c399306fa5f4ec9e7ca1b40ac0056431fe
unbreak parsing of IPv6 addresses in file-backed table(5)s

The file parser splits the line on the ':' character too for key-value
tables, and so mis-parses IPv6 addresses.  The "::1 localhost" example
in table(5) is actually parsed as key "" and value ":1 localhost".

For list tables, the "# @list" marker can be used as a workaround, but
for key-valued the parser has to be fixed.

There are also some weird edge cases when splitting the lines.

Now the parser always splits on the first whitespace or colon, and then
strips the spaces.  For lines starting with '[' the parser will jump to
the matching ']' before attempting to split.  So, for example:

[::1]:localhost becomes "[::1]" -> "localhost"
[::1] example.org becomes "[::1]" -> "example.org"
foo: bar becomes "foo" -> "bar"
foo::bar becomes "foo" -> ":bar"
foo : bar becomes "foo" -> ": bar"

etc...

This only affects the parser for file table(5)s and makemap(8).  Inline
tables or "proc" tables are unaffected.

ok gilles@
usr.sbin/smtpd/table.5
usr.sbin/smtpd/util.c