Arch devs,
I have a script that parses IP and CIDR notation using the following
to capture IPs:
[[ $1 =~ ^([^.]{1,3})[.]([^.]{1,3})[.]([^.]{1,3})[.]([^.]{1,3})$ ]]
# validate 5 elements in BASH_REMATCH array
if [ "${#BASH_REMATCH[@]}" -eq 5 ]; then
...
(yes, I can improve it -- but that's not the point here)
Then to capture CIDR:
[[ $1 =~ ^([^.]{1,3})[.]([^.]{1,3})[.]([^.]{1,3})[.]([^.]{1,3})/(.*)$ ]]
# validate 6 elements in BASH_REMATCH array
if [ "${#BASH_REMATCH[@]}" -eq 6 ]; then
...
This script was used to automatically update ipset lists and save
/etc/ipset.conf. It has worked for years.
Today after update to bash-5.2.037-3-x86_64 I get:
$ ipsa 38.0.0.0/8
/home/david/scr/adm/ipset_add.sh: line 6: [: 0/8: integer expression
expected
/home/david/scr/adm/ipset_add.sh: line 6: [: 0/8: integer expression
expected
valid IP: 38.0.0.0/8
ipset v7.23: Hash is full, cannot add more elements
The problem being for the first time ever, the regex in:
[[ $1 =~ ^([^.]{1,3})[.]([^.]{1,3})[.]([^.]{1,3})[.]([^.]{1,3})$ ]]
parsed the IP as 38 0 0 0/8 (with the "/8") instead of 38 0 0 0 filling
the ipset blocklist completely with sequential 38.x.x.x IPs.
Technically this regex matching is correct as the final character
list [^.] doesn't preclude inclusion of '/', but this is a definite
change from all prior bash versions. Is this the intended result of the
gentoo patches change to the package?
I've since fixed the regex with [^./] as the final list. Are there
any other known changes to regex parsing with the changes to the bash
PKGBUILD and patches?
--
David C. Rankin, J.D.,P.E.