[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00244] Re: SEGV caused by group lookups



 しらいです。

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 ----

                                               しらい たかし