Download raw body.
Fix for vi editing mode in sftp(1) (PING)
Hi Stuart, On Tue, Jan 20, 2026 at 09:40:49AM +0000, Stuart Henderson wrote: > If the existing unchecked el_set() calls fail it's not a big problem and > there isn't really anything sftp(1) can do differently. > > If el_get() fails you can't assume anything about the contents of the > pointer so it's not safe to use it. (Also remember that this code will > run with editline implementations other than OpenBSD's so being a bit > careful with this is appropriate). > > Note the return value of el_get() *is* checked in Complete() in sftp.c. > I'd already understood why you suggested including the check. I just felt it was unnecessary and I answered the way I did so as not to come across as pedantic. Does this version convince you? Index: sftp.c =================================================================== RCS file: /cvs/src/usr.bin/ssh/sftp.c,v diff -u -p -u -p -r1.247 sftp.c --- sftp.c 13 Oct 2025 00:54:29 -0000 1.247 +++ sftp.c 20 Jan 2026 11:06:05 -0000 @@ -2204,6 +2204,7 @@ interactive_loop(struct sftp_conn *conn, char *remote_path; char *dir = NULL, *startdir = NULL; char cmd[2048]; + const char *editor = "emacs"; int err, interactive; EditLine *el = NULL; History *hl = NULL; @@ -2220,7 +2221,7 @@ interactive_loop(struct sftp_conn *conn, el_set(el, EL_HIST, history, hl); el_set(el, EL_PROMPT, prompt); - el_set(el, EL_EDITOR, "emacs"); + el_set(el, EL_EDITOR, editor); el_set(el, EL_TERMINAL, NULL); el_set(el, EL_SIGNAL, 1); el_source(el, NULL); @@ -2239,6 +2240,10 @@ interactive_loop(struct sftp_conn *conn, el_set(el, EL_BIND, "\\e\\e[D", "ed-prev-word", NULL); /* make ^w match ksh behaviour */ el_set(el, EL_BIND, "^w", "ed-delete-prev-word", NULL); + + /* Vi command mode */ + if (el_get(el, EL_EDITOR, &editor) == 0 && editor[0] == 'v') + el_set(el, EL_BIND, "^[", "vi-command-mode", NULL); } if ((remote_path = sftp_realpath(conn, ".")) == NULL) -- Walter
Fix for vi editing mode in sftp(1) (PING)