Hi!

On Sat, Sep 03, 2022 at 07:43:26PM +0200, Andreas Henriksson wrote:
> On Sun, May 22, 2022 at 12:20:27AM +0200, наб wrote:
> > Package: mount
> > Version: 2.36.1-8+deb11u1
> > Severity: normal
> > 
> > Dear Maintainer,
> > 
> > I just got this:
> > nabijaczleweli@tarta:~/uwu/SunOS 2.0 (Tape) [Sun-2]/tape1$ sudo umount 
> > 04.awk: cmd. line:8: (FILENAME=- FNR=1) fatal: invalid regexp: Invalid 
> > range end: /^/home/nabijaczleweli/uwu/SunOS 2.0 (Tape) [Sun-2]/tape1/
> > dawk: cmd. line:8: (FILENAME=- FNR=1) fatal: invalid regexp: Invalid range 
> > end: /^/home/nabijaczleweli/uwu/SunOS 2.0 (Tape) [Sun-2]/tape1/
> 
> I have a gut feeling this is because of the awk implementation in use on
> your system. I think it would serve the bug report well if you could
> include this information (I'm guessing mawk).
> ie. `update-alternatives --query awk`

This had been the case in the past ‒ I even opened #956465 at one point ‒
where awk=mawk would either not work or explode for umount always,
which is why I switched back to awk=gawk:
-- >8 --
$ update-alternatives --query awk
Name: awk
Link: /usr/bin/awk
Slaves:
 awk.1.gz /usr/share/man/man1/awk.1.gz
 nawk /usr/bin/nawk
 nawk.1.gz /usr/share/man/man1/nawk.1.gz
Status: auto
Best: /usr/bin/gawk
Value: /usr/bin/gawk

Alternative: /usr/bin/gawk
Priority: 10
Slaves:
 awk.1.gz /usr/share/man/man1/gawk.1.gz
 nawk /usr/bin/gawk
 nawk.1.gz /usr/share/man/man1/gawk.1.gz

Alternative: /usr/bin/mawk
Priority: 5
Slaves:
 awk.1.gz /usr/share/man/man1/mawk.1.gz
 nawk /usr/bin/mawk
 nawk.1.gz /usr/share/man/man1/mawk.1.gz
-- >8 --

With set -x, when <tab>bing, I get this (trimmed to show texture):
-- >8 --
+++ findmnt -lno TARGET
+++ awk '{
                if ($0 ~ "^"ENVIRON["HOME"]) {
                        homeless = $0
                        sub("^"ENVIRON["HOME"], "~", homeless)
                        gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", 
"\\\\&", homeless)
                        print homeless " "
                }
                if ($0 ~ "^"ENVIRON["PWD"]) {
                        reldir = $0
                        sub("^"ENVIRON["PWD"]"/?", "", reldir)
                        gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", 
"\\\\&", reldir)
                        print "./" reldir " "
                        print reldir " "
                }
                gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", "\\\\&")
                print $0 " "
        }'
awk: cmd. line:8: (FILENAME=- FNR=1) fatal: invalid regexp: Invalid range end: 
/^/home/nabijaczleweli/uwu/SunOS 2.0 (Tape) [Sun-2]/tape1/
+ local opt
-- >8 --

If I cunningly override awk=mawk by setting `awk() { mawk "$@"; }`,
I get no explicit error:
-- >8 -:
+++ findmnt -lno TARGET
+++ awk '{
                if ($0 ~ "^"ENVIRON["HOME"]) {
                        homeless = $0
                        sub("^"ENVIRON["HOME"], "~", homeless)
                        gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", 
"\\\\&", homeless)
                        print homeless " "
                }
                if ($0 ~ "^"ENVIRON["PWD"]) {
                        reldir = $0
                        sub("^"ENVIRON["PWD"]"/?", "", reldir)
                        gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", 
"\\\\&", reldir)
                        print "./" reldir " "
                        print reldir " "
                }
                gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", "\\\\&")
                print $0 " "
        }'
+++ mawk '{
                if ($0 ~ "^"ENVIRON["HOME"]) {
                        homeless = $0
                        sub("^"ENVIRON["HOME"], "~", homeless)
                        gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", 
"\\\\&", homeless)
                        print homeless " "
                }
                if ($0 ~ "^"ENVIRON["PWD"]) {
                        reldir = $0
                        sub("^"ENVIRON["PWD"]"/?", "", reldir)
                        gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", 
"\\\\&", reldir)
                        print "./" reldir " "
                        print reldir " "
                }
                gsub("[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]", "\\\\&")
                print $0 " "
        }'
+ local opt
-- >8 --
but I also don't get any suggestions or completions.

So:
  gawk explodes
  mawk fails silently

Further analysis of line 8 shows that this is sufficient:
-- >8 --
~/uwu/SunOS 2.0 (Tape) [Sun-2]/tape1$ echo "$PWD" | gawk '{print ($0 ~ 
"^"ENVIRON["PWD"])}'
gawk: cmd. line:1: (FILENAME=- FNR=1) fatal: invalid regexp: Invalid range end: 
/^/home/nabijaczleweli/uwu/SunOS 2.0 (Tape) [Sun-2]/tape1/
~/uwu/SunOS 2.0 (Tape) [Sun-2]/tape1$ echo "$PWD" | mawk '{print ($0 ~ 
"^"ENVIRON["PWD"])}'
0
-- >8 --

Which I gamed down to:
-- >8 --
$ echo | gawk '{print ($0 ~ "[n-2]")}'
gawk: cmd. line:1: (FILENAME=- FNR=1) fatal: invalid regexp: Invalid range end: 
/[n-2]/
$ echo | mawk '{print ($0 ~ "[n-2]")}'
0
-- >8 --

So the solution seems to be "don't use paths as regexes lmao".
The correct spelling of that check would be
  substr($0, 0, length(ENVIRON["PWD"])) == ENVIRON["PWD"]
and of the subsequent string manipulation as 
  reldir = substr($0, length(ENVIRON["PWD"]) + 1)
  sub("^/", "", reldir)
for the second branch and
  substr($0, 0, length(ENVIRON["HOME"])) == ENVIRON["HOME"]
with
  homeless = "~" substr($0, length(ENVIRON["HOME"]) + 1)
for the first (checked on mawk and gawk).

Best,
наб

Attachment: signature.asc
Description: PGP signature

Reply via email to