ports/59695: [PATCH] devel/gmake: add two patches to avoid core dumps
Sergey Matveychuk
sem at ciam.ru
Wed Nov 26 06:20:06 UTC 2003
>Number: 59695
>Category: ports
>Synopsis: [PATCH] devel/gmake: add two patches to avoid core dumps
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Tue Nov 25 22:20:04 PST 2003
>Closed-Date:
>Last-Modified:
>Originator: Sergey Matveychuk
>Release: FreeBSD 5.1-CURRENT i386
>Organization:
>Environment:
System: FreeBSD Current.sem-home.ciam.ru 5.1-CURRENT FreeBSD 5.1-CURRENT #1: Fri Nov 21 07:47:47 MSK 2003
>Description:
[DESCRIBE CHANGES]
devel/gmake:
* Add two patches to avoid core dumps on eval:
http://savannah.gnu.org/bugs/?func=detailbug&bug_id=1516&group_id=71
http://savannah.gnu.org/bugs/?func=detailbug&bug_id=1517&group_id=71
* Utilize INFO macro
Added file(s):
- files/patch-eval_conditional
- files/patch-eval_crash
Port maintainer (ade at FreeBSD.org) is cc'd.
Generated with FreeBSD Port Tools 0.50
>How-To-Repeat:
>Fix:
--- gmake-3.80_2.patch begins here ---
diff -ruN --exclude=CVS /usr/ports/devel/gmake.orig/Makefile /usr/ports/devel/gmake/Makefile
--- /usr/ports/devel/gmake.orig/Makefile Wed Nov 26 08:53:03 2003
+++ /usr/ports/devel/gmake/Makefile Wed Nov 26 09:02:42 2003
@@ -7,7 +7,7 @@
PORTNAME= gmake
PORTVERSION= 3.80
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= devel
MASTER_SITES= ${MASTER_SITE_GNU}
MASTER_SITE_SUBDIR= make
@@ -35,6 +35,7 @@
CONFIGURE_ENV+= MAKEINFO="/usr/bin/makeinfo --no-split"
MAN1= gmake.1
+INFO= make
.ifdef USE_GMAKE
.error You have `USE_GMAKE' variable defined either in environment or in make(1) arguments. Please undefine and try again.
diff -ruN --exclude=CVS /usr/ports/devel/gmake.orig/files/patch-eval_conditional /usr/ports/devel/gmake/files/patch-eval_conditional
--- /usr/ports/devel/gmake.orig/files/patch-eval_conditional Thu Jan 1 03:00:00 1970
+++ /usr/ports/devel/gmake/files/patch-eval_conditional Wed Nov 26 08:53:29 2003
@@ -0,0 +1,150 @@
+Index: read.c
+===================================================================
+RCS file: /cvsroot/make/make/read.c,v
+retrieving revision 1.124
+diff -u -B -b -r1.124 read.c
+--- read.c 14 Oct 2002 21:54:04 -0000 1.124
++++ read.c 25 Oct 2002 21:17:42 -0000
+@@ -272,6 +272,34 @@
+ return read_makefiles;
+ }
+
++/* Install a new conditional and return the previous one. */
++
++static struct conditionals *
++install_conditionals (struct conditionals *new)
++{
++ struct conditionals *save = conditionals;
++
++ bzero ((char *) new, sizeof (*new));
++ conditionals = new;
++
++ return save;
++}
++
++/* Free the current conditionals and reinstate a saved one. */
++
++static void
++restore_conditionals (struct conditionals *saved)
++{
++ /* Free any space allocated by conditional_line. */
++ if (conditionals->ignoring)
++ free (conditionals->ignoring);
++ if (conditionals->seen_else)
++ free (conditionals->seen_else);
++
++ /* Restore state. */
++ conditionals = saved;
++}
++
+ static int
+ eval_makefile (char *filename, int flags)
+ {
+@@ -388,6 +416,8 @@
+ eval_buffer (char *buffer)
+ {
+ struct ebuffer ebuf;
++ struct conditionals *saved;
++ struct conditionals new;
+ const struct floc *curfile;
+ int r;
+
+@@ -402,8 +432,12 @@
+ curfile = reading_file;
+ reading_file = &ebuf.floc;
+
++ saved = install_conditionals (&new);
++
+ r = eval (&ebuf, 1);
+
++ restore_conditionals (saved);
++
+ reading_file = curfile;
+
+ return r;
+@@ -412,13 +446,8 @@
+
+ /* Read file FILENAME as a makefile and add its contents to the data base.
+
+- SET_DEFAULT is true if we are allowed to set the default goal.
+-
+- FILENAME is added to the `read_makefiles' chain.
++ SET_DEFAULT is true if we are allowed to set the default goal. */
+
+- Returns 0 if a file was not found or not read.
+- Returns 1 if FILENAME was found and read.
+- Returns 2 if FILENAME was read, and we kept a reference (don't free it). */
+
+ static int
+ eval (struct ebuffer *ebuf, int set_default)
+@@ -782,9 +811,7 @@
+
+ /* Save the state of conditionals and start
+ the included makefile with a clean slate. */
+- save = conditionals;
+- bzero ((char *) &new_conditionals, sizeof new_conditionals);
+- conditionals = &new_conditionals;
++ save = install_conditionals (&new_conditionals);
+
+ /* Record the rules that are waiting so they will determine
+ the default goal before those in the included makefile. */
+@@ -810,14 +837,8 @@
+ }
+ }
+
+- /* Free any space allocated by conditional_line. */
+- if (conditionals->ignoring)
+- free (conditionals->ignoring);
+- if (conditionals->seen_else)
+- free (conditionals->seen_else);
+-
+- /* Restore state. */
+- conditionals = save;
++ /* Restore conditional state. */
++ restore_conditionals (save);
+
+ goto rule_complete;
+ }
+Index: tests/scripts/functions/eval
+===================================================================
+RCS file: /cvsroot/make/make/tests/scripts/functions/eval,v
+retrieving revision 1.1
+diff -u -B -b -r1.1 eval
+--- tests/scripts/functions/eval 8 Jul 2002 02:26:48 -0000 1.1
++++ tests/scripts/functions/eval 25 Oct 2002 21:17:42 -0000
+@@ -57,4 +57,35 @@
+
+ &compare_output($answer,&get_logfile(1));
+
++# Test to make sure eval'ing inside conditionals works properly
++
++$makefile3 = &get_tmpfile;
++
++open(MAKEFILE,"> $makefile3");
++
++print MAKEFILE <<'EOF';
++FOO = foo
++
++all:: ; @echo it
++
++define Y
++ all:: ; @echo worked
++endef
++
++ifdef BAR
++$(eval $(Y))
++endif
++
++EOF
++
++close(MAKEFILE);
++
++&run_make_with_options($makefile3, "", &get_logfile);
++$answer = "it\n";
++&compare_output($answer,&get_logfile(1));
++
++&run_make_with_options($makefile3, "BAR=1", &get_logfile);
++$answer = "it\nworked\n";
++&compare_output($answer,&get_logfile(1));
++
+ 1;
diff -ruN --exclude=CVS /usr/ports/devel/gmake.orig/files/patch-eval_crash /usr/ports/devel/gmake/files/patch-eval_crash
--- /usr/ports/devel/gmake.orig/files/patch-eval_crash Thu Jan 1 03:00:00 1970
+++ /usr/ports/devel/gmake/files/patch-eval_crash Wed Nov 26 08:53:29 2003
@@ -0,0 +1,77 @@
+Index: variable.h
+===================================================================
+RCS file: /cvsroot/make/make/variable.h,v
+retrieving revision 1.24
+diff -u -B -b -r1.24 variable.h
+--- variable.h 8 Aug 2002 00:11:19 -0000 1.24
++++ variable.h 25 Oct 2002 21:37:32 -0000
+@@ -107,6 +107,8 @@
+ extern char *expand_argument PARAMS ((char *str, char *end));
+ extern char *variable_expand_string PARAMS ((char *line, char *string,
+ long length));
++extern void install_variable_buffer PARAMS ((char **bufp, unsigned int *lenp));
++extern void restore_variable_buffer PARAMS ((char *buf, unsigned int len));
+
+ /* function.c */
+ extern int handle_function PARAMS ((char **op, char **stringp));
+Index: expand.c
+===================================================================
+RCS file: /cvsroot/make/make/expand.c,v
+retrieving revision 1.33
+diff -u -B -b -r1.33 expand.c
+--- expand.c 14 Oct 2002 21:54:04 -0000 1.33
++++ expand.c 25 Oct 2002 21:37:32 -0000
+@@ -545,3 +545,28 @@
+
+ return value;
+ }
++
++/* Install a new variable_buffer context, returning the current one for
++ safe-keeping. */
++
++void
++install_variable_buffer (char **bufp, unsigned int *lenp)
++{
++ *bufp = variable_buffer;
++ *lenp = variable_buffer_length;
++
++ variable_buffer = 0;
++ initialize_variable_output ();
++}
++
++/* Restore a previously-saved variable_buffer setting (free the current one).
++ */
++
++void
++restore_variable_buffer (char *buf, unsigned int len)
++{
++ free (variable_buffer);
++
++ variable_buffer = buf;
++ variable_buffer_length = len;
++}
+Index: function.c
+===================================================================
+RCS file: /cvsroot/make/make/function.c,v
+retrieving revision 1.71
+diff -u -B -b -r1.71 function.c
+--- function.c 14 Oct 2002 21:54:04 -0000 1.71
++++ function.c 25 Oct 2002 21:37:32 -0000
+@@ -1196,7 +1196,17 @@
+ static char *
+ func_eval (char *o, char **argv, const char *funcname)
+ {
++ char *buf;
++ unsigned int len;
++
++ /* Eval the buffer. Pop the current variable buffer setting so that the
++ eval'd code can use its own without conflicting. */
++
++ install_variable_buffer (&buf, &len);
++
+ eval_buffer (argv[0]);
++
++ restore_variable_buffer (buf, len);
+
+ return o;
+ }
diff -ruN --exclude=CVS /usr/ports/devel/gmake.orig/pkg-plist /usr/ports/devel/gmake/pkg-plist
--- /usr/ports/devel/gmake.orig/pkg-plist Wed Nov 26 08:53:03 2003
+++ /usr/ports/devel/gmake/pkg-plist Wed Nov 26 09:00:30 2003
@@ -1,7 +1,4 @@
bin/gmake
- at unexec install-info --delete %D/info/make.info %D/info/dir
-info/make.info
- at exec install-info %D/info/make.info %D/info/dir
%%NLS%%share/locale/da/LC_MESSAGES/make.mo
%%NLS%%share/locale/de/LC_MESSAGES/make.mo
%%NLS%%share/locale/es/LC_MESSAGES/make.mo
--- gmake-3.80_2.patch ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list