On 09/11/12 15:39, Brian Candler wrote:
Here's something weird. I'm trying to concatenate some strings which contain
<backslash> <n> (i.e.  not a newline).

Uh oh... here be dragons!

In a normal string literal, I have to enter four backslashes:

update reply {
     Reply-Message := "a\\\\nb"
}

("\\n" gives a newline, "\\\n" gives backslash followed by newline)

Yeah; I think there is a similar thing happening here to the regexp stuff I discussed on -devel recently.

I think what happens in the code is this:

1. lib/token.c:gettoken loads the config file and performs backslash processing on any quoted strings

2. conffile.c:cf_pairtovp loads the VP update list at config load time, and sets the "do_xlat" flag on any that are double-quoted

 3. modcall.c:modcall calls radius_update_attrlist

4. evaluate.c:radius_update_attrlist checks the "do_xlat" flag on the VP, which was set at config load, and calls expand_string (which calls radius_xlat) followed by pairparsevalue.


The net effect is that:

update x {
  Foo = "a\\\\n"
}

...is de-escaped many times:

 * into "a<backslash><backslash>n" by the gettoken / config file loader
 * into "a<backslash>n" by radius_xlat
 * into "a<newline>" by pairparsevalue (on the result of radius_xlat)

This kind of thing is pretty common - exim has a similar problem. It's difficult to know what to do about it in a manner that's universally satisfactory.

One solution is to not process "\x" anywhere except loading from config files, but that's likely a very significant backwards compatibility break... you also might *want* to provide a way for people to interpret escapes again (though this can be done with an xlat e.g.

"%{unescape:%{something-that-returns-backslash-n}}" == "<newline>"

Others options exist. Personally I find the existing behaviour quite surprising, but it's also something I very seldom run into, so don't worry too much about.
-
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

Reply via email to