bug#45339: Readline filename completion

"Jakub Wojciech" <[email protected]>
Newsgroups gmane.lisp.guile.bugs
Message-ID <[email protected]>
Hi. Filename completion just doesn't work at all. Using
filename-completion-function as a completer for readline always throws
an error.

Minimal example:
  (use-modules (ice-9 readline))

  (with-readline-completion-function
   filename-completion-function
   readline)

Hitting TAB when prompted results in:
  File: Backtrace:
  In ice-9/boot-9.scm:
    1736:10  8 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _)
  In unknown file:
             7 (apply-smob/0 #<thunk 7ffa51f5e500>)
  In ice-9/boot-9.scm:
      718:2  6 (call-with-prompt _ _ #<procedure default-prompt-handler (k proc)>)
  In ice-9/eval.scm:
      619:8  5 (_ #(#(#<directory (guile-user) 7ffa51f63c80>)))
  In ice-9/boot-9.scm:
     2806:4  4 (save-module-excursion _)
    4351:12  3 (_)
  In ice-9/readline.scm:
      213:4  2 (with-readline-completion-function _ #<procedure 7ffa4f684328 at /data/lampilelo/Misc-Scripts/install-wizard.scm:27:1 ()>)
  In unknown file:
             1 (%readline "File: " #<input: file /dev/pts/1> #<undefined> #<undefined>)
             0 (filename-completion-function "" #t)

  ERROR: In procedure filename-completion-function:
  In procedure scm_from_stringn: NULL string pointer

My version of Guile is 3.0.4 but I expect it to fail on every version.
It results in an error because the scm_filename_completion_function()
calls readline's rl_filename_completion_function() and doesn't check if
it returned NULL instead of a string.
Readline's info manual states:
"The generator function returns '(char *)NULL' to inform
'rl_completion_matches()' that there are no more possibilities left."
So it's impossible for the current implementation to work, since
scm_filename_completion_function() throws an error every time NULL is
returned.

I'm attaching a patch.

Jakub
0001-Fixed-filename-completion-function-for-readline-comp.patch (text/x-patch, 1.2 KB)
From 1f8fce206dc657a04694f8b546df5d1fe1ca1856 Mon Sep 17 00:00:00 2001
From: Jakub Wojciech <[email protected]>
Date: Sun, 20 Dec 2020 10:56:51 +0100
Subject: [PATCH] Fixed filename-completion-function for readline completion

* guile-readline/readline.c (scm_filename_completion_function):
  A completion function should return #f when there's no more
  candidates.  Since the result of readline's
  rl_filename_completion_function was never checked it was impossible
  for it to work as intended and instead of #f it threw an error from
  trying to convert NULL to an scm string.
---
 guile-readline/readline.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/guile-readline/readline.c b/guile-readline/readline.c
index 5c4a32689..7bb2394ba 100644
--- a/guile-readline/readline.c
+++ b/guile-readline/readline.c
@@ -386,8 +386,11 @@ SCM_DEFINE (scm_filename_completion_function, "filename-completion-function", 2,
 #else
   s = filename_completion_function (c_text, scm_is_true (continuep));
 #endif
-  ans = scm_take_locale_string (s);
   free (c_text);
+  if (!s) {
+    return SCM_BOOL_F;
+  }
+  ans = scm_take_locale_string (s);
   return ans;
 }
 #undef FUNC_NAME
--
2.29.2
signature.asc (application/pgp-signature, 511 B)
-----BEGIN PGP SIGNATURE-----

iQFHBAEBCAAxFiEEjyJ5FFWW4Y1mdT0FcTDfCUiwZWUFAl/fKcITHGpha3ViLXdA
cmlzZXVwLm5ldAAKCRBxMN8JSLBlZYdgB/9I60dpM0gdiyWuAkfSHvnWqHKWY1DS
zYHtFYYRGMriL5UTu6vWWWj8QS9fjy5u66AbHIgIypnQkB1avFIe4kaaU8RJl/j0
pHsvExrSmE3Wa17Sd7U4VOqrB0/KgTXjm07pxlA75z3wFw9x5wdRfLZlnkwwVXuy
xnY3jjkWCa+3TEczSNa834rtXADzlMW5ucQODQrBlzZKtBDQ/Yxc7Gl4EAwkGVn2
dByTBKSS8XDq7tHYYCvaZglyzaCSZJSYIu/xlA9khpLjmil+seNWI0BlyqC4fznI
b+EkItYjyfWK1cPgE1nGj63kK+PGpADESjIhlyzjjf9+YTVTbTxl7uQt
=/HFP
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.