apply post-1.12.0 fixes, bump version to 1.12.1

1_12_stable 1_12_1
Denis Vlasenko 2008-09-28 16:40:25 +00:00
parent 261cf4784f
commit bacaff6e54
10 changed files with 215 additions and 130 deletions

View File

@ -1,6 +1,6 @@
VERSION = 1
PATCHLEVEL = 12
SUBLEVEL = 0
SUBLEVEL = 1
EXTRAVERSION =
NAME = Unnamed

View File

@ -50,7 +50,7 @@ static void signal_handler(int signo)
{
// restore keyboard and console settings
xset1(STDIN_FILENO, &tio0, "stdin");
xioctl(STDIN_FILENO, KDSKBMODE, (void *)kbmode);
xioctl(STDIN_FILENO, KDSKBMODE, (void *)(ptrdiff_t)kbmode);
// alarmed? -> exit 0
exit(SIGALRM == signo);
}
@ -95,7 +95,7 @@ int showkey_main(int argc UNUSED_PARAM, char **argv)
// we should exit on any signal
bb_signals(BB_FATAL_SIGS, signal_handler);
// set raw keyboard mode
xioctl(STDIN_FILENO, KDSKBMODE, (void *)((option_mask32 & OPT_k) ? K_MEDIUMRAW : K_RAW));
xioctl(STDIN_FILENO, KDSKBMODE, (void *)(ptrdiff_t)((option_mask32 & OPT_k) ? K_MEDIUMRAW : K_RAW));
// read and show scancodes
while (1) {

View File

@ -973,7 +973,12 @@ static uint32_t next_token(uint32_t expected)
} else if (*p == '.' || isdigit(*p)) {
/* it's a number */
t_double = strtod(p, &p);
#if ENABLE_DESKTOP
if (p[0] == '0' && (p[1] | 0x20) == 'x')
t_double = strtoll(p, &p, 0);
else
#endif
t_double = strtod(p, &p);
if (*p == '.')
syntax_error(EMSG_UNEXP_TOKEN);
tc = TC_NUMBER;
@ -2034,28 +2039,30 @@ static var *exec_builtin(node *op, var *res)
setvar_p(res, s);
break;
/* Bitwise ops must assume that operands are unsigned. GNU Awk 3.1.5:
* awk '{ print or(-1,1) }' gives "4.29497e+09", not "-2.xxxe+09" */
case B_an:
setvar_i(res, (long)getvar_i(av[0]) & (long)getvar_i(av[1]));
setvar_i(res, (unsigned long)getvar_i(av[0]) & (unsigned long)getvar_i(av[1]));
break;
case B_co:
setvar_i(res, ~(long)getvar_i(av[0]));
setvar_i(res, ~(unsigned long)getvar_i(av[0]));
break;
case B_ls:
setvar_i(res, (long)getvar_i(av[0]) << (long)getvar_i(av[1]));
setvar_i(res, (unsigned long)getvar_i(av[0]) << (unsigned long)getvar_i(av[1]));
break;
case B_or:
setvar_i(res, (long)getvar_i(av[0]) | (long)getvar_i(av[1]));
setvar_i(res, (unsigned long)getvar_i(av[0]) | (unsigned long)getvar_i(av[1]));
break;
case B_rs:
setvar_i(res, (long)((unsigned long)getvar_i(av[0]) >> (unsigned long)getvar_i(av[1])));
setvar_i(res, (unsigned long)getvar_i(av[0]) >> (unsigned long)getvar_i(av[1]));
break;
case B_xo:
setvar_i(res, (long)getvar_i(av[0]) ^ (long)getvar_i(av[1]));
setvar_i(res, (unsigned long)getvar_i(av[0]) ^ (unsigned long)getvar_i(av[1]));
break;
case B_lo:

View File

@ -147,10 +147,10 @@ struct globals {
#endif
smallint editing; // >0 while we are editing a file
// [code audit says "can be 0 or 1 only"]
// [code audit says "can be 0, 1 or 2 only"]
smallint cmd_mode; // 0=command 1=insert 2=replace
int file_modified; // buffer contents changed (counter, not flag!)
int last_file_modified; // = -1;
int last_file_modified; // = -1;
int fn_start; // index of first cmd line file name
int save_argc; // how many file names on cmd line
int cmdcnt; // repetition count
@ -623,7 +623,7 @@ static void edit_file(char *fn)
// These are commands that change text[].
// Remember the input for the "." command
if (!adding2q && ioq_start == NULL
&& strchr(modifying_cmds, c)
&& c != '\0' && strchr(modifying_cmds, c)
) {
start_new_cmd_q(c);
}
@ -645,8 +645,8 @@ static void edit_file(char *fn)
}
//-------------------------------------------------------------------
place_cursor(rows, 0, FALSE); // go to bottom of screen
clear_to_eol(); // Erase to end of line
place_cursor(rows - 1, 0, FALSE); // go to bottom of screen
clear_to_eol(); // erase to end of line
cookmode();
#undef cur_line
}
@ -2009,9 +2009,9 @@ static void start_new_cmd_q(char c)
{
// get buffer for new cmd
// if there is a current cmd count put it in the buffer first
if (cmdcnt > 0)
if (cmdcnt > 0) {
lmc_len = sprintf(last_modifying_cmd, "%d%c", cmdcnt, c);
else { // just save char c onto queue
} else { // just save char c onto queue
last_modifying_cmd[0] = c;
lmc_len = 1;
}
@ -2157,21 +2157,21 @@ static void winch_sig(int sig UNUSED_PARAM)
//----- Come here when we get a continue signal -------------------
static void cont_sig(int sig UNUSED_PARAM)
{
rawmode(); // terminal to "raw"
last_status_cksum = 0; // force status update
redraw(TRUE); // re-draw the screen
rawmode(); // terminal to "raw"
last_status_cksum = 0; // force status update
redraw(TRUE); // re-draw the screen
signal(SIGTSTP, suspend_sig);
signal(SIGCONT, SIG_DFL);
kill(my_pid, SIGCONT);
kill(my_pid, SIGCONT); // huh? why? we are already "continued"...
}
//----- Come here when we get a Suspend signal -------------------
static void suspend_sig(int sig UNUSED_PARAM)
{
place_cursor(rows - 1, 0, FALSE); // go to bottom of screen
clear_to_eol(); // Erase to end of line
cookmode(); // terminal to "cooked"
place_cursor(rows - 1, 0, FALSE); // go to bottom of screen
clear_to_eol(); // erase to end of line
cookmode(); // terminal to "cooked"
signal(SIGCONT, cont_sig);
signal(SIGTSTP, SIG_DFL);
@ -2247,18 +2247,20 @@ static char readit(void) // read (maybe cursor) key from stdin
fflush(stdout);
n = chars_to_parse;
// get input from User- are there already input chars in Q?
// get input from User - are there already input chars in Q?
if (n <= 0) {
// the Q is empty, wait for a typed char
again:
n = safe_read(STDIN_FILENO, readbuffer, sizeof(readbuffer));
if (n < 0) {
if (errno == EBADF || errno == EFAULT || errno == EINVAL
|| errno == EIO)
editing = 0; // want to exit
errno = 0;
if (n <= 0) {
place_cursor(rows - 1, 0, FALSE); // go to bottom of screen
clear_to_eol(); // erase to end of line
cookmode(); // terminal to "cooked"
bb_error_msg_and_die("can't read user input");
}
if (n <= 0)
return 0; // error
/* elsewhere we can get very confused by NULs */
if (readbuffer[0] == '\0')
goto again;
if (readbuffer[0] == 27) {
// This is an ESC char. Is this Esc sequence?
// Could be bare Esc key. See if there are any

View File

@ -87,7 +87,11 @@ enum {
struct globals {
int max_matches;
#if !ENABLE_EXTRA_COMPAT
int reflags;
#else
RE_TRANSLATE_TYPE case_fold; /* RE_TRANSLATE_TYPE is [[un]signed] char* */
#endif
smalluint invert_search;
smalluint print_filename;
smalluint open_errors;
@ -110,7 +114,19 @@ struct globals {
}; \
} while (0)
#define max_matches (G.max_matches )
#if !ENABLE_EXTRA_COMPAT
#define reflags (G.reflags )
#else
#define case_fold (G.case_fold )
/* http://www.delorie.com/gnu/docs/regex/regex_46.html */
#define reflags re_syntax_options
#undef REG_NOSUB
#undef REG_EXTENDED
#undef REG_ICASE
#define REG_NOSUB bug:is:here /* should not be used */
#define REG_EXTENDED RE_SYNTAX_EGREP
#define REG_ICASE bug:is:here /* should not be used */
#endif
#define invert_search (G.invert_search )
#define print_filename (G.print_filename )
#define open_errors (G.open_errors )
@ -240,6 +256,7 @@ static int grep_file(FILE *file)
xregcomp(&gl->compiled_regex, gl->pattern, reflags);
#else
memset(&gl->compiled_regex, 0, sizeof(gl->compiled_regex));
gl->compiled_regex.translate = case_fold; /* for -i */
if (re_compile_pattern(gl->pattern, strlen(gl->pattern), &gl->compiled_regex))
bb_error_msg_and_die("bad regex '%s'", gl->pattern);
#endif
@ -532,17 +549,34 @@ int grep_main(int argc, char **argv)
if (ENABLE_FEATURE_GREP_FGREP_ALIAS && applet_name[0] == 'f')
option_mask32 |= OPT_F;
#if !ENABLE_EXTRA_COMPAT
if (!(option_mask32 & (OPT_o | OPT_w)))
reflags = REG_NOSUB;
#endif
if (ENABLE_FEATURE_GREP_EGREP_ALIAS
&& (applet_name[0] == 'e' || (option_mask32 & OPT_E))
) {
reflags |= REG_EXTENDED;
}
#if ENABLE_EXTRA_COMPAT
else {
reflags = RE_SYNTAX_GREP;
}
#endif
if (option_mask32 & OPT_i)
if (option_mask32 & OPT_i) {
#if !ENABLE_EXTRA_COMPAT
reflags |= REG_ICASE;
#else
int i;
case_fold = xmalloc(256);
for (i = 0; i < 256; i++)
case_fold[i] = (unsigned char)i;
for (i = 'a'; i <= 'z'; i++)
case_fold[i] = (unsigned char)(i - ('a' - 'A'));
#endif
}
argv += optind;
argc -= optind;

View File

@ -956,24 +956,33 @@ static void input_tab(smallint *lastWasTab)
#if MAX_HISTORY > 0
/* state->flags is already checked to be nonzero */
static void get_previous_history(void)
static void save_command_ps_at_cur_history(void)
{
if (command_ps[0] != '\0' || state->history[state->cur_history] == NULL) {
free(state->history[state->cur_history]);
state->history[state->cur_history] = xstrdup(command_ps);
if (command_ps[0] != '\0') {
int cur = state->cur_history;
free(state->history[cur]);
state->history[cur] = xstrdup(command_ps);
}
state->cur_history--;
}
/* state->flags is already checked to be nonzero */
static int get_previous_history(void)
{
if ((state->flags & DO_HISTORY) && state->cur_history) {
save_command_ps_at_cur_history();
state->cur_history--;
return 1;
}
beep();
return 0;
}
static int get_next_history(void)
{
if (state->flags & DO_HISTORY) {
int ch = state->cur_history;
if (ch < state->cnt_history) {
get_previous_history(); /* save the current history line */
state->cur_history = ch + 1;
return state->cur_history;
if (state->cur_history < state->cnt_history) {
save_command_ps_at_cur_history(); /* save the current history line */
return ++state->cur_history;
}
}
beep();
@ -995,6 +1004,7 @@ static void load_history(const char *fromfile)
for (hi = state->cnt_history; hi > 0;) {
hi--;
free(state->history[hi]);
state->history[hi] = NULL;
}
for (hi = 0; hi < MAX_HISTORY;) {
@ -1006,14 +1016,14 @@ static void load_history(const char *fromfile)
l = strlen(hl);
if (l >= MAX_LINELEN)
hl[MAX_LINELEN-1] = '\0';
if (l == 0 || hl[0] == ' ') {
if (l == 0) {
free(hl);
continue;
}
state->history[hi++] = hl;
}
fclose(fp);
state->cur_history = state->cnt_history = hi;
state->cnt_history = hi;
}
}
@ -1043,19 +1053,27 @@ static void remember_in_history(const char *str)
if (!(state->flags & DO_HISTORY))
return;
if (str[0] == '\0')
return;
i = state->cnt_history;
free(state->history[MAX_HISTORY]);
state->history[MAX_HISTORY] = NULL;
/* After max history, remove the oldest command */
/* Don't save dupes */
if (i && strcmp(state->history[i-1], str) == 0)
return;
free(state->history[MAX_HISTORY]); /* redundant, paranoia */
state->history[MAX_HISTORY] = NULL; /* redundant, paranoia */
/* If history[] is full, remove the oldest command */
/* we need to keep history[MAX_HISTORY] empty, hence >=, not > */
if (i >= MAX_HISTORY) {
free(state->history[0]);
for (i = 0; i < MAX_HISTORY-1; i++)
state->history[i] = state->history[i+1];
/* i == MAX_HISTORY-1 */
}
// Maybe "if (!i || strcmp(history[i-1], command) != 0) ..."
// (i.e. do not save dups?)
/* i <= MAX_HISTORY-1 */
state->history[i++] = xstrdup(str);
/* i <= MAX_HISTORY */
state->cur_history = i;
state->cnt_history = i;
#if ENABLE_FEATURE_EDITING_SAVEHISTORY
@ -1397,6 +1415,7 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li
if ((state->flags & SAVE_HISTORY) && state->hist_file)
load_history(state->hist_file);
#endif
state->cur_history = state->cnt_history;
/* prepare before init handlers */
cmdedit_y = 0; /* quasireal y, not true if line > xt*yt */
@ -1432,6 +1451,13 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li
}
}
#endif
#if 0
for (ic = 0; ic <= MAX_HISTORY; ic++)
bb_error_msg("history[%d]:'%s'", ic, state->history[ic]);
bb_error_msg("cur_history:%d cnt_history:%d", state->cur_history, state->cnt_history);
#endif
/* Print out the command prompt */
parse_and_put_prompt(prompt);
@ -1540,11 +1566,8 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li
vi_case(CTRL('P')|vbit:)
vi_case('k'|vbit:)
/* Control-p -- Get previous command from history */
if ((state->flags & DO_HISTORY) && state->cur_history > 0) {
get_previous_history();
if (get_previous_history())
goto rewrite_line;
}
beep();
break;
#endif
@ -1733,10 +1756,8 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li
#if MAX_HISTORY > 0
case 'A':
/* Up Arrow -- Get previous command from history */
if ((state->flags & DO_HISTORY) && state->cur_history > 0) {
get_previous_history();
if (get_previous_history())
goto rewrite_line;
}
beep();
break;
case 'B':
@ -1746,7 +1767,7 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li
rewrite_line:
/* Rewrite the line with the selected history item */
/* change command */
command_len = strlen(strcpy(command, state->history[state->cur_history]));
command_len = strlen(strcpy(command, state->history[state->cur_history] ? : ""));
/* redraw and go to eol (bol, in vi */
redraw(cmdedit_y, (state->flags & VI_MODE) ? 9999 : 0);
break;

View File

@ -93,6 +93,7 @@ int crontab_main(int argc UNUSED_PARAM, char **argv)
char *new_fname;
char *user_name; /* -u USER */
int fd;
int src_fd;
int opt_ler;
/* file [opts] Replace crontab from file
@ -144,15 +145,15 @@ int crontab_main(int argc UNUSED_PARAM, char **argv)
bb_show_usage();
/* Read replacement file under user's UID/GID/group vector */
src_fd = STDIN_FILENO;
if (!opt_ler) { /* Replace? */
if (!argv[0])
bb_show_usage();
if (NOT_LONE_DASH(argv[0])) {
fd = open_as_user(pas, argv[0]);
if (fd < 0)
src_fd = open_as_user(pas, argv[0]);
if (src_fd < 0)
bb_error_msg_and_die("user %s cannot read %s",
pas->pw_name, argv[0]);
xmove_fd(fd, STDIN_FILENO);
}
}
@ -180,23 +181,23 @@ int crontab_main(int argc UNUSED_PARAM, char **argv)
tmp_fname = xasprintf("%s.%u", crontab_dir, (unsigned)getpid());
/* No O_EXCL: we don't want to be stuck if earlier crontabs
* were killed, leaving stale temp file behind */
fd = xopen3(tmp_fname, O_RDWR|O_CREAT|O_TRUNC, 0600);
xmove_fd(fd, STDIN_FILENO);
fchown(STDIN_FILENO, pas->pw_uid, pas->pw_gid);
src_fd = xopen3(tmp_fname, O_RDWR|O_CREAT|O_TRUNC, 0600);
fchown(src_fd, pas->pw_uid, pas->pw_gid);
fd = open(pas->pw_name, O_RDONLY);
if (fd >= 0) {
bb_copyfd_eof(fd, STDIN_FILENO);
bb_copyfd_eof(fd, src_fd);
close(fd);
xlseek(src_fd, 0, SEEK_SET);
}
close_on_exec_on(src_fd); /* don't want editor to see this fd */
edit_file(pas, tmp_fname);
xlseek(STDIN_FILENO, 0, SEEK_SET);
/* fall through */
case 0: /* Replace (no -l, -e, or -r were given) */
new_fname = xasprintf("%s.new", pas->pw_name);
fd = open(new_fname, O_WRONLY|O_CREAT|O_TRUNC|O_APPEND, 0600);
if (fd >= 0) {
bb_copyfd_eof(STDIN_FILENO, fd);
bb_copyfd_eof(src_fd, fd);
close(fd);
xrename(new_fname, pas->pw_name);
} else {

View File

@ -1059,8 +1059,9 @@ arch_apply_relocation(struct obj_file *f,
case R_68K_PC8:
v -= dot;
if ((ElfW(Sword))v > 0x7f ||
(ElfW(Sword))v < -(ElfW(Sword))0x80) {
if ((ElfW(Sword))v > 0x7f
|| (ElfW(Sword))v < -(ElfW(Sword))0x80
) {
ret = obj_reloc_overflow;
}
*(char *)loc = v;
@ -1068,8 +1069,9 @@ arch_apply_relocation(struct obj_file *f,
case R_68K_PC16:
v -= dot;
if ((ElfW(Sword))v > 0x7fff ||
(ElfW(Sword))v < -(ElfW(Sword))0x8000) {
if ((ElfW(Sword))v > 0x7fff
|| (ElfW(Sword))v < -(ElfW(Sword))0x8000
) {
ret = obj_reloc_overflow;
}
*(short *)loc = v;
@ -1208,8 +1210,9 @@ arch_apply_relocation(struct obj_file *f,
{
Elf32_Addr word;
if ((Elf32_Sword)v > 0x7fff ||
(Elf32_Sword)v < -(Elf32_Sword)0x8000) {
if ((Elf32_Sword)v > 0x7fff
|| (Elf32_Sword)v < -(Elf32_Sword)0x8000
) {
ret = obj_reloc_overflow;
}
@ -1238,8 +1241,9 @@ arch_apply_relocation(struct obj_file *f,
Elf32_Addr word;
v -= dot + 4;
if ((Elf32_Sword)v > 0x7fff ||
(Elf32_Sword)v < -(Elf32_Sword)0x8000) {
if ((Elf32_Sword)v > 0x7fff
|| (Elf32_Sword)v < -(Elf32_Sword)0x8000
) {
ret = obj_reloc_overflow;
}
@ -1253,9 +1257,10 @@ arch_apply_relocation(struct obj_file *f,
Elf32_Addr word, gp;
/* get _gp */
gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp"));
v-=gp;
if ((Elf32_Sword)v > 0x7fff ||
(Elf32_Sword)v < -(Elf32_Sword)0x8000) {
v -= gp;
if ((Elf32_Sword)v > 0x7fff
|| (Elf32_Sword)v < -(Elf32_Sword)0x8000
) {
ret = obj_reloc_overflow;
}
@ -2132,7 +2137,6 @@ obj_find_symbol(struct obj_file *f, const char *name)
for (sym = f->symtab[hash]; sym; sym = sym->next)
if (f->symbol_cmp(sym->name, name) == 0)
return sym;
return NULL;
}
@ -2141,12 +2145,10 @@ static ElfW(Addr) obj_symbol_final_value(struct obj_file * f, struct obj_symbol
if (sym) {
if (sym->secidx >= SHN_LORESERVE)
return sym->value;
return sym->value + f->sections[sym->secidx]->header.sh_addr;
} else {
/* As a special case, a NULL sym has value zero. */
return 0;
}
/* As a special case, a NULL sym has value zero. */
return 0;
}
static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
@ -2156,7 +2158,6 @@ static struct obj_section *obj_find_section(struct obj_file *f, const char *name
for (i = 0; i < n; ++i)
if (strcmp(f->sections[i]->name, name) == 0)
return f->sections[i];
return NULL;
}
@ -2167,9 +2168,11 @@ static int obj_load_order_prio(struct obj_section *a)
af = a->header.sh_flags;
ac = 0;
if (a->name[0] != '.' || strlen(a->name) != 10 ||
strcmp(a->name + 5, ".init"))
if (a->name[0] != '.' || strlen(a->name) != 10
|| strcmp(a->name + 5, ".init") != 0
) {
ac |= 32;
}
if (af & SHF_ALLOC)
ac |= 16;
if (!(af & SHF_WRITE))
@ -2212,7 +2215,7 @@ static struct obj_section *obj_create_alloced_section(struct obj_file *f,
sec->name = name;
sec->idx = newidx;
if (size)
sec->contents = xmalloc(size);
sec->contents = xzalloc(size);
obj_insert_section_load_order(f, sec);
@ -2227,7 +2230,7 @@ static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
int newidx = f->header.e_shnum++;
struct obj_section *sec;
f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
f->sections = xrealloc_vector(f->sections, 2, newidx);
f->sections[newidx] = sec = arch_new_section();
sec->header.sh_type = SHT_PROGBITS;
@ -2237,7 +2240,7 @@ static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
sec->name = name;
sec->idx = newidx;
if (size)
sec->contents = xmalloc(size);
sec->contents = xzalloc(size);
sec->load_next = f->load_order;
f->load_order = sec;
@ -2689,8 +2692,7 @@ static void new_get_kernel_symbols(void)
/* Collect the modules' symbols. */
if (nmod) {
ext_modules = modules = xmalloc(nmod * sizeof(*modules));
memset(modules, 0, nmod * sizeof(*modules));
ext_modules = modules = xzalloc(nmod * sizeof(*modules));
for (i = 0, mn = module_names, m = modules;
i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
struct new_module_info info;
@ -2770,13 +2772,14 @@ static int new_is_kernel_checksummed(void)
}
static void new_create_this_module(struct obj_file *f, const char *m_name)
static void new_create_this_module(struct obj_file *f, const char *m_name)
{
struct obj_section *sec;
sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
sizeof(struct new_module));
memset(sec->contents, 0, sizeof(struct new_module));
/* done by obj_create_alloced_section_first: */
/*memset(sec->contents, 0, sizeof(struct new_module));*/
obj_add_symbol(f, SPFX "__this_module", -1,
ELF_ST_INFO(STB_LOCAL, STT_OBJECT), sec->idx, 0,
@ -2856,18 +2859,19 @@ static int new_create_module_ksymtab(struct obj_file *f)
/* We don't want to export symbols residing in sections that
aren't loaded. There are a number of these created so that
we make sure certain module options don't appear twice. */
loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
i = f->header.e_shnum;
loaded = alloca(sizeof(int) * i);
while (--i >= 0)
loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
struct obj_symbol *sym;
for (sym = f->symtab[i]; sym; sym = sym->next)
for (sym = f->symtab[i]; sym; sym = sym->next) {
if (ELF_ST_BIND(sym->info) != STB_LOCAL
&& sym->secidx <= SHN_HIRESERVE
&& (sym->secidx >= SHN_LORESERVE
|| loaded[sym->secidx])) {
|| loaded[sym->secidx])
) {
ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
obj_symbol_patch(f, sec->idx, ofs, sym);
@ -2876,6 +2880,7 @@ static int new_create_module_ksymtab(struct obj_file *f)
nsyms++;
}
}
}
obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
@ -2934,9 +2939,11 @@ new_init_module(const char *m_name, struct obj_file *f, unsigned long m_size)
}
sec = obj_find_section(f, ".data.init");
if (sec) {
if (!module->runsize ||
module->runsize > sec->header.sh_addr - m_addr)
if (!module->runsize
|| module->runsize > sec->header.sh_addr - m_addr
) {
module->runsize = sec->header.sh_addr - m_addr;
}
}
sec = obj_find_section(f, ARCHDATA_SEC_NAME);
if (sec && sec->header.sh_size) {
@ -3083,9 +3090,9 @@ static void obj_allocate_commons(struct obj_file *f)
if (i == f->header.e_shnum) {
struct obj_section *sec;
f->header.e_shnum++;
f->sections = xrealloc_vector(f->sections, 2, i);
f->sections[i] = sec = arch_new_section();
f->header.e_shnum = i + 1;
sec->header.sh_type = SHT_PROGBITS;
sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
@ -3124,12 +3131,9 @@ static void obj_allocate_commons(struct obj_file *f)
for (i = 0; i < f->header.e_shnum; ++i) {
struct obj_section *s = f->sections[i];
if (s->header.sh_type == SHT_NOBITS) {
s->contents = NULL;
if (s->header.sh_size != 0)
s->contents = memset(xmalloc(s->header.sh_size),
0, s->header.sh_size);
else
s->contents = NULL;
s->contents = xzalloc(s->header.sh_size),
s->header.sh_type = SHT_PROGBITS;
}
}
@ -3222,8 +3226,8 @@ static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
#if SHT_RELM == SHT_RELA
#if defined(__alpha__) && defined(AXP_BROKEN_GAS)
/* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
if (!extsym || !extsym->st_name ||
ELF_ST_BIND(extsym->st_info) != STB_LOCAL)
if (!extsym || !extsym->st_name
|| ELF_ST_BIND(extsym->st_info) != STB_LOCAL)
#endif
value += rel->r_addend;
#endif
@ -3329,16 +3333,17 @@ static struct obj_file *obj_load(FILE *fp, int loadprogbits UNUSED_PARAM)
}
if (f->header.e_ident[EI_MAG0] != ELFMAG0
|| f->header.e_ident[EI_MAG1] != ELFMAG1
|| f->header.e_ident[EI_MAG2] != ELFMAG2
|| f->header.e_ident[EI_MAG3] != ELFMAG3) {
|| f->header.e_ident[EI_MAG1] != ELFMAG1
|| f->header.e_ident[EI_MAG2] != ELFMAG2
|| f->header.e_ident[EI_MAG3] != ELFMAG3
) {
bb_error_msg_and_die("not an ELF file");
}
if (f->header.e_ident[EI_CLASS] != ELFCLASSM
|| f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN
? ELFDATA2MSB : ELFDATA2LSB)
|| f->header.e_ident[EI_VERSION] != EV_CURRENT
|| !MATCH_MACHINE(f->header.e_machine)) {
|| f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB)
|| f->header.e_ident[EI_VERSION] != EV_CURRENT
|| !MATCH_MACHINE(f->header.e_machine)
) {
bb_error_msg_and_die("ELF file not for this architecture");
}
if (f->header.e_type != ET_REL) {
@ -3354,8 +3359,10 @@ static struct obj_file *obj_load(FILE *fp, int loadprogbits UNUSED_PARAM)
}
shnum = f->header.e_shnum;
f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
/* Growth of ->sections vector will be done by
* xrealloc_vector(..., 2, ...), therefore we must allocate
* at least 2^2 = 4 extra elements here. */
f->sections = xzalloc(sizeof(f->sections[0]) * (shnum + 4));
section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
fseek(fp, f->header.e_shoff, SEEK_SET);
@ -3391,14 +3398,13 @@ static struct obj_file *obj_load(FILE *fp, int loadprogbits UNUSED_PARAM)
case SHT_SYMTAB:
case SHT_STRTAB:
case SHT_RELM:
sec->contents = NULL;
if (sec->header.sh_size > 0) {
sec->contents = xmalloc(sec->header.sh_size);
sec->contents = xzalloc(sec->header.sh_size);
fseek(fp, sec->header.sh_offset, SEEK_SET);
if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
bb_perror_msg_and_die("error reading ELF section data");
}
} else {
sec->contents = NULL;
}
break;
@ -3860,16 +3866,20 @@ static void print_load_map(struct obj_file *f)
for (nsyms = i = 0; i < HASH_BUCKETS; ++i)
for (sym = f->symtab[i]; sym; sym = sym->next)
if (sym->secidx <= SHN_HIRESERVE
&& (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
&& (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])
) {
++nsyms;
}
all = alloca(nsyms * sizeof(struct obj_symbol *));
for (i = 0, p = all; i < HASH_BUCKETS; ++i)
for (sym = f->symtab[i]; sym; sym = sym->next)
if (sym->secidx <= SHN_HIRESERVE
&& (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
&& (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])
) {
*p++ = sym;
}
/* And list them. */
printf("\nSymbols:\n");
@ -4265,7 +4275,7 @@ static int insmod_ng_main(int argc UNUSED_PARAM, char **argv)
}
#else
len = MAXINT(ssize_t);
map = xmalloc_open_read_close(filename, &len);
map = xmalloc_xopen_read_close(filename, &len);
#endif
if (init_module(map, len, options) != 0)

View File

@ -259,9 +259,10 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
if (opt & OPT_o)
client_config.no_default_options = 1;
while (list_O) {
int n = index_in_strings(dhcp_option_strings, llist_pop(&list_O));
char *optstr = llist_pop(&list_O);
int n = index_in_strings(dhcp_option_strings, optstr);
if (n < 0)
bb_error_msg_and_die("unknown option '%s'", list_O->data);
bb_error_msg_and_die("unknown option '%s'", optstr);
n = dhcp_options[n].code;
client_config.opt_mask[n >> 3] |= 1 << (n & 7);
}

View File

@ -745,7 +745,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
int iterations;
unsigned lines, col;
unsigned interval;
char *sinterval;
char *str_interval, *str_iterations;
SKIP_FEATURE_TOPMEM(const) unsigned scan_mask = TOP_MASK;
#if ENABLE_FEATURE_USE_TERMIOS
struct termios new_settings;
@ -762,10 +762,19 @@ int top_main(int argc UNUSED_PARAM, char **argv)
iterations = 0; /* infinite */
/* all args are options; -n NUM */
opt_complementary = "-:n+";
if (getopt32(argv, "d:n:b", &sinterval, &iterations) & OPT_d) {
opt_complementary = "-";
col = getopt32(argv, "d:n:b", &str_interval, &str_iterations);
if (col & OPT_d) {
/* work around for "-d 1" -> "-d -1" done by getopt32 */
if (str_interval[0] == '-')
str_interval++;
/* Need to limit it to not overflow poll timeout */
interval = xatou16(sinterval); // -d
interval = xatou16(str_interval);
}
if (col & OPT_n) {
if (str_iterations[0] == '-')
str_iterations++;
iterations = xatou(str_iterations);
}
/* change to /proc */