From bff15cc873ec17a9da49e0d15d3c71621f78b7dd Mon Sep 17 00:00:00 2001 From: Roman Rakus Date: Mar 30 2010 12:27:04 +0000 Subject: Corrected requires patch (#563301) --- diff --git a/bash-requires.patch b/bash-requires.patch index 77542cd..54e5a58 100644 --- a/bash-requires.patch +++ b/bash-requires.patch @@ -1,57 +1,94 @@ -diff -up bash-4.0/shell.c.requires bash-4.0/shell.c ---- bash-4.0/shell.c.requires 2009-01-21 15:28:16.000000000 +0100 -+++ bash-4.0/shell.c 2009-01-21 15:28:16.000000000 +0100 -@@ -193,6 +193,9 @@ int have_devfd = 0; - /* The name of the .(shell)rc file. */ - static char *bashrc_file = "~/.bashrc"; - -+/* Non-zero if we are finding the scripts requirements. */ -+int rpm_requires; +diff -up bash-4.0/builtins.h.requires bash-4.0/builtins.h +--- bash-4.0/builtins.h.requires 2009-01-04 20:32:23.000000000 +0100 ++++ bash-4.0/builtins.h 2010-03-30 13:58:31.000000000 +0200 +@@ -41,6 +41,8 @@ + #define SPECIAL_BUILTIN 0x08 /* This is a Posix `special' builtin. */ + #define ASSIGNMENT_BUILTIN 0x10 /* This builtin takes assignment statements. */ + #define POSIX_BUILTIN 0x20 /* This builtins is special in the Posix command search order. */ ++#define REQUIRES_BUILTIN 0x40 /* This builtin requires other files. */ + - /* Non-zero means to act more like the Bourne shell on startup. */ - static int act_like_sh; -@@ -251,6 +254,7 @@ static const struct { - { "posix", Int, &posixly_correct, (char **)0x0 }, - { "protected", Int, &protected_mode, (char **)0x0 }, - { "rcfile", Charp, (int *)0x0, &bashrc_file }, -+ { "rpm-requires", Int, &rpm_requires, (char **)0x0 }, - #if defined (RESTRICTED_SHELL) - { "restricted", Int, &restricted, (char **)0x0 }, - #endif -@@ -479,6 +483,12 @@ main (argc, argv, env) - if (dump_translatable_strings) - read_but_dont_execute = 1; + #define BASE_INDENT 4 -+ if (rpm_requires) -+ { -+ read_but_dont_execute = 1; -+ initialize_shell_builtins (); -+ } +diff -up bash-4.0/builtins/mkbuiltins.c.requires bash-4.0/builtins/mkbuiltins.c +--- bash-4.0/builtins/mkbuiltins.c.requires 2009-01-04 20:32:23.000000000 +0100 ++++ bash-4.0/builtins/mkbuiltins.c 2010-03-30 13:58:31.000000000 +0200 +@@ -69,9 +69,15 @@ extern char *strcpy (); + #define whitespace(c) (((c) == ' ') || ((c) == '\t')) + + /* Flag values that builtins can have. */ ++/* These flags are for the C code generator, ++ the C which is produced (./builtin.c) ++ includes the flags definitions found ++ in ../builtins.h */ + #define BUILTIN_FLAG_SPECIAL 0x01 + #define BUILTIN_FLAG_ASSIGNMENT 0x02 + #define BUILTIN_FLAG_POSIX_BUILTIN 0x04 ++#define BUILTIN_FLAG_REQUIRES 0x08 + - if (running_setuid && privileged_mode == 0) - disable_priv_mode (); -diff -up bash-4.0/doc/bashref.texi.requires bash-4.0/doc/bashref.texi ---- bash-4.0/doc/bashref.texi.requires 2009-01-21 15:28:16.000000000 +0100 -+++ bash-4.0/doc/bashref.texi 2009-01-21 15:28:16.000000000 +0100 -@@ -5253,6 +5253,13 @@ standard. @xref{Bash POSIX Mode}, for a - @item --restricted - Make the shell a restricted shell (@pxref{The Restricted Shell}). + #define BASE_INDENT 4 -+@item --rpm-requires -+Produce the list of files that are required for the -+shell script to run. This implies '-n' and is subject -+to the same limitations as compile time error checking checking; -+Backticks, [] tests, and evals are not parsed so some -+dependencies may be missed. +@@ -163,10 +169,18 @@ char *posix_builtins[] = + (char *)NULL + }; + ++/* The builtin commands that cause requirements on other files. */ ++static char *requires_builtins[] = ++{ ++ ".", "command", "exec", "source", "inlib", ++ (char *)NULL ++}; + - @item --verbose - Equivalent to @option{-v}. Print shell input lines as they're read. + /* Forward declarations. */ + static int is_special_builtin (); + static int is_assignment_builtin (); + static int is_posix_builtin (); ++static int is_requires_builtin (); + + #if !defined (HAVE_RENAME) + static int rename (); +@@ -812,6 +826,9 @@ builtin_handler (self, defs, arg) + new->flags |= BUILTIN_FLAG_ASSIGNMENT; + if (is_posix_builtin (name)) + new->flags |= BUILTIN_FLAG_POSIX_BUILTIN; ++ if (is_requires_builtin (name)) ++ new->flags |= BUILTIN_FLAG_REQUIRES; ++ + + array_add ((char *)new, defs->builtins); + building_builtin = 1; +@@ -1229,11 +1246,12 @@ write_builtins (defs, structfile, extern + else + fprintf (structfile, "(sh_builtin_func_t *)0x0, "); + +- fprintf (structfile, "%s%s%s%s, %s_doc,\n", ++ fprintf (structfile, "%s%s%s%s%s, %s_doc,\n", + "BUILTIN_ENABLED | STATIC_BUILTIN", + (builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "", + (builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "", + (builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "", ++ (builtin->flags & BUILTIN_FLAG_REQUIRES) ? " | REQUIRES_BUILTIN" : "", + document_name (builtin)); + fprintf +@@ -1581,6 +1599,13 @@ is_posix_builtin (name) + return (_find_in_table (name, posix_builtins)); + } + ++static int ++is_requires_builtin (name) ++ char *name; ++{ ++ return (_find_in_table (name, requires_builtins)); ++} ++ + #if !defined (HAVE_RENAME) + static int + rename (from, to) diff -up bash-4.0/doc/bash.1.requires bash-4.0/doc/bash.1 ---- bash-4.0/doc/bash.1.requires 2009-01-21 15:28:16.000000000 +0100 -+++ bash-4.0/doc/bash.1 2009-01-21 15:28:16.000000000 +0100 +--- bash-4.0/doc/bash.1.requires 2010-03-30 13:58:31.000000000 +0200 ++++ bash-4.0/doc/bash.1 2010-03-30 13:58:31.000000000 +0200 @@ -231,6 +231,13 @@ The shell becomes restricted (see .B "RESTRICTED SHELL" below). @@ -66,9 +103,94 @@ diff -up bash-4.0/doc/bash.1.requires bash-4.0/doc/bash.1 .B \-\-verbose Equivalent to \fB\-v\fP. .TP +diff -up bash-4.0/doc/bashref.texi.requires bash-4.0/doc/bashref.texi +--- bash-4.0/doc/bashref.texi.requires 2010-03-30 13:58:31.000000000 +0200 ++++ bash-4.0/doc/bashref.texi 2010-03-30 13:58:31.000000000 +0200 +@@ -5281,6 +5281,13 @@ standard. @xref{Bash POSIX Mode}, for a + @item --restricted + Make the shell a restricted shell (@pxref{The Restricted Shell}). + ++@item --rpm-requires ++Produce the list of files that are required for the ++shell script to run. This implies '-n' and is subject ++to the same limitations as compile time error checking checking; ++Backticks, [] tests, and evals are not parsed so some ++dependencies may be missed. ++ + @item --verbose + Equivalent to @option{-v}. Print shell input lines as they're read. + +diff -up bash-4.0/eval.c.requires bash-4.0/eval.c +--- bash-4.0/eval.c.requires 2009-01-04 20:32:26.000000000 +0100 ++++ bash-4.0/eval.c 2010-03-30 13:58:31.000000000 +0200 +@@ -53,6 +53,7 @@ extern int last_command_exit_value, stdi + extern int need_here_doc; + extern int current_command_number, current_command_line_count, line_number; + extern int expand_aliases; ++extern int rpm_requires; + + static void send_pwd_to_eterm __P((void)); + static sighandler alrm_catcher __P((int)); +@@ -136,7 +137,7 @@ reader_loop () + + if (read_command () == 0) + { +- if (interactive_shell == 0 && read_but_dont_execute) ++ if (interactive_shell == 0 && (read_but_dont_execute && !rpm_requires)) + { + last_command_exit_value = EXECUTION_SUCCESS; + dispose_command (global_command); +diff -up bash-4.0/execute_cmd.c.requires bash-4.0/execute_cmd.c +--- bash-4.0/execute_cmd.c.requires 2010-03-30 13:58:31.000000000 +0200 ++++ bash-4.0/execute_cmd.c 2010-03-30 14:01:03.000000000 +0200 +@@ -497,6 +497,8 @@ async_redirect_stdin () + + #define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0) + ++extern int rpm_requires; ++ + /* Execute the command passed in COMMAND, perhaps doing it asynchrounously. + COMMAND is exactly what read_command () places into GLOBAL_COMMAND. + ASYNCHROUNOUS, if non-zero, says to do this command in the background. +@@ -528,7 +530,13 @@ execute_command_internal (command, async + #else + if (breaking || continuing) + return (last_command_exit_value); +- if (command == 0 || read_but_dont_execute) ++ if (command == 0 || (read_but_dont_execute && !rpm_requires)) ++ return (EXECUTION_SUCCESS); ++ if (rpm_requires && command->type == cm_function_def) ++ return last_command_exit_value = ++ execute_intern_function (command->value.Function_def->name, ++ command->value.Function_def->command); ++ if (read_but_dont_execute) + return (EXECUTION_SUCCESS); + #endif + +@@ -4957,7 +4965,7 @@ execute_intern_function (name, function) + + if (check_identifier (name, posixly_correct) == 0) + { +- if (posixly_correct && interactive_shell == 0) ++ if (posixly_correct && interactive_shell == 0 && rpm_requires == 0) + { + last_command_exit_value = EX_BADUSAGE; + jump_to_top_level (ERREXIT); +diff -up bash-4.0/execute_cmd.h.requires bash-4.0/execute_cmd.h +--- bash-4.0/execute_cmd.h.requires 2009-01-16 22:20:15.000000000 +0100 ++++ bash-4.0/execute_cmd.h 2010-03-30 13:58:31.000000000 +0200 +@@ -22,6 +22,8 @@ + #define _EXECUTE_CMD_H_ + + #include "stdc.h" ++#include "variables.h" ++#include "command.h" + + extern struct fd_bitmap *new_fd_bitmap __P((int)); + extern void dispose_fd_bitmap __P((struct fd_bitmap *)); diff -up bash-4.0/make_cmd.c.requires bash-4.0/make_cmd.c --- bash-4.0/make_cmd.c.requires 2009-01-04 20:32:38.000000000 +0100 -+++ bash-4.0/make_cmd.c 2009-01-21 15:28:16.000000000 +0100 ++++ bash-4.0/make_cmd.c 2010-03-30 13:58:31.000000000 +0200 @@ -41,11 +41,15 @@ #include "flags.h" #include "make_cmd.h" @@ -152,159 +274,37 @@ diff -up bash-4.0/make_cmd.c.requires bash-4.0/make_cmd.c return (command); } -diff -up bash-4.0/execute_cmd.c.requires bash-4.0/execute_cmd.c ---- bash-4.0/execute_cmd.c.requires 2009-01-21 15:28:16.000000000 +0100 -+++ bash-4.0/execute_cmd.c 2009-01-21 15:28:16.000000000 +0100 -@@ -497,6 +497,8 @@ async_redirect_stdin () - - #define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0) - -+extern int rpm_requires; -+ - /* Execute the command passed in COMMAND, perhaps doing it asynchrounously. - COMMAND is exactly what read_command () places into GLOBAL_COMMAND. - ASYNCHROUNOUS, if non-zero, says to do this command in the background. -@@ -528,8 +530,13 @@ execute_command_internal (command, async - #else - if (breaking || continuing) - return (last_command_exit_value); -- if (command == 0 || read_but_dont_execute) -+ if (command == 0 || (read_but_dont_execute && !rpm_requires)) - return (EXECUTION_SUCCESS); -+ if (rpm_requires && command->type == cm_function_def) -+ return last_command_exit_value = -+ execute_intern_function (command->value.Function_def->name, -+ command->value.Function_def->command); -+ - #endif - - QUIT; -@@ -4859,7 +4866,7 @@ execute_intern_function (name, function) - - if (check_identifier (name, posixly_correct) == 0) - { -- if (posixly_correct && interactive_shell == 0) -+ if (posixly_correct && interactive_shell == 0 && rpm_requires == 0) - { - last_command_exit_value = EX_BADUSAGE; - jump_to_top_level (ERREXIT); -diff -up bash-4.0/execute_cmd.h.requires bash-4.0/execute_cmd.h ---- bash-4.0/execute_cmd.h.requires 2009-01-04 20:32:29.000000000 +0100 -+++ bash-4.0/execute_cmd.h 2009-01-21 15:28:16.000000000 +0100 -@@ -22,6 +22,8 @@ - #define _EXECUTE_CMD_H_ - - #include "stdc.h" -+#include "variables.h" -+#include "command.h" - - extern struct fd_bitmap *new_fd_bitmap __P((int)); - extern void dispose_fd_bitmap __P((struct fd_bitmap *)); -diff -up bash-4.0/builtins.h.requires bash-4.0/builtins.h ---- bash-4.0/builtins.h.requires 2009-01-04 20:32:23.000000000 +0100 -+++ bash-4.0/builtins.h 2009-01-21 16:10:39.000000000 +0100 -@@ -41,6 +41,8 @@ - #define SPECIAL_BUILTIN 0x08 /* This is a Posix `special' builtin. */ - #define ASSIGNMENT_BUILTIN 0x10 /* This builtin takes assignment statements. */ - #define POSIX_BUILTIN 0x20 /* This builtins is special in the Posix command search order. */ -+#define REQUIRES_BUILTIN 0x40 /* This builtin requires other files. */ -+ - - #define BASE_INDENT 4 - -diff -up bash-4.0/eval.c.requires bash-4.0/eval.c ---- bash-4.0/eval.c.requires 2009-01-04 20:32:26.000000000 +0100 -+++ bash-4.0/eval.c 2009-01-21 15:28:16.000000000 +0100 -@@ -53,6 +53,7 @@ extern int last_command_exit_value, stdi - extern int need_here_doc; - extern int current_command_number, current_command_line_count, line_number; - extern int expand_aliases; -+extern int rpm_requires; - - static void send_pwd_to_eterm __P((void)); - static sighandler alrm_catcher __P((int)); -@@ -136,7 +137,7 @@ reader_loop () - - if (read_command () == 0) - { -- if (interactive_shell == 0 && read_but_dont_execute) -+ if (interactive_shell == 0 && (read_but_dont_execute && !rpm_requires)) - { - last_command_exit_value = EXECUTION_SUCCESS; - dispose_command (global_command); -diff -up bash-4.0/builtins/mkbuiltins.c.requires bash-4.0/builtins/mkbuiltins.c ---- bash-4.0/builtins/mkbuiltins.c.requires 2009-01-04 20:32:23.000000000 +0100 -+++ bash-4.0/builtins/mkbuiltins.c 2009-01-21 16:16:05.000000000 +0100 -@@ -69,9 +69,15 @@ extern char *strcpy (); - #define whitespace(c) (((c) == ' ') || ((c) == '\t')) +diff -up bash-4.0/shell.c.requires bash-4.0/shell.c +--- bash-4.0/shell.c.requires 2010-03-30 13:58:31.000000000 +0200 ++++ bash-4.0/shell.c 2010-03-30 13:58:31.000000000 +0200 +@@ -193,6 +193,9 @@ int have_devfd = 0; + /* The name of the .(shell)rc file. */ + static char *bashrc_file = "~/.bashrc"; - /* Flag values that builtins can have. */ -+/* These flags are for the C code generator, -+ the C which is produced (./builtin.c) -+ includes the flags definitions found -+ in ../builtins.h */ - #define BUILTIN_FLAG_SPECIAL 0x01 - #define BUILTIN_FLAG_ASSIGNMENT 0x02 - #define BUILTIN_FLAG_POSIX_BUILTIN 0x04 -+#define BUILTIN_FLAG_REQUIRES 0x08 ++/* Non-zero if we are finding the scripts requirements. */ ++int rpm_requires; + + /* Non-zero means to act more like the Bourne shell on startup. */ + static int act_like_sh; - #define BASE_INDENT 4 - -@@ -163,10 +169,18 @@ char *posix_builtins[] = - (char *)NULL - }; - -+/* The builtin commands that cause requirements on other files. */ -+static char *requires_builtins[] = -+{ -+ ".", "command", "exec", "source", "inlib", -+ (char *)NULL -+}; -+ - /* Forward declarations. */ - static int is_special_builtin (); - static int is_assignment_builtin (); - static int is_posix_builtin (); -+static int is_requires_builtin (); +@@ -251,6 +254,7 @@ static const struct { + { "posix", Int, &posixly_correct, (char **)0x0 }, + { "protected", Int, &protected_mode, (char **)0x0 }, + { "rcfile", Charp, (int *)0x0, &bashrc_file }, ++ { "rpm-requires", Int, &rpm_requires, (char **)0x0 }, + #if defined (RESTRICTED_SHELL) + { "restricted", Int, &restricted, (char **)0x0 }, + #endif +@@ -479,6 +483,12 @@ main (argc, argv, env) + if (dump_translatable_strings) + read_but_dont_execute = 1; - #if !defined (HAVE_RENAME) - static int rename (); -@@ -812,6 +826,9 @@ builtin_handler (self, defs, arg) - new->flags |= BUILTIN_FLAG_ASSIGNMENT; - if (is_posix_builtin (name)) - new->flags |= BUILTIN_FLAG_POSIX_BUILTIN; -+ if (is_requires_builtin (name)) -+ new->flags |= BUILTIN_FLAG_REQUIRES; ++ if (rpm_requires) ++ { ++ read_but_dont_execute = 1; ++ initialize_shell_builtins (); ++ } + + if (running_setuid && privileged_mode == 0) + disable_priv_mode (); - array_add ((char *)new, defs->builtins); - building_builtin = 1; -@@ -1229,11 +1246,12 @@ write_builtins (defs, structfile, extern - else - fprintf (structfile, "(sh_builtin_func_t *)0x0, "); - -- fprintf (structfile, "%s%s%s%s, %s_doc,\n", -+ fprintf (structfile, "%s%s%s%s%s, %s_doc,\n", - "BUILTIN_ENABLED | STATIC_BUILTIN", - (builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "", - (builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "", - (builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "", -+ (builtin->flags & BUILTIN_FLAG_REQUIRES) ? " | REQUIRES_BUILTIN" : "", - document_name (builtin)); - - fprintf -@@ -1581,6 +1599,13 @@ is_posix_builtin (name) - return (_find_in_table (name, posix_builtins)); - } - -+static int -+is_requires_builtin (name) -+ char *name; -+{ -+ return (_find_in_table (name, requires_builtins)); -+} -+ - #if !defined (HAVE_RENAME) - static int - rename (from, to) diff --git a/bash.spec b/bash.spec index 2da65ea..8a6b930 100644 --- a/bash.spec +++ b/bash.spec @@ -3,7 +3,7 @@ Version: 4.0 Name: bash Summary: The GNU Bourne Again shell -Release: 9%{?dist} +Release: 10%{?dist} Group: System Environment/Shells License: GPLv2+ Url: http://www.gnu.org/software/bash @@ -298,6 +298,9 @@ fi #%doc doc/*.ps doc/*.0 doc/*.html doc/article.txt %changelog +* Tue Mar 30 2010 Roman Rakus - 4.0-10 +- Corrected requires patch (#563301) + * Thu Dec 10 2009 Roman Rakus - 4.0-9 - Don't segfault when TERM=eterm* and EMCAS is unset (#530911)