View | Details | Raw Unified | Return to bug 1094 | Differences between
and this patch

Collapse All | Expand All

(-)misc.c (-1 / +38 lines)
Lines 358-367 addargs(arglist *args, char *fmt, ...) Link Here
358
	va_list ap;
358
	va_list ap;
359
	char buf[1024];
359
	char buf[1024];
360
	u_int nalloc;
360
	u_int nalloc;
361
	int r;
361
362
362
	va_start(ap, fmt);
363
	va_start(ap, fmt);
363
	vsnprintf(buf, sizeof(buf), fmt, ap);
364
	r = vsnprintf(buf, sizeof(buf), fmt, ap);
364
	va_end(ap);
365
	va_end(ap);
366
	if (r == -1 || r >= (int)sizeof(buf))
367
		fatal("addargs: argument too long");
365
368
366
	nalloc = args->nalloc;
369
	nalloc = args->nalloc;
367
	if (args->list == NULL) {
370
	if (args->list == NULL) {
Lines 376-381 addargs(arglist *args, char *fmt, ...) Link Here
376
	args->list[args->num] = NULL;
379
	args->list[args->num] = NULL;
377
}
380
}
378
381
382
void
383
replacearg(arglist *args, u_int which, char *fmt, ...)
384
{
385
	va_list ap;
386
	char buf[1024];
387
	int r;
388
389
	va_start(ap, fmt);
390
	r = vsnprintf(buf, sizeof(buf), fmt, ap);
391
	va_end(ap);
392
	if (r == -1 || r > (int)sizeof(buf))
393
		fatal("replacearg: argument too long");
394
395
	if (which >= args->num)
396
		fatal("replacearg: tried to replace invalid arg %d >= %d",
397
		    which, args->num);
398
	xfree(args->list[which]);
399
	args->list[which] = xstrdup(buf);
400
}
401
402
void
403
freeargs(arglist *args)
404
{
405
	u_int i;
406
407
	if (args->list != NULL) {
408
		for (i = 0; i < args->num; i++)
409
			xfree(args->list[i]);
410
		xfree(args->list);
411
		args->nalloc = args->num = 0;
412
		args->list = NULL;
413
	}
414
}
415
379
/*
416
/*
380
 * Expands tildes in the file name.  Returns data allocated by xmalloc.
417
 * Expands tildes in the file name.  Returns data allocated by xmalloc.
381
 * Warning: this calls getpw*.
418
 * Warning: this calls getpw*.
(-)misc.h (-1 / +5 lines)
Lines 36-42 struct arglist { Link Here
36
	u_int   num;
36
	u_int   num;
37
	u_int   nalloc;
37
	u_int   nalloc;
38
};
38
};
39
void	 addargs(arglist *, char *, ...) __attribute__((format(printf, 2, 3)));
39
void	 addargs(arglist *, char *, ...)
40
	     __attribute__((format(printf, 2, 3)));
41
void	 replacearg(arglist *, u_int, char *, ...)
42
	     __attribute__((format(printf, 3, 4)));
43
void	 freeargs(arglist *);
40
44
41
/* readpass.c */
45
/* readpass.c */
42
46
(-)scp.c (-40 / +85 lines)
Lines 118-123 killchild(int signo) Link Here
118
	exit(1);
118
	exit(1);
119
}
119
}
120
120
121
static int
122
do_local_cmd(arglist *a)
123
{
124
	u_int i;
125
	int status;
126
	pid_t pid;
127
128
	if (a->num == 0)
129
		fatal("do_local_cmd: no arguments");
130
131
	if (verbose_mode) {
132
		fprintf(stderr, "Executing:");
133
		for (i = 0; i < a->num; i++)
134
			fprintf(stderr, " %s", a->list[i]);
135
		fprintf(stderr, "\n");
136
	}
137
	if ((pid = fork()) == -1)
138
		fatal("do_local_cmd: fork: %s", strerror(errno));
139
140
	if (pid == 0) {
141
		execvp(a->list[0], a->list);
142
		perror(a->list[0]);
143
		exit(1);
144
	}
145
146
	do_cmd_pid = pid;
147
	signal(SIGTERM, killchild);
148
	signal(SIGINT, killchild);
149
	signal(SIGHUP, killchild);
150
151
	while (waitpid(pid, &status, 0) == -1)
152
		if (errno != EINTR)
153
			fatal("do_local_cmd: waitpid: %s", strerror(errno));
154
155
	do_cmd_pid = -1;
156
157
	if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
158
		return (-1);
159
160
	return (0);
161
}
162
121
/*
163
/*
122
 * This function executes the given command as the specified user on the
164
 * This function executes the given command as the specified user on the
123
 * given host.  This returns < 0 if execution fails, and >= 0 otherwise. This
165
 * given host.  This returns < 0 if execution fails, and >= 0 otherwise. This
Lines 162-168 do_cmd(char *host, char *remuser, char * Link Here
162
		close(pin[0]);
204
		close(pin[0]);
163
		close(pout[1]);
205
		close(pout[1]);
164
206
165
		args.list[0] = ssh_program;
207
		replacearg(&args, 0, "%s", ssh_program);
166
		if (remuser != NULL)
208
		if (remuser != NULL)
167
			addargs(&args, "-l%s", remuser);
209
			addargs(&args, "-l%s", remuser);
168
		addargs(&args, "%s", host);
210
		addargs(&args, "%s", host);
Lines 224-231 main(int argc, char **argv) Link Here
224
266
225
	__progname = ssh_get_progname(argv[0]);
267
	__progname = ssh_get_progname(argv[0]);
226
268
269
	memset(&args, '\0', sizeof(args));
227
	args.list = NULL;
270
	args.list = NULL;
228
	addargs(&args, "ssh");		/* overwritten with ssh_program */
