[PATCH] Expand tilde for UNIX domain socket forwards.
lauri
lauri.vosandi at gmail.com
Fri May 13 18:15:49 AEST 2016
Hello,
any updates on this? We're preparing for upgrade to Ubuntu 16.04 and I
was hoping I don't have to patch OpenSSH again :D
2015-08-19 5:31 GMT+03:00 Todd C. Miller <Todd.Miller at courtesan.com>:
> On Tue, 18 Aug 2015 09:41:47 +1000, Damien Miller wrote:
>
>> Yeah, we should refactor it into a version that returns a ssherr.h code
>> and (perhaps) leave the existing tilde_expand_filename() as a wrapper.
>
> We could do something like this. The name stinks but...
>
> - todd
>
> Index: misc.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/misc.c,v
> retrieving revision 1.97
> diff -u -p -u -r1.97 misc.c
> --- misc.c 24 Apr 2015 01:36:00 -0000 1.97
> +++ misc.c 19 Aug 2015 02:28:18 -0000
> @@ -50,6 +50,7 @@
> #include "xmalloc.h"
> #include "misc.h"
> #include "log.h"
> +#include "ssherr.h"
> #include "ssh.h"
>
> /* remove newline at end of string */
> @@ -499,29 +500,31 @@ freeargs(arglist *args)
> * Expands tildes in the file name. Returns data allocated by xmalloc.
> * Warning: this calls getpw*.
> */
> -char *
> -tilde_expand_filename(const char *filename, uid_t uid)
> +int
> +tilde_expand_filename2(const char *filename, char **expanded, uid_t uid)
> {
> const char *path, *sep;
> char user[128], *ret;
> struct passwd *pw;
> - u_int len, slash;
> + size_t len, slash;
>
> - if (*filename != '~')
> - return (xstrdup(filename));
> + if (*filename != '~') {
> + *expanded = xstrdup(filename);
> + return SSH_ERR_SUCCESS;
> + }
> filename++;
>
> path = strchr(filename, '/');
> if (path != NULL && path > filename) { /* ~user/path */
> slash = path - filename;
> if (slash > sizeof(user) - 1)
> - fatal("tilde_expand_filename: ~username too long");
> + return SSH_ERR_PATH_TOO_LONG;
> memcpy(user, filename, slash);
> user[slash] = '\0';
> if ((pw = getpwnam(user)) == NULL)
> - fatal("tilde_expand_filename: No such user %s", user);
> + return SSH_ERR_UNKNOWN_USER;
> } else if ((pw = getpwuid(uid)) == NULL) /* ~/path */
> - fatal("tilde_expand_filename: No such uid %ld", (long)uid);
> + return SSH_ERR_UNKNOWN_USER;
>
> /* Make sure directory has a trailing '/' */
> len = strlen(pw->pw_dir);
> @@ -534,10 +537,29 @@ tilde_expand_filename(const char *filena
> if (path != NULL)
> filename = path + 1;
>
> - if (xasprintf(&ret, "%s%s%s", pw->pw_dir, sep, filename) >= PATH_MAX)
> - fatal("tilde_expand_filename: Path too long");
> + if (xasprintf(ret, "%s%s%s", pw->pw_dir, sep, filename) >= PATH_MAX) {
> + free(ret);
> + return SSH_ERR_PATH_TOO_LONG;
> + }
> +
> + *expanded = ret;
> + return SSH_ERR_SUCCESS;
> +}
> +
> +/*
> + * Expands tildes in the file name. Returns data allocated by xmalloc.
> + * Warning: this calls getpw*.
> + */
> +char *
> +tilde_expand_filename(const char *filename, uid_t uid)
> +{
> + char *ret;
> + int rc;
>
> - return (ret);
> + rc = tilde_expand_filename2(filename, &ret, uid);
> + if (rc != SSH_ERR_SUCCESS)
> + fatal("%s: %s", __func__, ssh_err(rc));
> + return ret;
> }
>
> /*
> Index: misc.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/misc.h,v
> retrieving revision 1.54
> diff -u -p -u -r1.54 misc.h
> --- misc.h 15 Jul 2014 15:54:14 -0000 1.54
> +++ misc.h 19 Aug 2015 02:27:37 -0000
> @@ -49,6 +49,7 @@ char *cleanhostname(char *);
> char *colon(char *);
> long convtime(const char *);
> char *tilde_expand_filename(const char *, uid_t);
> +int tilde_expand_filename2(const char *, char **, uid_t);
> char *percent_expand(const char *, ...) __attribute__((__sentinel__));
> char *tohex(const void *, size_t);
> void sanitise_stdfd(void);
> Index: ssherr.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/ssherr.c,v
> retrieving revision 1.4
> diff -u -p -u -r1.4 ssherr.c
> --- ssherr.c 16 Feb 2015 22:13:32 -0000 1.4
> +++ ssherr.c 19 Aug 2015 02:19:05 -0000
> @@ -135,6 +135,10 @@ ssh_err(int n)
> return "Connection corrupted";
> case SSH_ERR_PROTOCOL_ERROR:
> return "Protocol error";
> + case SSH_ERR_UNKNOWN_USER:
> + return "Unknown user";
> + case SSH_ERR_PATH_TOO_LONG:
> + return "Path too long";
> default:
> return "unknown error";
> }
> Index: ssherr.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/ssherr.h,v
> retrieving revision 1.3
> diff -u -p -u -r1.3 ssherr.h
> --- ssherr.h 30 Jan 2015 01:13:33 -0000 1.3
> +++ ssherr.h 19 Aug 2015 02:18:29 -0000
> @@ -77,6 +77,8 @@
> #define SSH_ERR_CONN_TIMEOUT -53
> #define SSH_ERR_CONN_CORRUPT -54
> #define SSH_ERR_PROTOCOL_ERROR -55
> +#define SSH_ERR_UNKNOWN_USER -56
> +#define SSH_ERR_PATH_TOO_LONG -57
>
> /* Translate a numeric error code to a human-readable error string */
> const char *ssh_err(int n);
--
Lauri Võsandi
tel: +372 53329412
e-mail: lauri.vosandi at gmail.com
blog: http://lauri.vosandi.com/
More information about the openssh-unix-dev
mailing list