summaryrefslogtreecommitdiff
path: root/sftp.c
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@zip.com.au>2013-06-06 08:19:09 +1000
committerDarren Tucker <dtucker@zip.com.au>2013-06-06 08:19:09 +1000
commitea64721275a81c4788af36294d94bf4f74012e06 (patch)
tree573278e745c701fc114627c2b792082c43e0b919 /sftp.c
parent194454d7a8f8cb8ac55f2b9d0199ef9445788bee (diff)
- dtucker@cvs.openbsd.org 2013/06/04 20:42:36
[sftp.c] Make sftp's libedit interface marginally multibyte aware by building up the quoted string by character instead of by byte. Prevents failures when linked against a libedit built with wide character support (bz#1990). "looks ok" djm
Diffstat (limited to 'sftp.c')
-rw-r--r--sftp.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/sftp.c b/sftp.c
index a723fa643..0c90fd1e4 100644
--- a/sftp.c
+++ b/sftp.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: sftp.c,v 1.145 2013/05/17 00:13:14 djm Exp $ */ 1/* $OpenBSD: sftp.c,v 1.146 2013/06/04 20:42:36 dtucker Exp $ */
2/* 2/*
3 * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> 3 * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
4 * 4 *
@@ -38,6 +38,7 @@
38#ifdef HAVE_LIBGEN_H 38#ifdef HAVE_LIBGEN_H
39#include <libgen.h> 39#include <libgen.h>
40#endif 40#endif
41#include <locale.h>
41#ifdef USE_LIBEDIT 42#ifdef USE_LIBEDIT
42#include <histedit.h> 43#include <histedit.h>
43#else 44#else
@@ -1701,8 +1702,9 @@ complete_match(EditLine *el, struct sftp_conn *conn, char *remote_path,
1701 char *file, int remote, int lastarg, char quote, int terminated) 1702 char *file, int remote, int lastarg, char quote, int terminated)
1702{ 1703{
1703 glob_t g; 1704 glob_t g;
1704 char *tmp, *tmp2, ins[3]; 1705 char *tmp, *tmp2, ins[8];
1705 u_int i, hadglob, pwdlen, len, tmplen, filelen, cesc, isesc, isabs; 1706 u_int i, hadglob, pwdlen, len, tmplen, filelen, cesc, isesc, isabs;
1707 int clen;
1706 const LineInfo *lf; 1708 const LineInfo *lf;
1707 1709
1708 /* Glob from "file" location */ 1710 /* Glob from "file" location */
@@ -1771,10 +1773,13 @@ complete_match(EditLine *el, struct sftp_conn *conn, char *remote_path,
1771 tmp2 = tmp + filelen - cesc; 1773 tmp2 = tmp + filelen - cesc;
1772 len = strlen(tmp2); 1774 len = strlen(tmp2);
1773 /* quote argument on way out */ 1775 /* quote argument on way out */
1774 for (i = 0; i < len; i++) { 1776 for (i = 0; i < len; i += clen) {
1777 if ((clen = mblen(tmp2 + i, len - i)) < 0 ||
1778 (size_t)clen > sizeof(ins) - 2)
1779 fatal("invalid multibyte character");
1775 ins[0] = '\\'; 1780 ins[0] = '\\';
1776 ins[1] = tmp2[i]; 1781 memcpy(ins + 1, tmp2 + i, clen);
1777 ins[2] = '\0'; 1782 ins[clen + 1] = '\0';
1778 switch (tmp2[i]) { 1783 switch (tmp2[i]) {
1779 case '\'': 1784 case '\'':
1780 case '"': 1785 case '"':
@@ -2120,6 +2125,7 @@ main(int argc, char **argv)
2120 2125
2121 /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ 2126 /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
2122 sanitise_stdfd(); 2127 sanitise_stdfd();
2128 setlocale(LC_CTYPE, "");
2123 2129
2124 __progname = ssh_get_progname(argv[0]); 2130 __progname = ssh_get_progname(argv[0]);
2125 memset(&args, '\0', sizeof(args)); 2131 memset(&args, '\0', sizeof(args));