mirror of
https://github.com/sheumann/hush.git
synced 2024-06-08 01:29:32 +00:00
post-1.14.0 fixes
hush significantly updated. fixes for acpid, awk, depmod, dhcp, gzip, mdev, modprobe, sysctl. libbb fixes. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
bae3abf2c7
commit
20cc390b9b
|
@ -388,19 +388,6 @@ static void put_32bit(ulg n)
|
|||
put_16bit(n >> 16);
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
* Clear input and output buffers
|
||||
*/
|
||||
static void clear_bufs(void)
|
||||
{
|
||||
G1.outcnt = 0;
|
||||
#ifdef DEBUG
|
||||
G1.insize = 0;
|
||||
#endif
|
||||
G1.isize = 0;
|
||||
}
|
||||
|
||||
|
||||
/* ===========================================================================
|
||||
* Run a set of bytes through the crc shift register. If s is a NULL
|
||||
* pointer, then initialize the crc shift register contents instead.
|
||||
|
@ -2019,7 +2006,37 @@ USE_DESKTOP(long long) int pack_gzip(unpack_info_t *info UNUSED_PARAM)
|
|||
{
|
||||
struct stat s;
|
||||
|
||||
clear_bufs();
|
||||
/* Clear input and output buffers */
|
||||
G1.outcnt = 0;
|
||||
#ifdef DEBUG
|
||||
G1.insize = 0;
|
||||
#endif
|
||||
G1.isize = 0;
|
||||
|
||||
/* Reinit G2.xxx */
|
||||
memset(&G2, 0, sizeof(G2));
|
||||
G2.l_desc.dyn_tree = G2.dyn_ltree;
|
||||
G2.l_desc.static_tree = G2.static_ltree;
|
||||
G2.l_desc.extra_bits = extra_lbits;
|
||||
G2.l_desc.extra_base = LITERALS + 1;
|
||||
G2.l_desc.elems = L_CODES;
|
||||
G2.l_desc.max_length = MAX_BITS;
|
||||
//G2.l_desc.max_code = 0;
|
||||
G2.d_desc.dyn_tree = G2.dyn_dtree;
|
||||
G2.d_desc.static_tree = G2.static_dtree;
|
||||
G2.d_desc.extra_bits = extra_dbits;
|
||||
//G2.d_desc.extra_base = 0;
|
||||
G2.d_desc.elems = D_CODES;
|
||||
G2.d_desc.max_length = MAX_BITS;
|
||||
//G2.d_desc.max_code = 0;
|
||||
G2.bl_desc.dyn_tree = G2.bl_tree;
|
||||
//G2.bl_desc.static_tree = NULL;
|
||||
G2.bl_desc.extra_bits = extra_blbits,
|
||||
//G2.bl_desc.extra_base = 0;
|
||||
G2.bl_desc.elems = BL_CODES;
|
||||
G2.bl_desc.max_length = MAX_BL_BITS;
|
||||
//G2.bl_desc.max_code = 0;
|
||||
|
||||
s.st_ctime = 0;
|
||||
fstat(STDIN_FILENO, &s);
|
||||
zip(s.st_ctime);
|
||||
|
@ -2064,29 +2081,6 @@ int gzip_main(int argc UNUSED_PARAM, char **argv)
|
|||
SET_PTR_TO_GLOBALS(xzalloc(sizeof(struct globals) + sizeof(struct globals2))
|
||||
+ sizeof(struct globals));
|
||||
barrier();
|
||||
G2.l_desc.dyn_tree = G2.dyn_ltree;
|
||||
G2.l_desc.static_tree = G2.static_ltree;
|
||||
G2.l_desc.extra_bits = extra_lbits;
|
||||
G2.l_desc.extra_base = LITERALS + 1;
|
||||
G2.l_desc.elems = L_CODES;
|
||||
G2.l_desc.max_length = MAX_BITS;
|
||||
//G2.l_desc.max_code = 0;
|
||||
|
||||
G2.d_desc.dyn_tree = G2.dyn_dtree;
|
||||
G2.d_desc.static_tree = G2.static_dtree;
|
||||
G2.d_desc.extra_bits = extra_dbits;
|
||||
//G2.d_desc.extra_base = 0;
|
||||
G2.d_desc.elems = D_CODES;
|
||||
G2.d_desc.max_length = MAX_BITS;
|
||||
//G2.d_desc.max_code = 0;
|
||||
|
||||
G2.bl_desc.dyn_tree = G2.bl_tree;
|
||||
//G2.bl_desc.static_tree = NULL;
|
||||
G2.bl_desc.extra_bits = extra_blbits,
|
||||
//G2.bl_desc.extra_base = 0;
|
||||
G2.bl_desc.elems = BL_CODES;
|
||||
G2.bl_desc.max_length = MAX_BL_BITS;
|
||||
//G2.bl_desc.max_code = 0;
|
||||
|
||||
/* Allocate all global buffers (for DYN_ALLOC option) */
|
||||
ALLOC(uch, G1.l_buf, INBUFSIZ);
|
||||
|
|
|
@ -1571,13 +1571,14 @@ static int awk_split(const char *s, node *spl, char **slist)
|
|||
n++; /* we saw yet another delimiter */
|
||||
} else {
|
||||
pmatch[0].rm_eo = l;
|
||||
if (s[l]) pmatch[0].rm_eo++;
|
||||
if (s[l])
|
||||
pmatch[0].rm_eo++;
|
||||
}
|
||||
memcpy(s1, s, l);
|
||||
/* make sure we remove *all* of the separator chars */
|
||||
while (l < pmatch[0].rm_eo) {
|
||||
s1[l++] = '\0';
|
||||
}
|
||||
do {
|
||||
s1[l] = '\0';
|
||||
} while (++l < pmatch[0].rm_eo);
|
||||
nextword(&s1);
|
||||
s += pmatch[0].rm_eo;
|
||||
} while (*s);
|
||||
|
|
|
@ -965,6 +965,12 @@ enum {
|
|||
/* How long the longest ESC sequence we know? */
|
||||
KEYCODE_BUFFER_SIZE = 4
|
||||
};
|
||||
/* Note: fd may be in blocking or non-blocking mode, both make sense.
|
||||
* For one, less uses non-blocking mode.
|
||||
* Only the first read syscall inside read_key may block indefinitely
|
||||
* (unless fd is in non-blocking mode),
|
||||
* subsequent reads will time out after a few milliseconds.
|
||||
*/
|
||||
int read_key(int fd, smalluint *nbuffered, char *buffer) FAST_FUNC;
|
||||
|
||||
|
||||
|
|
|
@ -173,7 +173,10 @@
|
|||
/* performs reasonably well (gcc usually inlines memcpy here) */
|
||||
#define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2))
|
||||
#define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4))
|
||||
#define move_to_unaligned32(u32p, v) (memcpy((u32p), &(v), 4))
|
||||
#define move_to_unaligned32(u32p, v) do { \
|
||||
uint32_t __t = (v); \
|
||||
memcpy((u32p), &__t, 4); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* ---- Networking ------------------------------------------ */
|
||||
|
|
|
@ -778,8 +778,10 @@ des_crypt(struct des_ctx *ctx, char output[DES_OUT_BUFSIZE],
|
|||
to64_msb_first(output + 2, (r0 >> 8));
|
||||
/* bits 7..0 of r0 and 31..16 of r1 */
|
||||
to64_msb_first(output + 6, (r0 << 16) | (r1 >> 16));
|
||||
/* (bits 15..0 of r1 + 00) and NUL byte */
|
||||
/* bits 15..0 of r1 and two zero bits (plus extra zero byte) */
|
||||
to64_msb_first(output + 10, (r1 << 8));
|
||||
/* extra zero byte is encoded as '.', fixing it */
|
||||
output[13] = '\0';
|
||||
#endif
|
||||
|
||||
return output;
|
||||
|
|
|
@ -229,7 +229,7 @@ void* FAST_FUNC xmalloc_read(int fd, size_t *maxsz_p)
|
|||
if (size > 64*1024)
|
||||
size = 64*1024;
|
||||
}
|
||||
xrealloc(buf, total + 1);
|
||||
buf = xrealloc(buf, total + 1);
|
||||
buf[total] = '\0';
|
||||
|
||||
if (maxsz_p)
|
||||
|
@ -273,7 +273,7 @@ void* FAST_FUNC xmalloc_open_read_close(const char *filename, size_t *maxsz_p)
|
|||
free(buf);
|
||||
return NULL;
|
||||
}
|
||||
xrealloc(buf, size + 1);
|
||||
buf = xrealloc(buf, size + 1);
|
||||
buf[size] = '\0';
|
||||
|
||||
if (maxsz_p)
|
||||
|
|
|
@ -40,26 +40,28 @@ enum {
|
|||
ARG_r = (1<<6) /* Compat dummy. Linux Makefile uses it */
|
||||
};
|
||||
|
||||
static int FAST_FUNC parse_module(const char *fname, struct stat *sb,
|
||||
void *data, int UNUSED_PARAM depth)
|
||||
static int FAST_FUNC parse_module(const char *fname, struct stat *sb UNUSED_PARAM,
|
||||
void *data, int depth UNUSED_PARAM)
|
||||
{
|
||||
char modname[MODULE_NAME_LEN];
|
||||
module_info **first = (module_info **) data;
|
||||
char *image, *ptr;
|
||||
module_info *info;
|
||||
size_t len = sb->st_size;
|
||||
/* Arbitrary. Was sb->st_size, but that breaks .gz etc */
|
||||
size_t len = (64*1024*1024 - 4096);
|
||||
|
||||
if (strrstr(fname, ".ko") == NULL)
|
||||
return TRUE;
|
||||
|
||||
image = xmalloc_open_zipped_read_close(fname, &len);
|
||||
info = xzalloc(sizeof(module_info));
|
||||
info = xzalloc(sizeof(*info));
|
||||
|
||||
info->next = *first;
|
||||
*first = info;
|
||||
|
||||
info->dnext = info->dprev = info;
|
||||
info->name = xasprintf("/%s", fname);
|
||||
info->modname = filename2modname(fname, NULL);
|
||||
info->modname = xstrdup(filename2modname(fname, modname));
|
||||
for (ptr = image; ptr < image + len - 10; ptr++) {
|
||||
if (strncmp(ptr, "depends=", 8) == 0) {
|
||||
char *u;
|
||||
|
@ -69,12 +71,14 @@ static int FAST_FUNC parse_module(const char *fname, struct stat *sb,
|
|||
if (*u == '-')
|
||||
*u = '_';
|
||||
ptr += string_to_llist(ptr, &info->dependencies, ",");
|
||||
} else if (ENABLE_FEATURE_MODUTILS_ALIAS &&
|
||||
strncmp(ptr, "alias=", 6) == 0) {
|
||||
} else if (ENABLE_FEATURE_MODUTILS_ALIAS
|
||||
&& strncmp(ptr, "alias=", 6) == 0
|
||||
) {
|
||||
llist_add_to(&info->aliases, xstrdup(ptr + 6));
|
||||
ptr += strlen(ptr);
|
||||
} else if (ENABLE_FEATURE_MODUTILS_SYMBOLS &&
|
||||
strncmp(ptr, "__ksymtab_", 10) == 0) {
|
||||
} else if (ENABLE_FEATURE_MODUTILS_SYMBOLS
|
||||
&& strncmp(ptr, "__ksymtab_", 10) == 0
|
||||
) {
|
||||
ptr += 10;
|
||||
if (strncmp(ptr, "gpl", 3) == 0 ||
|
||||
strcmp(ptr, "strings") == 0)
|
||||
|
@ -199,10 +203,17 @@ int depmod_main(int argc UNUSED_PARAM, char **argv)
|
|||
if (!(option_mask32 & ARG_n))
|
||||
xfreopen_write("modules.alias", stdout);
|
||||
for (m = modules; m != NULL; m = m->next) {
|
||||
const char *fname = bb_basename(m->name);
|
||||
int fnlen = strchrnul(fname, '.') - fname;
|
||||
while (m->aliases) {
|
||||
printf("alias %s %s\n",
|
||||
/* Last word can well be m->modname instead,
|
||||
* but depmod from module-init-tools 3.4
|
||||
* uses module basename, i.e., no s/-/_/g.
|
||||
* (pathname and .ko.* are still stripped)
|
||||
* Mimicking that... */
|
||||
printf("alias %s %.*s\n",
|
||||
(char*)llist_pop(&m->aliases),
|
||||
m->modname);
|
||||
fnlen, fname);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -210,10 +221,12 @@ int depmod_main(int argc UNUSED_PARAM, char **argv)
|
|||
if (!(option_mask32 & ARG_n))
|
||||
xfreopen_write("modules.symbols", stdout);
|
||||
for (m = modules; m != NULL; m = m->next) {
|
||||
const char *fname = bb_basename(m->name);
|
||||
int fnlen = strchrnul(fname, '.') - fname;
|
||||
while (m->symbols) {
|
||||
printf("alias symbol:%s %s\n",
|
||||
printf("alias symbol:%s %.*s\n",
|
||||
(char*)llist_pop(&m->symbols),
|
||||
m->modname);
|
||||
fnlen, fname);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -109,7 +109,9 @@ static void add_probe(const char *name)
|
|||
struct module_entry *m;
|
||||
|
||||
m = get_or_add_modentry(name);
|
||||
if (m->flags & MODULE_FLAG_LOADED) {
|
||||
if (!(option_mask32 & MODPROBE_OPT_REMOVE)
|
||||
&& (m->flags & MODULE_FLAG_LOADED)
|
||||
) {
|
||||
DBG("skipping %s, it is already loaded", name);
|
||||
return;
|
||||
}
|
||||
|
@ -339,7 +341,7 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
|
|||
config_close(parser);
|
||||
}
|
||||
|
||||
if (opt & MODPROBE_OPT_INSERT_ALL) {
|
||||
if (opt & (MODPROBE_OPT_INSERT_ALL | MODPROBE_OPT_REMOVE)) {
|
||||
/* Each argument is a module name */
|
||||
do {
|
||||
add_probe(*argv++);
|
||||
|
|
|
@ -63,7 +63,8 @@ struct dhcpOfferedAddr* FAST_FUNC add_lease(
|
|||
if (oldest) {
|
||||
oldest->hostname[0] = '\0';
|
||||
if (hostname) {
|
||||
hostname_length = hostname[-1]; /* look at option size byte */
|
||||
/* option size byte, + 1 for NUL */
|
||||
hostname_length = hostname[-1] + 1;
|
||||
if (hostname_length > sizeof(oldest->hostname))
|
||||
hostname_length = sizeof(oldest->hostname);
|
||||
hostname = (uint8_t*) safe_strncpy((char*)oldest->hostname, (char*)hostname, hostname_length);
|
||||
|
|
|
@ -214,11 +214,11 @@ static int sysctl_handle_preload_file(const char *filename)
|
|||
// (but _whitespace_ from ends should be trimmed first (and we do it right))
|
||||
//TODO: "var==1" is mishandled (must use "=1" as a value, but uses "1")
|
||||
while (config_read(parser, token, 2, 2, "# \t=", PARSE_NORMAL)) {
|
||||
char *tp;
|
||||
sysctl_dots_to_slashes(token[0]);
|
||||
/* Save ~4 bytes by using parser internals */
|
||||
/* parser->line is big enough for sprintf */
|
||||
sprintf(parser->line, "%s=%s", token[0], token[1]);
|
||||
sysctl_act_recursive(parser->line);
|
||||
tp = xasprintf("%s=%s", token[0], token[1]);
|
||||
sysctl_act_recursive(tp);
|
||||
free(tp);
|
||||
}
|
||||
if (ENABLE_FEATURE_CLEAN_UP)
|
||||
config_close(parser);
|
||||
|
|
|
@ -579,7 +579,7 @@ CONFIG_DEVMEM=y
|
|||
CONFIG_EJECT=y
|
||||
CONFIG_FEATURE_EJECT_SCSI=y
|
||||
CONFIG_FBSPLASH=y
|
||||
CONFIG_FLASH_ERASEALL=y
|
||||
# CONFIG_FLASH_ERASEALL is not set
|
||||
CONFIG_IONICE=y
|
||||
# CONFIG_INOTIFYD is not set
|
||||
CONFIG_LAST=y
|
||||
|
|
1818
shell/hush.c
1818
shell/hush.c
File diff suppressed because it is too large
Load Diff
|
@ -78,8 +78,8 @@ int acpid_main(int argc, char **argv)
|
|||
// goto configuration directory
|
||||
xchdir(opt_conf);
|
||||
|
||||
// // setup signals
|
||||
// bb_signals(BB_FATAL_SIGS, record_signo);
|
||||
// prevent zombies
|
||||
signal(SIGCHLD, SIG_IGN);
|
||||
|
||||
// no explicit evdev files given? -> use proc event interface
|
||||
if (!*argv) {
|
||||
|
|
|
@ -181,7 +181,8 @@ static void make_device(char *path, int delete)
|
|||
* the rest of fields unless keep_matching == 1 */
|
||||
|
||||
/* 2nd field: uid:gid - device ownership */
|
||||
parse_chown_usergroup_or_die(&ugid, tokens[1]);
|
||||
if (get_uidgid(&ugid, tokens[1], 1) == 0)
|
||||
bb_error_msg("unknown user/group %s", tokens[1]);
|
||||
|
||||
/* 3rd field: mode - device permissions */
|
||||
mode = strtoul(tokens[2], NULL, 8);
|
||||
|
|
Loading…
Reference in New Issue
Block a user