Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: fix getfpfunc metafication
- X-seq: zsh-workers 54598
- From: Mikael Magnusson <mikachu@xxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: PATCH: fix getfpfunc metafication
- Date: Sat, 23 May 2026 08:37:08 +0200
- Archived-at: <https://zsh.org/workers/54598>
- List-id: <zsh-workers.zsh.org>
It wouldn't load functions if they or the directory they were in had a
metafied byte in the name, for example れ has a 0x82 byte.
---
Src/exec.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/Src/exec.c b/Src/exec.c
index 2a622230aa..f5c5e8e077 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -6256,29 +6256,34 @@ runshfunc(Eprog prog, FuncWrap wrap, char *name)
Eprog
getfpfunc(char *s, int *ksh, char **fdir, char **alt_path, int test_only)
{
- char **pp, buf[PATH_MAX+1];
+ char **pp, buf[PATH_MAX];
off_t len;
off_t rlen;
char *d;
Eprog r;
int fd;
+ char *su = unmeta(s);
+ if (su != s) su = dupstring(su);
pp = alt_path ? alt_path : fpath;
+ char *ppu = "";
for (; *pp; pp++) {
if (**pp) {
- if (snprintf(buf, PATH_MAX, "%s/%s", *pp, s) >= PATH_MAX)
+ ppu = unmeta(*pp);
+ if (ppu != *pp) ppu = dupstring(ppu);
+ if (snprintf(buf, PATH_MAX, "%s/%s", ppu, su) >= PATH_MAX)
continue;
- } else if (strlen(s) >= PATH_MAX) {
+ } else if (strlen(su) >= PATH_MAX) {
continue;
} else {
- strcpy(buf, s);
+ strcpy(buf, su);
+ ppu = "";
}
- if ((r = try_dump_file(*pp, s, buf, ksh, test_only))) {
+ if ((r = try_dump_file(ppu, s, buf, ksh, test_only))) {
if (fdir)
- *fdir = *pp;
+ *fdir = ppu;
return r;
}
- unmetafy(buf, NULL);
if (!access(buf, R_OK) && (fd = open(buf, O_RDONLY | O_NOCTTY)) != -1) {
struct stat st;
if (!fstat(fd, &st) && S_ISREG(st.st_mode) &&
@@ -6286,7 +6291,7 @@ getfpfunc(char *s, int *ksh, char **fdir, char **alt_path, int test_only)
if (test_only) {
close(fd);
if (fdir)
- *fdir = *pp;
+ *fdir = ppu;
return &dummy_eprog;
}
d = (char *) zalloc(len + 1);
@@ -6303,7 +6308,7 @@ getfpfunc(char *s, int *ksh, char **fdir, char **alt_path, int test_only)
scriptname = oldscriptname;
if (fdir)
- *fdir = *pp;
+ *fdir = ppu;
zfree(d, len + 1);
--
2.38.1
Messages sorted by:
Reverse Date,
Date,
Thread,
Author