Inconsistent escaping of regex parentheses

Tim tim at yetanother.net
Tue Jan 21 15:37:49 CET 2020


(First of all, apologies if the formatting of this email formatting isn’t 100% - it’s been a while since I replied to an archived email post on a mailing list and it would appear that using a web based client is a pretty horrific experience out of the box..)

>> I'm in the process of upgrading an old 2.2.0 installation of
>> FreeRADIUS to a more sane 3.0.17 release (stock from current CentOS).
> 
> That's good, but 3.0.20 is available from our web site:

Fair point.. I’ve moved onto the 3.0.20 build while investigating this.

> What does the full debug log show?

Using a fresh install of 3.0.20 on CentOS 8, I added the following Unlang procedure to the start of the authorise section within the default server; in order to trigger the behaviour:

testRegex {
       update control {
               Tmp-String-0 = '@(DOMAIN1|DOMAIN2)$'
       }

       if ( &User-Name =~ /%{control:Tmp-String-0}/i ) {
               update control {
                       Tmp-String-1 = 'Yay!'
               }
       }
}


Results of the regex quoting are technically the same - but here the comparison simply fails rather than returning an error.

— v3.0.20 - FreeRADIUS - Official repo

(1)     policy testRegex {
(1)       update control {
(1)         Tmp-String-0 = '@(DOMAIN1|DOMAIN2)$'
(1)       } # update control = noob
(1)       if ( &User-Name =~ /%{control:Tmp-String-0}/i ) {
(1)       EXPAND %{control:Tmp-String-0}
(1)          --> @\(DOMAIN1\|DOMAIN2)\$
(1)       if ( &User-Name =~ /%{control:Tmp-String-0}/i )  -> FALSE
(1)     } # policy testRegex = noop


The different error behaviour made me slightly curious, so I went back to a completely clean v3.0.17 CentOS deployment, used the same Unlang procedure as above - and the originally seen error is seen.

— v3.0.17 - CentOS 

(1) # Executing section authorize from file /etc/raddb/sites-enabled/default
(1)   authorize {
(1)     policy testRegex {
(1)       update control {
(1)         Tmp-String-0 = '@(DOMAIN1|DOMAIN2)$'
(1)       } # update control = noop
(1)       if ( &User-Name =~ /%{control:Tmp-String-0}/i ) {
(1)       EXPAND %{control:Tmp-String-0}
(1)          --> @\(DOMAIN1\|DOMAIN2)\$
(1) ERROR: @\(DOMAIN1\|DOMAIN2)\$
(1) ERROR:           ^ Pattern compilation failed: unmatched parentheses
(1)       ERROR: Failed retrieving values required to evaluate condition
(1)     } # policy testRegex = noop


In both cases the regex fails as it is syntactically broken once escaping takes place.


Thanks in advance

—
Tim


More information about the Freeradius-Users mailing list