If $var is non-empty and not a valid a number, {var}>&- silently closes fd
0.

var=x; (exec {var}>&-; test -e /dev/fd/0); echo $?
1

Seems like the test of the return value of legal_number is incorrect.
---
 redir.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/redir.c b/redir.c
index 804d9b82..267a9fc8 100644
--- a/redir.c
+++ b/redir.c
@@ -1459,7 +1459,7 @@ redir_varvalue (REDIRECT *redir)
   if (val == 0 || *val == 0)
     return -1;

- if (legal_number (val, &vmax) < 0)
+ if (legal_number (val, &vmax) <= 0)
     return -1;

   i = vmax; /* integer truncation */
-- 
2.40.0

Reply via email to