1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-05-23 12:41:29 +02:00

52216: metafy usernames to allow for them to be UTF-8 encoded

This commit is contained in:
Oliver Kiddle 2023-10-10 23:46:15 +02:00
parent 83f8a71a7c
commit 4878c2b130
2 changed files with 21 additions and 8 deletions
ChangeLog
Src/Modules

View file

@ -1,5 +1,8 @@
2023-10-10 Oliver Kiddle <opk@zsh.org>
* 52216: Src/Modules/watch.c: metafy usernames to allow for
them to be UTF-8 encoded
* 52214: Src/subst.c: allow extra byte for nul in allocation
* unposted (cf. 52166): Functions/Misc/run-help-svk:

View file

@ -423,20 +423,23 @@ watchlog2(int inout, WATCH_STRUCT_UTMP *u, char *fmt, int prnt, int fini)
/* See if the watch entry matches */
static int
watchlog_match(char *teststr, char *actual, int len)
watchlog_match(char *teststr, char *actual, size_t buflen)
{
int ret = 0;
Patprog pprog;
char *str = dupstring(teststr);
int len = strnlen(actual, buflen);
char *user = metafy(actual, len,
len == buflen ? META_HEAPDUP : META_USEHEAP);
tokenize(str);
if ((pprog = patcompile(str, PAT_STATIC, 0))) {
queue_signals();
if (pattry(pprog, actual))
if (pattry(pprog, user))
ret = 1;
unqueue_signals();
} else if (!strncmp(actual, teststr, len))
} else if (!strcmp(user, teststr))
ret = 1;
return ret;
}
@ -456,10 +459,17 @@ watchlog(int inout, WATCH_STRUCT_UTMP *u, char **w, char *fmt)
(void)watchlog2(inout, u, fmt, 1, 0);
return;
}
if (*w && !strcmp(*w, "notme") &&
strncmp(u->ut_name, get_username(), sizeof(u->ut_name))) {
(void)watchlog2(inout, u, fmt, 1, 0);
return;
if (*w && !strcmp(*w, "notme")) {
int len = strnlen(u->ut_name, sizeof(u->ut_name));
char *username = metafy(u->ut_name, len,
(len == sizeof(u->ut_name) ?
META_HEAPDUP /* allow for nul terminator */ :
META_USEHEAP));
if (strcmp(username, get_username())) {
(void)watchlog2(inout, u, fmt, 1, 0);
return;
}
w++;
}
for (; *w; w++) {
bad = 0;
@ -488,7 +498,7 @@ watchlog(int inout, WATCH_STRUCT_UTMP *u, char **w, char *fmt)
for (vv = ++v; *vv && *vv != '%'; vv++);
sav = *vv;
*vv = '\0';
if (!watchlog_match(v, u->ut_host, strlen(v)))
if (!watchlog_match(v, u->ut_host, sizeof(u->ut_host)))
bad = 1;
*vv = sav;
v = vv;