hush: global_args_malloced is used only if set builtin is enabled
function old new delta run_pipe 1623 1635 +12 builtin_source 210 222 +12 save_and_replace_G_args 70 60 -10 builtin_shift 132 94 -38 restore_G_args 98 - -98 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 2/2 up/down: 24/-146) Total: -122 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
cc2fd5a986
commit
4e4f88e569
23
shell/hush.c
23
shell/hush.c
@ -853,8 +853,13 @@ struct globals {
|
||||
smallint exiting; /* used to prevent EXIT trap recursion */
|
||||
/* These four support $?, $#, and $1 */
|
||||
smalluint last_exitcode;
|
||||
#if ENABLE_HUSH_SET
|
||||
/* are global_argv and global_argv[1..n] malloced? (note: not [0]) */
|
||||
smalluint global_args_malloced;
|
||||
# define G_global_args_malloced (G.global_args_malloced)
|
||||
#else
|
||||
# define G_global_args_malloced 0
|
||||
#endif
|
||||
/* how many non-NULL argv's we have. NB: $# + 1 */
|
||||
int global_argc;
|
||||
char **global_argv;
|
||||
@ -893,7 +898,7 @@ struct globals {
|
||||
unsigned special_sig_mask;
|
||||
#if ENABLE_HUSH_JOB
|
||||
unsigned fatal_sig_mask;
|
||||
# define G_fatal_sig_mask G.fatal_sig_mask
|
||||
# define G_fatal_sig_mask (G.fatal_sig_mask)
|
||||
#else
|
||||
# define G_fatal_sig_mask 0
|
||||
#endif
|
||||
@ -1476,7 +1481,7 @@ typedef struct save_arg_t {
|
||||
char *sv_argv0;
|
||||
char **sv_g_argv;
|
||||
int sv_g_argc;
|
||||
smallint sv_g_malloced;
|
||||
IF_HUSH_SET(smallint sv_g_malloced;)
|
||||
} save_arg_t;
|
||||
|
||||
static void save_and_replace_G_args(save_arg_t *sv, char **argv)
|
||||
@ -1486,11 +1491,11 @@ static void save_and_replace_G_args(save_arg_t *sv, char **argv)
|
||||
sv->sv_argv0 = argv[0];
|
||||
sv->sv_g_argv = G.global_argv;
|
||||
sv->sv_g_argc = G.global_argc;
|
||||
sv->sv_g_malloced = G.global_args_malloced;
|
||||
IF_HUSH_SET(sv->sv_g_malloced = G.global_args_malloced;)
|
||||
|
||||
argv[0] = G.global_argv[0]; /* retain $0 */
|
||||
G.global_argv = argv;
|
||||
G.global_args_malloced = 0;
|
||||
IF_HUSH_SET(G.global_args_malloced = 0;)
|
||||
|
||||
n = 1;
|
||||
while (*++argv)
|
||||
@ -1500,19 +1505,19 @@ static void save_and_replace_G_args(save_arg_t *sv, char **argv)
|
||||
|
||||
static void restore_G_args(save_arg_t *sv, char **argv)
|
||||
{
|
||||
char **pp;
|
||||
|
||||
#if ENABLE_HUSH_SET
|
||||
if (G.global_args_malloced) {
|
||||
/* someone ran "set -- arg1 arg2 ...", undo */
|
||||
pp = G.global_argv;
|
||||
char **pp = G.global_argv;
|
||||
while (*++pp) /* note: does not free $0 */
|
||||
free(*pp);
|
||||
free(G.global_argv);
|
||||
}
|
||||
#endif
|
||||
argv[0] = sv->sv_argv0;
|
||||
G.global_argv = sv->sv_g_argv;
|
||||
G.global_argc = sv->sv_g_argc;
|
||||
G.global_args_malloced = sv->sv_g_malloced;
|
||||
IF_HUSH_SET(G.global_args_malloced = sv->sv_g_malloced;)
|
||||
}
|
||||
|
||||
|
||||
@ -9213,7 +9218,7 @@ static int FAST_FUNC builtin_shift(char **argv)
|
||||
n = atoi(argv[0]);
|
||||
}
|
||||
if (n >= 0 && n < G.global_argc) {
|
||||
if (G.global_args_malloced) {
|
||||
if (G_global_args_malloced) {
|
||||
int m = 1;
|
||||
while (m <= n)
|
||||
free(G.global_argv[m++]);
|
||||
|
Loading…
Reference in New Issue
Block a user