summaryrefslogtreecommitdiff
path: root/sftp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sftp.c')
-rw-r--r--sftp.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/sftp.c b/sftp.c
index a2e3f6aad..f0d5dd557 100644
--- a/sftp.c
+++ b/sftp.c
@@ -1,3 +1,4 @@
1/* $OpenBSD: sftp.c,v 1.96 2007/01/03 04:09:15 stevesk Exp $ */
1/* 2/*
2 * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> 3 * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
3 * 4 *
@@ -16,21 +17,39 @@
16 17
17#include "includes.h" 18#include "includes.h"
18 19
19RCSID("$OpenBSD: sftp.c,v 1.70 2006/01/31 10:19:02 djm Exp $"); 20#include <sys/types.h>
21#include <sys/ioctl.h>
22#ifdef HAVE_SYS_STAT_H
23# include <sys/stat.h>
24#endif
25#include <sys/param.h>
26#include <sys/socket.h>
27#include <sys/wait.h>
28
29#include <errno.h>
20 30
31#ifdef HAVE_PATHS_H
32# include <paths.h>
33#endif
21#ifdef USE_LIBEDIT 34#ifdef USE_LIBEDIT
22#include <histedit.h> 35#include <histedit.h>
23#else 36#else
24typedef void EditLine; 37typedef void EditLine;
25#endif 38#endif
39#include <signal.h>
40#include <stdlib.h>
41#include <stdio.h>
42#include <string.h>
43#include <unistd.h>
44#include <stdarg.h>
26 45
27#include "buffer.h"
28#include "xmalloc.h" 46#include "xmalloc.h"
29#include "log.h" 47#include "log.h"
30#include "pathnames.h" 48#include "pathnames.h"
31#include "misc.h" 49#include "misc.h"
32 50
33#include "sftp.h" 51#include "sftp.h"
52#include "buffer.h"
34#include "sftp-common.h" 53#include "sftp-common.h"
35#include "sftp-client.h" 54#include "sftp-client.h"
36 55
@@ -147,6 +166,7 @@ static const struct CMD cmds[] = {
147 166
148int interactive_loop(int fd_in, int fd_out, char *file1, char *file2); 167int interactive_loop(int fd_in, int fd_out, char *file1, char *file2);
149 168
169/* ARGSUSED */
150static void 170static void
151killchild(int signo) 171killchild(int signo)
152{ 172{
@@ -158,6 +178,7 @@ killchild(int signo)
158 _exit(1); 178 _exit(1);
159} 179}
160 180
181/* ARGSUSED */
161static void 182static void
162cmd_interrupt(int signo) 183cmd_interrupt(int signo)
163{ 184{
@@ -235,7 +256,7 @@ local_do_shell(const char *args)
235 if (errno != EINTR) 256 if (errno != EINTR)
236 fatal("Couldn't wait for child: %s", strerror(errno)); 257 fatal("Couldn't wait for child: %s", strerror(errno));
237 if (!WIFEXITED(status)) 258 if (!WIFEXITED(status))
238 error("Shell exited abormally"); 259 error("Shell exited abnormally");
239 else if (WEXITSTATUS(status)) 260 else if (WEXITSTATUS(status))
240 error("Shell exited with status %d", WEXITSTATUS(status)); 261 error("Shell exited with status %d", WEXITSTATUS(status));
241} 262}
@@ -279,11 +300,11 @@ static char *
279path_append(char *p1, char *p2) 300path_append(char *p1, char *p2)
280{ 301{
281 char *ret; 302 char *ret;
282 int len = strlen(p1) + strlen(p2) + 2; 303 size_t len = strlen(p1) + strlen(p2) + 2;
283 304
284 ret = xmalloc(len); 305 ret = xmalloc(len);
285 strlcpy(ret, p1, len); 306 strlcpy(ret, p1, len);
286 if (p1[strlen(p1) - 1] != '/') 307 if (p1[0] != '\0' && p1[strlen(p1) - 1] != '/')
287 strlcat(ret, "/", len); 308 strlcat(ret, "/", len);
288 strlcat(ret, p2, len); 309 strlcat(ret, p2, len);
289 310
@@ -474,7 +495,7 @@ is_dir(char *path)
474 if (stat(path, &sb) == -1) 495 if (stat(path, &sb) == -1)
475 return(0); 496 return(0);
476 497
477 return(sb.st_mode & S_IFDIR); 498 return(S_ISDIR(sb.st_mode));
478} 499}
479 500
480static int 501static int
@@ -498,7 +519,7 @@ remote_is_dir(struct sftp_conn *conn, char *path)
498 return(0); 519 return(0);
499 if (!(a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS)) 520 if (!(a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS))
500 return(0); 521 return(0);
501 return(a->perm & S_IFDIR); 522 return(S_ISDIR(a->perm));
502} 523}
503 524
504static int 525static int
@@ -538,6 +559,7 @@ process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, int pflag)
538 559
539 if (g.gl_matchc == 1 && dst) { 560 if (g.gl_matchc == 1 && dst) {
540 /* If directory specified, append filename */ 561 /* If directory specified, append filename */
562 xfree(tmp);
541 if (is_dir(dst)) { 563 if (is_dir(dst)) {
542 if (infer_path(g.gl_pathv[0], &tmp)) { 564 if (infer_path(g.gl_pathv[0], &tmp)) {
543 err = 1; 565 err = 1;
@@ -562,8 +584,6 @@ process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, int pflag)
562 584
563out: 585out:
564 xfree(abs_src); 586 xfree(abs_src);
565 if (abs_dst)
566 xfree(abs_dst);
567 globfree(&g); 587 globfree(&g);
568 return(err); 588 return(err);
569} 589}
@@ -959,6 +979,7 @@ parse_args(const char **cpp, int *pflag, int *lflag, int *iflag,
959 case I_CHOWN: 979 case I_CHOWN:
960 case I_CHGRP: 980 case I_CHGRP:
961 /* Get numeric arg (mandatory) */ 981 /* Get numeric arg (mandatory) */
982 errno = 0;
962 l = strtol(cp, &cp2, base); 983 l = strtol(cp, &cp2, base);
963 if (cp2 == cp || ((l == LONG_MIN || l == LONG_MAX) && 984 if (cp2 == cp || ((l == LONG_MIN || l == LONG_MAX) &&
964 errno == ERANGE) || l < 0) { 985 errno == ERANGE) || l < 0) {
@@ -1280,6 +1301,7 @@ interactive_loop(int fd_in, int fd_out, char *file1, char *file2)
1280 if (parse_dispatch_command(conn, cmd, &pwd, 1) != 0) { 1301 if (parse_dispatch_command(conn, cmd, &pwd, 1) != 0) {
1281 xfree(dir); 1302 xfree(dir);
1282 xfree(pwd); 1303 xfree(pwd);
1304 xfree(conn);
1283 return (-1); 1305 return (-1);
1284 } 1306 }
1285 } else { 1307 } else {
@@ -1292,6 +1314,7 @@ interactive_loop(int fd_in, int fd_out, char *file1, char *file2)
1292 err = parse_dispatch_command(conn, cmd, &pwd, 1); 1314 err = parse_dispatch_command(conn, cmd, &pwd, 1);
1293 xfree(dir); 1315 xfree(dir);
1294 xfree(pwd); 1316 xfree(pwd);
1317 xfree(conn);
1295 return (err); 1318 return (err);
1296 } 1319 }
1297 xfree(dir); 1320 xfree(dir);
@@ -1356,6 +1379,7 @@ interactive_loop(int fd_in, int fd_out, char *file1, char *file2)
1356 break; 1379 break;
1357 } 1380 }
1358 xfree(pwd); 1381 xfree(pwd);
1382 xfree(conn);
1359 1383
1360#ifdef USE_LIBEDIT 1384#ifdef USE_LIBEDIT
1361 if (el != NULL) 1385 if (el != NULL)
@@ -1455,7 +1479,7 @@ main(int argc, char **argv)
1455 __progname = ssh_get_progname(argv[0]); 1479 __progname = ssh_get_progname(argv[0]);
1456 memset(&args, '\0', sizeof(args)); 1480 memset(&args, '\0', sizeof(args));
1457 args.list = NULL; 1481 args.list = NULL;
1458 addargs(&args, ssh_program); 1482 addargs(&args, "%s", ssh_program);
1459 addargs(&args, "-oForwardX11 no"); 1483 addargs(&args, "-oForwardX11 no");
1460 addargs(&args, "-oForwardAgent no"); 1484 addargs(&args, "-oForwardAgent no");
1461 addargs(&args, "-oPermitLocalCommand no"); 1485 addargs(&args, "-oPermitLocalCommand no");
@@ -1544,7 +1568,7 @@ main(int argc, char **argv)
1544 fprintf(stderr, "Missing username\n"); 1568 fprintf(stderr, "Missing username\n");
1545 usage(); 1569 usage();
1546 } 1570 }
1547 addargs(&args, "-l%s",userhost); 1571 addargs(&args, "-l%s", userhost);
1548 } 1572 }
1549 1573
1550 if ((cp = colon(host)) != NULL) { 1574 if ((cp = colon(host)) != NULL) {