Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190723183354.31633-1-ismael@iodev.co.uk>
Date: Tue, 23 Jul 2019 20:33:54 +0200
From: Ismael Luceno <ismael@...ev.co.uk>
To: musl@...ts.openwall.com
Cc: Ismael Luceno <ismael@...ev.co.uk>
Subject: [PATCH] glob: implement GLOB_TILDE

Signed-off-by: Ismael Luceno <ismael@...ev.co.uk>
---
 include/glob.h   |  1 +
 src/regex/glob.c | 26 ++++++++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/include/glob.h b/include/glob.h
index 76f6c1c68a23..fc8106b20c5b 100644
--- a/include/glob.h
+++ b/include/glob.h
@@ -30,6 +30,7 @@ void globfree(glob_t *);
 #define GLOB_APPEND   0x20
 #define GLOB_NOESCAPE 0x40
 #define	GLOB_PERIOD   0x80
+#define GLOB_TILDE    0x100
 
 #define GLOB_NOSPACE 1
 #define GLOB_ABORTED 2
diff --git a/src/regex/glob.c b/src/regex/glob.c
index aa1c6a4482ee..77b81f707420 100644
--- a/src/regex/glob.c
+++ b/src/regex/glob.c
@@ -8,6 +8,8 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <stddef.h>
+#include <unistd.h>
+#include "../passwd/pwf.h"
 
 struct match
 {
@@ -35,6 +37,30 @@ static int do_glob(char *buf, size_t pos, int type, char *pat, int flags, int (*
 	/* If GLOB_MARK is unused, we don't care about type. */
 	if (!type && !(flags & GLOB_MARK)) type = DT_REG;
 
+	if ((flags & GLOB_TILDE) && *pat == '~') {
+		struct passwd pw, *res;
+		char *buf = NULL;
+		size_t len = 0;
+		char *name_end = strchr(++pat, '/');
+		if (name_end)
+			*name_end = 0;
+		uid_t uid = *pat ? 0 : getuid();
+		int err = __getpw_a(pat, uid, &pw, &buf, &len, &res);
+		if (!err && res) {
+			while (pos < PATH_MAX - 1 && *pw.pw_dir)
+				buf[pos++] = *pw.pw_dir++;
+		}
+		free(buf);
+		if (err)
+			return GLOB_NOSPACE;
+		if (!res)
+			return 0;
+		if (name_end) {
+			pat = name_end;
+			*pat = '/';
+		}
+	}
+
 	/* Special-case the remaining pattern being all slashes, in
 	 * which case we can use caller-passed type if it's a dir. */
 	if (*pat && type!=DT_DIR) type = 0;
-- 
2.22.0

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.