Address some link errors with various small changes.

The most significant change is to at use malloc instead of alloca in the code to evaluate shell arithmetic expressions in shell/math.c.
This commit is contained in:
Stephen Heumann 2014-11-03 23:29:34 -06:00
parent af402a28a4
commit 036b92595c
7 changed files with 51 additions and 39 deletions

View File

@ -483,7 +483,7 @@ static int equalf(const char *f1, const char *f2)
static enum token check_operator(const char *s)
{
static const struct operator_t no_op = {
static /*const*/ struct operator_t no_op = {
/*.op_num =*/ -1,
/*.op_type =*/ -1
};

View File

@ -119,26 +119,6 @@ unsigned bb_strtou(const char *arg, char **endp, int base) FAST_FUNC;
int bb_strtoi(const char *arg, char **endp, int base) FAST_FUNC;
#endif
uint32_t BUG_bb_strtou32_unimplemented(void);
static ALWAYS_INLINE
uint32_t bb_strtou32(const char *arg, char **endp, int base)
{
if (sizeof(uint32_t) == sizeof(unsigned))
return bb_strtou(arg, endp, base);
if (sizeof(uint32_t) == sizeof(unsigned long))
return bb_strtoul(arg, endp, base);
return BUG_bb_strtou32_unimplemented();
}
static ALWAYS_INLINE
int32_t bb_strtoi32(const char *arg, char **endp, int base)
{
if (sizeof(int32_t) == sizeof(int))
return bb_strtoi(arg, endp, base);
if (sizeof(int32_t) == sizeof(long))
return bb_strtol(arg, endp, base);
return BUG_bb_strtou32_unimplemented();
}
/* Floating point */
double bb_strtod(const char *arg, char **endp) FAST_FUNC;

View File

@ -63,13 +63,16 @@ char* FAST_FUNC strncpy_IFNAMSIZ(char *dst, const char *src)
* A truncated result contains the first few digits of the result ala strncpy.
* Returns a pointer past last generated digit, does _not_ store NUL.
*/
void BUG_sizeof(void);
char* FAST_FUNC utoa_to_buf(unsigned n, char *buf, unsigned buflen)
{
unsigned i, out, res;
if (buflen) {
out = 0;
if (sizeof(n) == 2)
// 2^16-1 = 65535
i = 10000;
else
if (sizeof(n) == 4)
// 2^32-1 = 4294967295
i = 1000000000;
@ -80,7 +83,7 @@ char* FAST_FUNC utoa_to_buf(unsigned n, char *buf, unsigned buflen)
i = 10 ** 19;
#endif
else
BUG_sizeof();
bb_error_msg_and_die("Unsupported sizeof(unsigned)");
for (; i; i /= 10) {
res = n / i;
n = n % i;

View File

@ -385,13 +385,6 @@ void FAST_FUNC xchdir(const char *path)
bb_perror_msg_and_die("can't change directory to '%s'", path);
}
void FAST_FUNC xchroot(const char *path)
{
if (chroot(path))
bb_perror_msg_and_die("can't change root directory to '%s'", path);
xchdir("/");
}
// Print a warning message if opendir() fails, but don't die.
DIR* FAST_FUNC warn_opendir(const char *path)
{

View File

@ -38,7 +38,11 @@ static int cmp_func(const void * a, const void * b)
return 1;
if (s2 == NULL)
return -1;
#ifndef __GNO__
return strcoll(s1, s2);
#else
return strcmp(s1, s2);
#endif
}

View File

@ -3121,7 +3121,7 @@ static const struct reserved_combo* match_reserved_word(o_string *word)
static int reserved_word(o_string *word, struct parse_context *ctx)
{
# if ENABLE_HUSH_CASE
static const struct reserved_combo reserved_match = {
static /*const*/ struct reserved_combo reserved_match = {
"", RES_MATCH, NOT_ASSIGNMENT , FLAG_MATCH | FLAG_ESAC
};
# endif
@ -5870,11 +5870,13 @@ static FILE *generate_stream_from_string(const char *s, pid_t *pid_p)
xpipe(channel);
pid = BB_MMU ? xfork() : xvfork_and_run(xforked_child, &args_struct);
#if BB_MMU
pid = xfork();
if (pid == 0) { /* child */
xforked_child(&args_struct);
}
#else
pid = xvfork_and_run(xforked_child, &args_struct);
#endif
/* parent */
@ -6099,7 +6101,11 @@ static void xvforked_child(void *grandchild_args) {
/* child */
pid_t pid;
disable_restore_tty_pgrp_on_exit();
pid = BB_MMU ? xfork() : xvfork_and_run(xforked_grandchild, grandchild_args);
#if BB_MMU
pid = xfork();
#else
pid = xvfork_and_run(xforked_grandchild, grandchild_args);
#endif
if (pid != 0)
_exit(0);
xforked_grandchild(grandchild_args); // Only get here in BB_MMU case
@ -7212,7 +7218,9 @@ static NOINLINE int run_pipe(struct pipe *pi)
}
#endif
}
#if ENABLE_FEATURE_SH_NOFORK
clean_up_and_ret:
#endif
unset_vars(new_env);
add_vars(old_vars);
/* clean_up_and_ret0: */
@ -7225,7 +7233,8 @@ static NOINLINE int run_pipe(struct pipe *pi)
return rcode;
}
if (ENABLE_FEATURE_SH_NOFORK) {
#if ENABLE_FEATURE_SH_NOFORK
{
int n = find_applet_by_name(argv_expanded[0]);
if (n >= 0 && APPLET_IS_NOFORK(n)) {
rcode = redirect_and_varexp_helper(&new_env, &old_vars, command, squirrel, argv_expanded);
@ -7237,6 +7246,7 @@ static NOINLINE int run_pipe(struct pipe *pi)
goto clean_up_and_ret;
}
}
#endif
/* It is neither builtin nor applet. We must fork. */
}
@ -7285,11 +7295,13 @@ static NOINLINE int run_pipe(struct pipe *pi)
if (cmd_no < pi->num_cmds)
xpiped_pair(pipefds);
command->pid = BB_MMU ? fork() : vfork_and_run(forked_child, &args_struct);
#if BB_MMU
command->pid = fork();
if (!command->pid) { /* child */
forked_child(&args_struct);
}
#else
command->pid = vfork_and_run(forked_child, &args_struct);
#endif
/* parent or error */

View File

@ -505,11 +505,20 @@ evaluate_string(arith_state_t *math_state, const char *expr)
/* The proof that there can be no more than strlen(startbuf)/2+1
* integers in any given correct or incorrect expression
* is left as an exercise to the reader. */
var_or_num_t *const numstack = alloca((expr_len / 2) * sizeof(numstack[0]));
var_or_num_t *const numstack = malloc((expr_len / 2) * sizeof(numstack[0]));
var_or_num_t *numstackptr = numstack;
/* Stack of operator tokens */
operator *const stack = alloca(expr_len * sizeof(stack[0]));
operator *const stack = malloc(expr_len * sizeof(stack[0]));
operator *stackptr = stack;
/* Buffer to hold names of variables encountered in the expression. */
char *const namebuf = malloc(expr_len);
char *namebufptr = namebuf;
arith_t retval = 0;
if (numstack == NULL || stack == NULL || namebuf == NULL) {
errmsg = "memory allocation failure in arithmetic evaluation";
goto ret_with_custom_retval;
}
/* Start with a left paren */
*stackptr++ = lasttok = TOK_LPAREN;
@ -558,7 +567,8 @@ evaluate_string(arith_state_t *math_state, const char *expr)
if (p != expr) {
/* Name */
size_t var_name_size = (p-expr) + 1; /* +1 for NUL */
numstackptr->var = alloca(var_name_size);
numstackptr->var = namebufptr;
namebufptr += var_name_size;
safe_strncpy(numstackptr->var, expr, var_name_size);
expr = p;
num:
@ -693,8 +703,18 @@ evaluate_string(arith_state_t *math_state, const char *expr)
err_with_custom_msg:
numstack->val = -1;
ret:
retval = numstack->val;
ret_with_custom_retval:
math_state->errmsg = errmsg;
return numstack->val;
if (numstack)
free(numstack);
if (stack)
free(stack);
if (namebuf)
free(namebuf);
return retval;
}
arith_t FAST_FUNC