[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00244] Re: SEGV caused by group lookups
- Subject: [FDclone-users:00244] Re: SEGV caused by group lookups
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 19 Nov 2003 12:58:11 +0900
しらいです。
In Message-Id <86k75xu185.knu@iDaemons.org>
"Akinori MUSHA" <knu@iDaemons.org>さんwrites:
> FD 2.0x のいつ頃からか、ディレクトリを移ったときに不意に SEGV
> することがあり、なかなか再現できず気になっていたのですが、今回
> FD 2.04c で手元の環境限定ながら再現手順が分かり、コアも取れました。
getgrgid() の返した static value である gr_mem を複製しな
いでそのまま保持しているので、getgrgid() を何度か繰返すこと
で元の値が失われてしまっているんでしょうね。
getgrgid() の実装にもよりますが、static value ではなく動的
に malloc() で確保していた場合、free() した領域に access し
てしまうことになりますね。
以下の patch でどうでしょう?
---- Cut Here ----
diff -u ../old/FD-2.04c/pathname.c ./pathname.c
--- ../old/FD-2.04c/pathname.c Wed Oct 15 00:00:00 2003
+++ ./pathname.c Wed Nov 19 12:40:17 2003
@@ -2917,7 +2917,7 @@
gidlist = b_realloc(gidlist, maxgid, gidtable);
gidlist[maxgid].gid = grp -> gr_gid;
gidlist[maxgid].name = strdup2(grp -> gr_name);
- gidlist[maxgid].gr_mem = grp -> gr_mem;
+ gidlist[maxgid].gr_mem = duplvar(grp -> gr_mem, -1);
gidlist[maxgid].ismem = 0;
return(&(gidlist[maxgid++]));
}
@@ -2932,13 +2932,15 @@
if (!(gp = findgid(gid, NULL))) return(0);
if (!(gp -> ismem)) {
gp -> ismem++;
- if ((up = finduid(geteuid(), NULL)))
+ if (gp -> gr_mem && (up = finduid(geteuid(), NULL)))
for (i = 0; gp -> gr_mem[i]; i++) {
if (!strpathcmp(up -> name, gp -> gr_mem[i])) {
gp -> ismem++;
break;
}
}
+ freevar(gp -> gr_mem);
+ gp -> gr_mem = NULL;
}
return(gp -> ismem - 1);
---- Cut Here ----
しらい たかし