Date: Tue, 27 Apr 2004 22:00:37 -0700 (PDT) From: Craig Boston <craig@olyun.gank.org> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/59883: divert cannot be renamed in FreeBSD m4 [with patch] Message-ID: <200404280500.i3S50bIu099251@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/59883; it has been noted by GNATS. From: Craig Boston <craig@olyun.gank.org> To: freebsd-gnats-submit@FreeBSD.org, bremner@unb.ca Cc: Subject: Re: bin/59883: divert cannot be renamed in FreeBSD m4 [with patch] Date: Tue, 27 Apr 2004 23:50:34 -0500 --Boundary-00=_agzjAbC17iIIQlN Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, I've recently run into the same problem with our m4 -- defn() appears to not work correctly with builtins, so they cannot be copied/renamed at all. The problem seems to be the result of a commit from about 2 years (!) ago. Guess nobody uses BSD m4 very much :) http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/m4/main.c?rev=1.14&content-type=text/x-cvsweb-markup p->defn = null; was changed to p->defn = xstrdup(null); as part of a GCC3 const/WARNS sweep. null is apparently a pointer to a somewhat "magic" empty string. The problem happens in dodefn() in eval.c when this is checked: if (p->defn != null) { [ do stuff for macros ] } else ... { [ do stuff for builtins ] } p->defn is no longer == to null for builtins, but rather a copy of it. I changed it to instead check p->type to see if it's a macro or not and that seems to fix it. Also checked the OpenBSD CVS and it looks like they fixed the problem there with a very similar (though more extensive) approach. A quick grep/once-over of the code didn't turn up any more (ab)use of pointers to "null" that would be affected by this. Patch is both inline (tabs mangled I'm sure) and attached -- I don't remember if gnats accepts MIME attachments :-/ --- eval.c.orig Tue Apr 27 23:33:03 2004 +++ eval.c Tue Apr 27 23:33:57 2004 @@ -617,7 +617,7 @@ const char *real; if ((p = lookup(name)) != nil) { - if (p->defn != null) { + if ((p->type & TYPEMASK) == MACRTYPE) { pbstr(rquote); pbstr(p->defn); pbstr(lquote); --Boundary-00=_agzjAbC17iIIQlN Content-Type: text/plain; charset="us-ascii"; name="bsd.m4.defn.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="bsd.m4.defn.patch" --- eval.c.orig Tue Apr 27 23:33:03 2004 +++ eval.c Tue Apr 27 23:33:57 2004 @@ -617,7 +617,7 @@ const char *real; if ((p = lookup(name)) != nil) { - if (p->defn != null) { + if ((p->type & TYPEMASK) == MACRTYPE) { pbstr(rquote); pbstr(p->defn); pbstr(lquote); --Boundary-00=_agzjAbC17iIIQlN--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404280500.i3S50bIu099251>