summaryrefslogtreecommitdiff
path: root/session.c
diff options
context:
space:
mode:
authordtucker@openbsd.org <dtucker@openbsd.org>2020-06-26 04:45:11 +0000
committerDamien Miller <djm@mindrot.org>2020-06-26 15:18:45 +1000
commitc9e24daac6324fcbdba171392c325bf9ccc3c768 (patch)
tree5648dee8d2e786c105576983628c44c41b96de0b /session.c
parent07f5f369a25e228a7357ef6c57205f191f073d99 (diff)
upstream: Expand path to ~/.ssh/rc rather than relying on it
being relative to the current directory, so that it'll still be found if the shell startup changes its directory. Since the path is potentially longer, make the cmd buffer that uses it dynamically sized. bz#3185, with & ok djm@ OpenBSD-Commit-ID: 36e33ff01497af3dc8226d0c4c1526fc3a1e46bf
Diffstat (limited to 'session.c')
-rw-r--r--session.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/session.c b/session.c
index 18cdfa8cf..f6193b98e 100644
--- a/session.c
+++ b/session.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: session.c,v 1.319 2020/03/13 03:17:07 djm Exp $ */ 1/* $OpenBSD: session.c,v 1.320 2020/06/26 04:45:11 dtucker Exp $ */
2/* 2/*
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 * All rights reserved 4 * All rights reserved
@@ -1206,19 +1206,21 @@ static void
1206do_rc_files(struct ssh *ssh, Session *s, const char *shell) 1206do_rc_files(struct ssh *ssh, Session *s, const char *shell)
1207{ 1207{
1208 FILE *f = NULL; 1208 FILE *f = NULL;
1209 char cmd[1024]; 1209 char *cmd = NULL, *user_rc = NULL;
1210 int do_xauth; 1210 int do_xauth;
1211 struct stat st; 1211 struct stat st;
1212 1212
1213 do_xauth = 1213 do_xauth =
1214 s->display != NULL && s->auth_proto != NULL && s->auth_data != NULL; 1214 s->display != NULL && s->auth_proto != NULL && s->auth_data != NULL;
1215 user_rc = tilde_expand_filename("~/" _PATH_SSH_USER_RC, getuid());
1215 1216
1216 /* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */ 1217 /* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */
1217 if (!s->is_subsystem && options.adm_forced_command == NULL && 1218 if (!s->is_subsystem && options.adm_forced_command == NULL &&
1218 auth_opts->permit_user_rc && options.permit_user_rc && 1219 auth_opts->permit_user_rc && options.permit_user_rc &&
1219 stat(_PATH_SSH_USER_RC, &st) >= 0) { 1220 stat(user_rc, &st) >= 0) {
1220 snprintf(cmd, sizeof cmd, "%s -c '%s %s'", 1221 if (xasprintf(&cmd, "%s -c '%s %s'", shell, _PATH_BSHELL,
1221 shell, _PATH_BSHELL, _PATH_SSH_USER_RC); 1222 user_rc) == -1)
1223 fatal("%s: xasprintf: %s", __func__, strerror(errno));
1222 if (debug_flag) 1224 if (debug_flag)
1223 fprintf(stderr, "Running %s\n", cmd); 1225 fprintf(stderr, "Running %s\n", cmd);
1224 f = popen(cmd, "w"); 1226 f = popen(cmd, "w");
@@ -1229,7 +1231,7 @@ do_rc_files(struct ssh *ssh, Session *s, const char *shell)
1229 pclose(f); 1231 pclose(f);
1230 } else 1232 } else
1231 fprintf(stderr, "Could not run %s\n", 1233 fprintf(stderr, "Could not run %s\n",
1232 _PATH_SSH_USER_RC); 1234 user_rc);
1233 } else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) { 1235 } else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
1234 if (debug_flag) 1236 if (debug_flag)
1235 fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, 1237 fprintf(stderr, "Running %s %s\n", _PATH_BSHELL,
@@ -1254,8 +1256,8 @@ do_rc_files(struct ssh *ssh, Session *s, const char *shell)
1254 options.xauth_location, s->auth_display, 1256 options.xauth_location, s->auth_display,
1255 s->auth_proto, s->auth_data); 1257 s->auth_proto, s->auth_data);
1256 } 1258 }
1257 snprintf(cmd, sizeof cmd, "%s -q -", 1259 if (xasprintf(&cmd, "%s -q -", options.xauth_location) == -1)
1258 options.xauth_location); 1260 fatal("%s: xasprintf: %s", __func__, strerror(errno));
1259 f = popen(cmd, "w"); 1261 f = popen(cmd, "w");
1260 if (f) { 1262 if (f) {
1261 fprintf(f, "remove %s\n", 1263 fprintf(f, "remove %s\n",
@@ -1269,6 +1271,8 @@ do_rc_files(struct ssh *ssh, Session *s, const char *shell)
1269 cmd); 1271 cmd);
1270 } 1272 }
1271 } 1273 }
1274 free(cmd);
1275 free(user_rc);
1272} 1276}
1273 1277
1274static void 1278static void