Submitted By: Igor Živković Date: 2015-01-07 Initial Package Version: 1.23.0 Upstream Status: Already in upstream repo Origin: Upstream Description: This patch contains upstream ash, modprobe, and vi patches. diff -Naur busybox-1.23.0.orig/editors/vi.c busybox-1.23.0/editors/vi.c --- busybox-1.23.0.orig/editors/vi.c 2014-10-04 22:35:58.000000000 +0200 +++ busybox-1.23.0/editors/vi.c 2015-01-07 18:59:40.429659147 +0100 @@ -542,9 +542,6 @@ static int mysleep(int); static int readit(void); // read (maybe cursor) key from stdin static int get_one_char(void); // read 1 char from stdin -#if !ENABLE_FEATURE_VI_READONLY -#define file_insert(fn, p, update_ro_status) file_insert(fn, p) -#endif // file_insert might reallocate text[]! static int file_insert(const char *, char *, int); static int file_write(char *, char *, char *); @@ -1325,7 +1322,7 @@ q = next_line(q); { // dance around potentially-reallocated text[] uintptr_t ofs = q - text; - size = file_insert(fn, q, /*update_ro:*/ 0); + size = file_insert(fn, q, 0); q = text + ofs; } if (size < 0) @@ -2905,7 +2902,7 @@ } // might reallocate text[]! -static int file_insert(const char *fn, char *p, int update_ro_status) +static int file_insert(const char *fn, char *p, int initial) { int cnt = -1; int fd, size; @@ -2918,7 +2915,8 @@ fd = open(fn, O_RDONLY); if (fd < 0) { - status_line_bold_errno(fn); + if (!initial) + status_line_bold_errno(fn); return cnt; } @@ -2946,7 +2944,7 @@ close(fd); #if ENABLE_FEATURE_VI_READONLY - if (update_ro_status + if (initial && ((access(fn, W_OK) < 0) || /* root will always have access() * so we check fileperms too */ diff -Naur busybox-1.23.0.orig/modutils/depmod.c busybox-1.23.0/modutils/depmod.c --- busybox-1.23.0.orig/modutils/depmod.c 2014-10-04 22:35:59.000000000 +0200 +++ busybox-1.23.0/modutils/depmod.c 2015-01-07 18:59:37.452781322 +0100 @@ -51,7 +51,11 @@ info->dnext = info->dprev = info; info->name = xstrdup(fname + 2); /* skip "./" */ - info->modname = xstrdup(filename2modname(fname, modname)); + info->modname = xstrdup( + filename2modname( + bb_get_last_path_component_nostrip(fname), + modname + )); for (ptr = image; ptr < image + len - 10; ptr++) { if (strncmp(ptr, "depends=", 8) == 0) { char *u; @@ -242,17 +246,18 @@ if (!(option_mask32 & OPT_n)) xfreopen_write("modules.alias", stdout); for (m = modules; m != NULL; m = m->next) { + char modname[MODULE_NAME_LEN]; const char *fname = bb_basename(m->name); - int fnlen = strchrnul(fname, '.') - fname; + filename2modname(fname, modname); while (m->aliases) { /* 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", + printf("alias %s %s\n", (char*)llist_pop(&m->aliases), - fnlen, fname); + modname); } } #endif @@ -260,12 +265,13 @@ if (!(option_mask32 & OPT_n)) xfreopen_write("modules.symbols", stdout); for (m = modules; m != NULL; m = m->next) { + char modname[MODULE_NAME_LEN]; const char *fname = bb_basename(m->name); - int fnlen = strchrnul(fname, '.') - fname; + filename2modname(fname, modname); while (m->symbols) { - printf("alias symbol:%s %.*s\n", + printf("alias symbol:%s %s\n", (char*)llist_pop(&m->symbols), - fnlen, fname); + modname); } } #endif diff -Naur busybox-1.23.0.orig/modutils/modprobe.c busybox-1.23.0/modutils/modprobe.c --- busybox-1.23.0.orig/modutils/modprobe.c 2014-11-26 23:19:35.000000000 +0100 +++ busybox-1.23.0/modutils/modprobe.c 2015-01-07 18:59:37.458781076 +0100 @@ -238,17 +238,6 @@ { struct module_entry *m; - /* - * get_or_add_modentry() strips path from name and works - * on remaining basename. - * This would make "rmmod dir/name" and "modprobe dir/name" - * to work like "rmmod name" and "modprobe name", - * which is wrong, and can be abused via implicit modprobing: - * "ifconfig /usbserial up" tries to modprobe netdev-/usbserial. - */ - if (strchr(name, '/')) - bb_error_msg_and_die("malformed module name '%s'", name); - m = get_or_add_modentry(name); if (!(option_mask32 & (OPT_REMOVE | OPT_SHOW_DEPS)) && (m->flags & MODULE_FLAG_LOADED) diff -Naur busybox-1.23.0.orig/modutils/modprobe-small.c busybox-1.23.0/modutils/modprobe-small.c --- busybox-1.23.0.orig/modutils/modprobe-small.c 2014-10-04 22:35:59.000000000 +0200 +++ busybox-1.23.0/modutils/modprobe-small.c 2015-01-07 18:59:37.462780912 +0100 @@ -149,9 +149,13 @@ static char *filename2modname(const char *filename, char *modname) { int i; - char *from; + const char *from; - from = bb_get_last_path_component_nostrip(filename); + // Disabled since otherwise "modprobe dir/name" would work + // as if it is "modprobe name". It is unclear why + // 'basenamization' was here in the first place. + //from = bb_get_last_path_component_nostrip(filename); + from = filename; for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) modname[i] = (from[i] == '-') ? '_' : from[i]; modname[i] = '\0'; diff -Naur busybox-1.23.0.orig/modutils/modutils.c busybox-1.23.0/modutils/modutils.c --- busybox-1.23.0.orig/modutils/modutils.c 2014-10-04 22:35:59.000000000 +0200 +++ busybox-1.23.0/modutils/modutils.c 2015-01-07 18:59:37.463780870 +0100 @@ -48,13 +48,17 @@ char* FAST_FUNC filename2modname(const char *filename, char *modname) { int i; - char *from; + const char *from; if (filename == NULL) return NULL; if (modname == NULL) modname = xmalloc(MODULE_NAME_LEN); - from = bb_get_last_path_component_nostrip(filename); + // Disabled since otherwise "modprobe dir/name" would work + // as if it is "modprobe name". It is unclear why + // 'basenamization' was here in the first place. + //from = bb_get_last_path_component_nostrip(filename); + from = filename; for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) modname[i] = (from[i] == '-') ? '_' : from[i]; modname[i] = '\0'; diff -Naur busybox-1.23.0.orig/shell/ash.c busybox-1.23.0/shell/ash.c --- busybox-1.23.0.orig/shell/ash.c 2014-11-20 01:08:23.000000000 +0100 +++ busybox-1.23.0/shell/ash.c 2015-01-07 18:59:34.183915659 +0100 @@ -6746,6 +6746,14 @@ len = strlen(p); if (!(subtype == VSPLUS || subtype == VSLENGTH)) memtodest(p, len, syntax, quotes); +#if ENABLE_UNICODE_SUPPORT + if (subtype == VSLENGTH && len > 0) { + reinit_unicode_for_ash(); + if (unicode_status == UNICODE_ON) { + len = unicode_strlen(p); + } + } +#endif return len; } @@ -6829,15 +6837,7 @@ varunset(p, var, 0, 0); if (subtype == VSLENGTH) { - ssize_t n = varlen; - if (n > 0) { - reinit_unicode_for_ash(); - if (unicode_status == UNICODE_ON) { - const char *val = lookupvar(var); - n = unicode_strlen(val); - } - } - cvtnum(n > 0 ? n : 0); + cvtnum(varlen > 0 ? varlen : 0); goto record; }