Openwall GNU/*/Linux - a small security-enhanced Linux distro for servers
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Tue, 15 Aug 2017 15:12:17 +0200
From: Denys Vlasenko <vda.linux@...glemail.com>
To: Rich Felker <dalias@...c.org>, musl <musl@...ts.openwall.com>
Subject: fnmatch bug? escaping of '-' and ']' inside [...] does not work.

Moving bbox build to musl did uncover one definite bug.
bbox has gazillion tests for its shells, and one of them
started failing. I added debug printout and with it,
the following fnmatch calls give different results now:

ash: fnmatch(pattern:'[a\-c]',str:'-',0):1
ash: fnmatch(pattern:'[\]]',str:']',0):1
ash: fnmatch(pattern:'[a\]]',str:']',0):1

glibc and uclibc threat the above as a match.

The assumption may be that one should place ']' or '-'
as a first character in the [...] and thus escaping
is not necessary, but shell does not have the luxury
of choosing the pattern, in comes from the script.

Just in case you want to know, the complete test is:

# Testing glob-escaping of every ASCII punctuation char
# Some chars have more than one test
# 21..2f
case '!' in [\!] ) echo ok;; *) echo 'WRONG!';; esac
case '"' in [\"] ) echo ok;; *) echo 'WRONG"';; esac
case '#' in [\#] ) echo ok;; *) echo 'WRONG#';; esac
case '$' in [\$] ) echo ok;; *) echo 'WRONG$';; esac
case '%' in [\%] ) echo ok;; *) echo 'WRONG%';; esac
case '&' in [\&] ) echo ok;; *) echo 'WRONG&';; esac
case "'" in [\'] ) echo ok;; *) echo "WRONG'";; esac
case '(' in [\(] ) echo ok;; *) echo 'WRONG(';; esac
case ')' in [\)] ) echo ok;; *) echo 'WRONG)';; esac
case '*' in [\*] ) echo ok;; *) echo 'WRONG*';; esac
case '+' in [\+] ) echo ok;; *) echo 'WRONG+';; esac
case ',' in [\,] ) echo ok;; *) echo 'WRONG,';; esac
case '-' in [\-] ) echo ok;; *) echo 'WRONG-';; esac
case '-' in [a\-c]) echo ok;; *) echo 'WRONGa\-c';; esac
case '.' in [\.] ) echo ok;; *) echo 'WRONG.';; esac
case '/' in [\/] ) echo ok;; *) echo 'WRONG/';; esac
# 3a..40
case ':' in [\:] ) echo ok;; *) echo 'WRONG:';; esac
case ';' in [\;] ) echo ok;; *) echo 'WRONG;';; esac
case '<' in [\<] ) echo ok;; *) echo 'WRONG<';; esac
case '=' in [\=] ) echo ok;; *) echo 'WRONG=';; esac
case '>' in [\>] ) echo ok;; *) echo 'WRONG>';; esac
case '?' in [\?] ) echo ok;; *) echo 'WRONG?';; esac
case '@' in [\@] ) echo ok;; *) echo 'WRONG@';; esac
# 5b..60
case '[' in [\[] ) echo ok;; *) echo 'WRONG[';; esac
case '\' in [\\] ) echo ok;; *) echo 'WRONG\';; esac
case '\' in \\ ) echo ok;; *) echo 'WRONG\\';; esac
case ']' in [\]] ) echo ok;; *) echo 'WRONG]';; esac
case ']' in [a\]]) echo ok;; *) echo 'WRONGa]';; esac
case '^' in [\^] ) echo ok;; *) echo 'WRONG^';; esac
case '_' in [\_] ) echo ok;; *) echo 'WRONG_';; esac
case '`' in [\`] ) echo ok;; *) echo 'WRONG`';; esac
# 7b..7e
case '{' in [\{] ) echo ok;; *) echo 'WRONG{';; esac
case '|' in [\|] ) echo ok;; *) echo 'WRONG|';; esac
case '}' in [\}] ) echo ok;; *) echo 'WRONG}';; esac
case '~' in [\~] ) echo ok;; *) echo 'WRONG~';; esac

Powered by blists - more mailing lists

Your e-mail address:

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.