=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/sftp-server.c,v retrieving revision 1.140 retrieving revision 1.141 diff -u -r1.140 -r1.141 --- src/usr.bin/ssh/sftp-server.c 2022/03/31 03:05:49 1.140 +++ src/usr.bin/ssh/sftp-server.c 2022/08/12 05:20:28 1.141 @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.140 2022/03/31 03:05:49 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.141 2022/08/12 05:20:28 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -111,6 +111,7 @@ static void process_extended_limits(u_int32_t id); static void process_extended_expand(u_int32_t id); static void process_extended_copy_data(u_int32_t id); +static void process_extended_home_directory(u_int32_t id); static void process_extended(u_int32_t id); struct sftp_handler { @@ -157,6 +158,8 @@ { "expand-path", "expand-path@openssh.com", 0, process_extended_expand, 0 }, { "copy-data", "copy-data", 0, process_extended_copy_data, 1 }, + { "home-directory", "home-directory", 0, + process_extended_home_directory, 0 }, { NULL, NULL, 0, NULL, 0 } }; @@ -714,6 +717,7 @@ compose_extension(msg, "limits@openssh.com", "1"); compose_extension(msg, "expand-path@openssh.com", "1"); compose_extension(msg, "copy-data", "1"); + compose_extension(msg, "home-directory", "1"); send_msg(msg); sshbuf_free(msg); @@ -1649,6 +1653,31 @@ out: send_status(id, status); +} + +static void +process_extended_home_directory(u_int32_t id) +{ + char *username; + struct passwd *user_pw; + int r; + Stat s; + + if ((r = sshbuf_get_cstring(iqueue, &username, NULL)) != 0) + fatal_fr(r, "parse"); + + debug3("request %u: home-directory \"%s\"", id, username); + if ((user_pw = getpwnam(username)) == NULL) { + send_status(id, errno_to_portable(errno)); + goto out; + } + + verbose("home-directory \"%s\"", pw->pw_dir); + attrib_clear(&s.attrib); + s.name = s.long_name = pw->pw_dir; + send_names(id, 1, &s); + out: + free(username); } static void