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

Collapse All | Expand All

(-)misc.c (-3 / +40 lines)
Lines 383-394 void Link Here
383
addargs(arglist *args, char *fmt, ...)
383
addargs(arglist *args, char *fmt, ...)
384
{
384
{
385
	va_list ap;
385
	va_list ap;
386
	char buf[1024];
386
	char *cp;
387
	u_int nalloc;
387
	u_int nalloc;
388
	int r;
388
389
389
	va_start(ap, fmt);
390
	va_start(ap, fmt);
390
	vsnprintf(buf, sizeof(buf), fmt, ap);
391
	r = vasprintf(&cp, fmt, ap);
391
	va_end(ap);
392
	va_end(ap);
393
	if (r == -1)
394
		fatal("addargs: argument too long");
392
395
393
	nalloc = args->nalloc;
396
	nalloc = args->nalloc;
394
	if (args->list == NULL) {
397
	if (args->list == NULL) {
Lines 399-406 addargs(arglist *args, char *fmt, ...) Link Here
399
402
400
	args->list = xrealloc(args->list, nalloc * sizeof(char *));
403
	args->list = xrealloc(args->list, nalloc * sizeof(char *));
401
	args->nalloc = nalloc;
404
	args->nalloc = nalloc;
402
	args->list[args->num++] = xstrdup(buf);
405
	args->list[args->num++] = cp;
403
	args->list[args->num] = NULL;
406
	args->list[args->num] = NULL;
407
}
408
409
void
410
replacearg(arglist *args, u_int which, char *fmt, ...)
411
{
412
	va_list ap;
413
	char *cp;
414
	int r;
415
416
	va_start(ap, fmt);
417
	r = vasprintf(&cp, fmt, ap);
418
	va_end(ap);
419
	if (r == -1)
420
		fatal("replacearg: argument too long");
421
422
	if (which >= args->num)
423
		fatal("replacearg: tried to replace invalid arg %d >= %d",
424
		    which, args->num);
425
	xfree(args->list[which]);
426
	args->list[which] = cp;
427
}
428
429
void
430
freeargs(arglist *args)
431
{
432
	u_int i;
433
434
	if (args->list != NULL) {
435
		for (i = 0; i < args->num; i++)
436
			xfree(args->list[i]);
437
		xfree(args->list);
438
		args->nalloc = args->num = 0;
439
		args->list = NULL;
440
	}
404
}
441
}
405
442
406
/*
443
/*
(-)misc.h (-1 / +5 lines)
Lines 38-44 struct arglist { Link Here
38
	u_int   num;
38
	u_int   num;
39
	u_int   nalloc;
39
	u_int   nalloc;
40
};
40
};
41
void	 addargs(arglist *, char *, ...) __attribute__((format(printf, 2, 3)));
41
void	 addargs(arglist *, char *, ...)
42
	     __attribute__((format(printf, 2, 3)));
43
void	 replacearg(arglist *, u_int, char *, ...)
44
	     __attribute__((format(printf, 3, 4)));
45
void	 freeargs(arglist *);
42
46
43
/* readpass.c */
47
/* readpass.c */
44
48
(-)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 225-232 main(int argc, char **argv) Link Here
225
	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
267
	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
226
	sanitise_stdfd();
268
	sanitise_stdfd();
227
269
270
	memset(&args, '\0', sizeof(args));
228
	args.list = NULL;
271
	args.list = NULL;
229
	addargs(&args, "ssh");		/* overwritten with ssh_program */
272
	addargs(&args, "%s", ssh_program);
230
	addargs(&args, "-x");
273
	addargs(&args, "-x");
231
	addargs(&args, "-oForwardAgent no");
274
	addargs(&args, "-oForwardAgent no");
232
	addargs(&args, "-oPermitLocalCommand no");
275
	addargs(&args, "-oPermitLocalCommand no");
Lines 363-368 toremote(char *targ, int argc, char **ar Link Here
363
{
406
{
364
	int i, len;
407
	int i, len;
365
	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
408
	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
409
	arglist alist;
410
411
	memset(&alist, '\0', sizeof(alist));
412
	alist.list = NULL;
366
413
367
	*targ++ = 0;
414
	*targ++ = 0;
368
	if (*targ == 0)
415
	if (*targ == 0)
Lines 380-399 toremote(char *targ, int argc, char **ar Link Here
380
		tuser = NULL;
427
		tuser = NULL;
381
	}
428
	}
382
429
430
	if (tuser != NULL && !okname(tuser)) {
431
		xfree(arg);
432
		return;
433
	}
434
383
	for (i = 0; i < argc - 1; i++) {
435
	for (i = 0; i < argc - 1; i++) {
384
		src = colon(argv[i]);
436
		src = colon(argv[i]);
385
		if (src) {	/* remote to remote */
437
		if (src) {	/* remote to remote */
386
			static char *ssh_options =
438
			freeargs(&alist);
387
			    "-x -o'ClearAllForwardings yes'";
439
			addargs(&alist, "%s", ssh_program);
440
			if (verbose_mode)
441
				addargs(&alist, "-v");
442
			addargs(&alist, "-x");
443
			addargs(&alist, "-oClearAllForwardings yes");
444
			addargs(&alist, "-n");
445
388
			*src++ = 0;
446
			*src++ = 0;
389
			if (*src == 0)
447
			if (*src == 0)
390
				src = ".";
448
				src = ".";
391
			host = strrchr(argv[i], '@');
449
			host = strrchr(argv[i], '@');
392
			len = strlen(ssh_program) + strlen(argv[i]) +
450
393
			    strlen(src) + (tuser ? strlen(tuser) : 0) +
394
			    strlen(thost) + strlen(targ) +
395
			    strlen(ssh_options) + CMDNEEDS + 20;
396
			bp = xmalloc(len);
397
			if (host) {
451
			if (host) {
398
				*host++ = 0;
452
				*host++ = 0;
399
				host = cleanhostname(host);
453
				host = cleanhostname(host);
Lines 404-433 toremote(char *targ, int argc, char **ar Link Here
404
					xfree(bp);
458
					xfree(bp);
405
					continue;
459
					continue;
406
				}
460
				}
407
				if (tuser && !okname(tuser)) {
461
				addargs(&alist, "-l");
408
					xfree(bp);
462
				addargs(&alist, "%s", suser);
409
					continue;
410
				}
411
				snprintf(bp, len,
412
				    "%s%s %s -n "
413
				    "-l %s %s %s %s '%s%s%s:%s'",
414
				    ssh_program, verbose_mode ? " -v" : "",
415
				    ssh_options, suser, host, cmd, src,
416
				    tuser ? tuser : "", tuser ? "@" : "",
417
				    thost, targ);
418
			} else {
463
			} else {
419
				host = cleanhostname(argv[i]);
464
				host = cleanhostname(argv[i]);
420
				snprintf(bp, len,
421
				    "exec %s%s %s -n %s "
422
				    "%s %s '%s%s%s:%s'",
423
				    ssh_program, verbose_mode ? " -v" : "",
424
				    ssh_options, host, cmd, src,
425
				    tuser ? tuser : "", tuser ? "@" : "",
426
				    thost, targ);
427
			}
465
			}
428
			if (verbose_mode)
466
			addargs(&alist, "%s", host);
429
				fprintf(stderr, "Executing: %s\n", bp);
467
			addargs(&alist, "%s", cmd);
430
			if (system(bp) != 0)
468
			addargs(&alist, "%s", src);
469
			addargs(&alist, "%s%s%s:%s",
470
			    tuser ? tuser : "", tuser ? "@" : "",
471
			    thost, targ);
472
			if (do_local_cmd(&alist) != 0)
431
				errs = 1;
473
				errs = 1;
432
			(void) xfree(bp);
474
			(void) xfree(bp);
433
		} else {	/* local to remote */
475
		} else {	/* local to remote */
Lines 453-472 tolocal(int argc, char **argv) Link Here
453
{
495
{
454
	int i, len;
496
	int i, len;
455
	char *bp, *host, *src, *suser;
497
	char *bp, *host, *src, *suser;
498
	arglist alist;
499
500
	memset(&alist, '\0', sizeof(alist));
501
	alist.list = NULL;
456
502
457
	for (i = 0; i < argc - 1; i++) {
503
	for (i = 0; i < argc - 1; i++) {
458
		if (!(src = colon(argv[i]))) {	/* Local to local. */
504
		if (!(src = colon(argv[i]))) {	/* Local to local. */
459
			len = strlen(_PATH_CP) + strlen(argv[i]) +
505
			freeargs(&alist);
460
			    strlen(argv[argc - 1]) + 20;
506
			addargs(&alist, "%s", _PATH_CP);
461
			bp = xmalloc(len);
507
			if (iamrecursive)
462
			(void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP,
508
				addargs(&alist, "-r");
463
			    iamrecursive ? " -r" : "", pflag ? " -p" : "",
509
			if (pflag)
464
			    argv[i], argv[argc - 1]);
510
				addargs(&alist, "-p");
465
			if (verbose_mode)
511
			addargs(&alist, "%s", argv[i]);
466
				fprintf(stderr, "Executing: %s\n", bp);
512
			addargs(&alist, "%s", argv[argc-1]);
467
			if (system(bp))
513
			if (do_local_cmd(&alist))
468
				++errs;
514
				++errs;
469
			(void) xfree(bp);
470
			continue;
515
			continue;
471
		}
516
		}
472
		*src++ = 0;
517
		*src++ = 0;
(-)sftp.c (-2 / +4 lines)
Lines 1433-1440 main(int argc, char **argv) Link Here
1433
	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
1433
	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
1434
	sanitise_stdfd();
1434
	sanitise_stdfd();
1435
1435
1436
	memset(&args, '\0', sizeof(args));
1436
	args.list = NULL;
1437
	args.list = NULL;
1437
	addargs(&args, "ssh");		/* overwritten with ssh_program */
1438
	addargs(&args, ssh_program);
1438
	addargs(&args, "-oForwardX11 no");
1439
	addargs(&args, "-oForwardX11 no");
1439
	addargs(&args, "-oForwardAgent no");
1440
	addargs(&args, "-oForwardAgent no");
1440
	addargs(&args, "-oPermitLocalCommand no");
1441
	addargs(&args, "-oPermitLocalCommand no");
Lines 1469-1474 main(int argc, char **argv) Link Here
1469
			break;
1470
			break;
1470
		case 'S':
1471
		case 'S':
1471
			ssh_program = optarg;
1472
			ssh_program = optarg;
1473
			replacearg(&args, 0, "%s", ssh_program);
1472
			break;
1474
			break;
1473
		case 'b':
1475
		case 'b':
1474
			if (batchmode)
1476
			if (batchmode)
Lines 1545-1551 main(int argc, char **argv) Link Here
1545
		addargs(&args, "%s", host);
1547
		addargs(&args, "%s", host);
1546
		addargs(&args, "%s", (sftp_server != NULL ?
1548
		addargs(&args, "%s", (sftp_server != NULL ?
1547
		    sftp_server : "sftp"));
1549
		    sftp_server : "sftp"));
1548
		args.list[0] = ssh_program;
1549
1550
1550
		if (!batchmode)
1551
		if (!batchmode)
1551
			fprintf(stderr, "Connecting to %s...\n", host);
1552
			fprintf(stderr, "Connecting to %s...\n", host);
Lines 1558-1563 main(int argc, char **argv) Link Here
1558
			fprintf(stderr, "Attaching to %s...\n", sftp_direct);
1559
			fprintf(stderr, "Attaching to %s...\n", sftp_direct);
1559
		connect_to_server(sftp_direct, args.list, &in, &out);
1560
		connect_to_server(sftp_direct, args.list, &in, &out);
1560
	}
1561
	}
1562
	freeargs(&args);
1561
1563
1562
	err = interactive_loop(in, out, file1, file2);
1564
	err = interactive_loop(in, out, file1, file2);
1563
1565

Return to bug 1094