|
Message-ID: <CAK1hOcPAE-usFVzRrNMV0QPZPErX8Dww0hA3GjkoC1xAKxXjHA@mail.gmail.com> 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
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.