271
	addargs(&args, "%s", ssh_program);
229
	addargs(&args, "-x");
272
	addargs(&args, "-x");
230
	addargs(&args, "-oForwardAgent no");
273
	addargs(&args, "-oForwardAgent no");
231
	addargs(&args, "-oClearAllForwardings yes");
274
	addargs(&args, "-oClearAllForwardings yes");
Lines 364-369 toremote(char *targ, int argc, char **ar Link Here
364
{
407
{
365
	int i, len;
408
	int i, len;
366
	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
409
	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
410
	arglist alist;
411
412
	memset(&alist, '\0', sizeof(alist));
413
	alist.list = NULL;
367
414
368
	*targ++ = 0;
415
	*targ++ = 0;
369
	if (*targ == 0)
416
	if (*targ == 0)
Lines 381-400 toremote(char *targ, int argc, char **ar Link Here
381
		tuser = NULL;
428
		tuser = NULL;
382
	}
429
	}
383
430
431
	if (tuser != NULL && !okname(tuser)) {
432
		xfree(arg);
433
		return;
434
	}
435
384
	for (i = 0; i < argc - 1; i++) {
436
	for (i = 0; i < argc - 1; i++) {
385
		src = colon(argv[i]);
437
		src = colon(argv[i]);
386
		if (src) {	/* remote to remote */
438
		if (src) {	/* remote to remote */
387
			static char *ssh_options =
439
			freeargs(&alist);
388
			    "-x -o'ClearAllForwardings yes'";
440
			addargs(&alist, "%s", ssh_program);
441
			if (verbose_mode)
442
				addargs(&alist, "-v");
443
			addargs(&alist, "-x");
444
			addargs(&alist, "-oClearAllForwardings yes");
445
			addargs(&alist, "-n");
446
389
			*src++ = 0;
447
			*src++ = 0;
390
			if (*src == 0)
448
			if (*src == 0)
391
				src = ".";
449
				src = ".";
392
			host = strrchr(argv[i], '@');
450
			host = strrchr(argv[i], '@');
393
			len = strlen(ssh_program) + strlen(argv[i]) +
451
394
			    strlen(src) + (tuser ? strlen(tuser) : 0) +
395
			    strlen(thost) + strlen(targ) +
396
			    strlen(ssh_options) + CMDNEEDS + 20;
397
			bp = xmalloc(len);
398
			if (host) {
452
			if (host) {
399
				*host++ = 0;
453
				*host++ = 0;
400
				host = cleanhostname(host);
454
				host = cleanhostname(host);
Lines 405-434 toremote(char *targ, int argc, char **ar Link Here
405
					xfree(bp);
459
					xfree(bp);
406
					continue;
460
					continue;
407
				}
461
				}
408
				if (tuser && !okname(tuser)) {
462
				addargs(&alist, "-l");
409
					xfree(bp);
463
				addargs(&alist, "%s", suser);
410
					continue;
411
				}
412
				snprintf(bp, len,
413
				    "%s%s %s -n "
414
				    "-l %s %s %s %s '%s%s%s:%s'",
415
				    ssh_program, verbose_mode ? " -v" : "",
416
				    ssh_options, suser, host, cmd, src,
417
				    tuser ? tuser : "", tuser ? "@" : "",
418
				    thost, targ);
419
			} else {
464
			} else {
420
				host = cleanhostname(argv[i]);
465
				host = cleanhostname(argv[i]);
421
				snprintf(bp, len,
422
				    "exec %s%s %s -n %s "
423
				    "%s %s '%s%s%s:%s'",
424
				    ssh_program, verbose_mode ? " -v" : "",
425
				    ssh_options, host, cmd, src,
426
				    tuser ? tuser : "", tuser ? "@" : "",
427
				    thost, targ);
428
			}
466
			}
429
			if (verbose_mode)
467
			addargs(&alist, "%s", host);
430
				fprintf(stderr, "Executing: %s\n", bp);
468
			addargs(&alist, "%s", cmd);
431
			if (system(bp) != 0)
469
			addargs(&alist, "%s", src);
470
			addargs(&alist, "%s%s%s:%s",
471
			    tuser ? tuser : "", tuser ? "@" : "",
472
			    thost, targ);
473
			if (do_local_cmd(&alist) != 0)
432
				errs = 1;
474
				errs = 1;
433
			(void) xfree(bp);
475
			(void) xfree(bp);
434
		} else {	/* local to remote */
476
		} else {	/* local to remote */
Lines 454-473 tolocal(int argc, char **argv) Link Here
454
{
496
{
455
	int i, len;
497
	int i, len;
456
	char *bp, *host, *src, *suser;
498
	char *bp, *host, *src, *suser;
499
	arglist alist;
500
501
	memset(&alist, '\0', sizeof(alist));
502
	alist.list = NULL;
457
503
458
	for (i = 0; i < argc - 1; i++) {
504
	for (i = 0; i < argc - 1; i++) {
459
		if (!(src = colon(argv[i]))) {	/* Local to local. */
505
		if (!(src = colon(argv[i]))) {	/* Local to local. */
460
			len = strlen(_PATH_CP) + strlen(argv[i]) +
506
			freeargs(&alist);
461
			    strlen(argv[argc - 1]) + 20;
507
			addargs(&alist, "%s", _PATH_CP);
462
			bp = xmalloc(len);
508
			if (iamrecursive)
463
			(void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP,
509
				addargs(&alist, "-r");
464
			    iamrecursive ? " -r" : "", pflag ? " -p" : "",
510
			if (pflag)
465
			    argv[i], argv[argc - 1]);
511
				addargs(&alist, "-p");
466
			if (verbose_mode)
512
			addargs(&alist, "%s", argv[i]);
467
				fprintf(stderr, "Executing: %s\n", bp);
513
			addargs(&alist, "%s", argv[argc-1]);
468
			if (system(bp))
514
			if (do_local_cmd(&alist))
469
				++errs;
515
				++errs;
470
			(void) xfree(bp);
471
			continue;
516
			continue;
472
		}
517
		}
473
		*src++ = 0;
518
		*src++ = 0;
(-)sftp.c (-2 / +8 lines)
Lines 1448-1455 main(int argc, char **argv) Link Here
1448
	extern char *optarg;
1448
	extern char *optarg;
1449
1449
1450
	__progname = ssh_get_progname(argv[0]);
1450
	__progname = ssh_get_progname(argv[0]);
1451
1452
	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
1453
	sanitise_stdfd();
1454
1455
	memset(&alist, '\0', sizeof(alist));
1451
	args.list = NULL;
1456
	args.list = NULL;
1452
	addargs(&args, "ssh");		/* overwritten with ssh_program */
1457
	addargs(&args, ssh_program);
1453
	addargs(&args, "-oForwardX11 no");
1458
	addargs(&args, "-oForwardX11 no");
1454
	addargs(&args, "-oForwardAgent no");
1459
	addargs(&args, "-oForwardAgent no");
1455
	addargs(&args, "-oClearAllForwardings yes");
1460
	addargs(&args, "-oClearAllForwardings yes");
Lines 1483-1488 main(int argc, char **argv) Link Here
1483
			break;
1488
			break;
1484
		case 'S':
1489
		case 'S':
1485
			ssh_program = optarg;
1490
			ssh_program = optarg;
1491
			replacearg(&args, 0, "%s", ssh_program);
1486
			break;
1492
			break;
1487
		case 'b':
1493
		case 'b':
1488
			if (batchmode)
1494
			if (batchmode)
Lines 1559-1565 main(int argc, char **argv) Link Here
1559
		addargs(&args, "%s", host);
1565
		addargs(&args, "%s", host);
1560
		addargs(&args, "%s", (sftp_server != NULL ?
1566
		addargs(&args, "%s", (sftp_server != NULL ?
1561
		    sftp_server : "sftp"));
1567
		    sftp_server : "sftp"));
1562
		args.list[0] = ssh_program;
1563
1568
1564
		if (!batchmode)
1569
		if (!batchmode)
1565
			fprintf(stderr, "Connecting to %s...\n", host);
1570
			fprintf(stderr, "Connecting to %s...\n", host);
Lines 1572-1577 main(int argc, char **argv) Link Here
1572
			fprintf(stderr, "Attaching to %s...\n", sftp_direct);
1577
			fprintf(stderr, "Attaching to %s...\n", sftp_direct);
1573
		connect_to_server(sftp_direct, args.list, &in, &out);
1578
		connect_to_server(sftp_direct, args.list, &in, &out);
1574
	}
1579
	}
1580
	freeargs(&args);
1575
1581
1576
	err = interactive_loop(in, out, file1, file2);
1582
	err = interactive_loop(in, out, file1, file2);
1577
1583

Return to bug 1094