diff options
-rw-r--r-- | shell/ash.c | 70 | ||||
-rw-r--r-- | shell/cmdedit.c | 11 |
2 files changed, 66 insertions, 15 deletions
diff --git a/shell/ash.c b/shell/ash.c index d488a54..1fe1e82 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -3476,10 +3476,17 @@ funcdone: } +static inline int +goodname(const char *p) +{ + return !*endofname(p); +} + /* * Search for a command. This is called before we fork so that the * location of the command will be available in the parent as well as - * the child. + * the child. The check for "goodname" is an overly conservative + * check that the name will not be subject to expansion. */ static void @@ -3488,7 +3495,9 @@ prehash(union node *n) struct cmdentry entry; if (n->type == NCMD && n->ncmd.args) - find_command(n->ncmd.args->narg.text, &entry, 0, pathval()); + if (goodname(n->ncmd.args->narg.text)) + find_command(n->ncmd.args->narg.text, &entry, 0, + pathval()); } @@ -6020,7 +6029,12 @@ retry: nr = cmdedit_read_input((char *) cmdedit_prompt, buf); if(nr == 0) { /* Ctrl+C presend */ - raise(SIGINT); + if(trap[SIGINT]) { + buf[0] = '\n'; + buf[1] = 0; + raise(SIGINT); + return 1; + } goto retry; } if(nr < 0) { @@ -7425,6 +7439,8 @@ cmdtxt(union node *n) const char *p; char s[2]; + if (!n) + return; switch (n->type) { default: #if DEBUG @@ -9295,11 +9311,6 @@ static void synerror(const char *) __attribute__((__noreturn__)); static void setprompt(int); -static inline int -goodname(const char *p) -{ - return !*endofname(p); -} static inline int isassignment(const char *p) @@ -10755,7 +10766,7 @@ noexpand(char *text) * more letters, underscores, and digits). */ -char * +static char * endofname(const char *name) { char *p; @@ -11835,12 +11846,13 @@ exitshell(void) struct jmploc loc; char *p; int status; + int jmp; + jmp = setjmp(loc.loc); status = exitstatus; TRACE(("pid %d, exitshell(%d)\n", getpid(), status)); - if (setjmp(loc.loc)) { + if (jmp) goto out; - } handler = &loc; if ((p = trap[0]) != NULL && *p != '\0') { trap[0] = NULL; @@ -12713,7 +12725,41 @@ ulimitcmd(int argc, char **argv) struct rlimit limit; what = 'f'; - while ((optc = nextopt("HSatfdsmcnplvw")) != '\0') + while ((optc = nextopt("HSa" +#ifdef RLIMIT_CPU + "t" +#endif +#ifdef RLIMIT_FSIZE + "f" +#endif +#ifdef RLIMIT_DATA + "d" +#endif +#ifdef RLIMIT_STACK + "s" +#endif +#ifdef RLIMIT_CORE + "c" +#endif +#ifdef RLIMIT_RSS + "m" +#endif +#ifdef RLIMIT_MEMLOCK + "l" +#endif +#ifdef RLIMIT_NPROC + "p" +#endif +#ifdef RLIMIT_NOFILE + "n" +#endif +#ifdef RLIMIT_AS + "v" +#endif +#ifdef RLIMIT_LOCKS + "w" +#endif + )) != '\0') switch (optc) { case 'H': how = HARD; diff --git a/shell/cmdedit.c b/shell/cmdedit.c index f54d5d5..c0fa1b2 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c @@ -1283,10 +1283,15 @@ int cmdedit_read_input(char *prompt, char command[BUFSIZ]) case 3: /* Control-c -- stop gathering input */ goto_new_line(); +#ifndef CONFIG_ASH command[0] = 0; len = 0; lastWasTab = FALSE; put_prompt(); +#else + len = 0; + break_out = -1; /* for control traps */ +#endif break; case 4: /* Control-d -- Delete one character, or exit @@ -1299,7 +1304,7 @@ prepare_to_die: /* cmdedit_reset_term() called in atexit */ exit(EXIT_SUCCESS); #else - break_out = -1; /* for control stoped jobs */ + len = break_out = -1; /* for control stoped jobs */ break; #endif } else { @@ -1493,7 +1498,7 @@ rewrite_line: /* cleanup may be saved current command line */ free(history[MAX_HISTORY]); history[MAX_HISTORY] = 0; - if (len) { /* no put empty line */ + if (len> 0) { /* no put empty line */ int i = n_history; /* After max history, remove the oldest command */ if (i >= MAX_HISTORY) { @@ -1510,7 +1515,7 @@ rewrite_line: } #else /* MAX_HISTORY < 1 */ #if defined(CONFIG_FEATURE_SH_FANCY_PROMPT) - if (len) { /* no put empty line */ + if (len > 0) { /* no put empty line */ num_ok_lines++; } #endif |