Apply post-1.23.0 patches, bump version to 1.23.1 1_23_1
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 27 Jan 2015 08:52:18 +0000 (09:52 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 27 Jan 2015 08:52:18 +0000 (09:52 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Makefile
editors/vi.c
modutils/depmod.c
modutils/modprobe-small.c
modutils/modprobe.c
modutils/modutils.c
networking/ftpd.c
shell/ash.c

index b487f045739391ed222ef0bd3ddb984d91492f09..d449fa51147c545454aaa2290d34e944b88d6863 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 23
-SUBLEVEL = 0
+SUBLEVEL = 1
 EXTRAVERSION =
 NAME = Unnamed
 
index 70bdbab07b09c03bab33a00ccaece41ec05a0e00..7b88e8e1739248b1c56ebb6dd45ad324ce69dd3f 100644 (file)
@@ -542,9 +542,6 @@ static void cookmode(void); // return to "cooked" mode on tty
 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 @@ static void colon(char *buf)
                        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 @@ static char *get_input_line(const char *prompt)
 }
 
 // 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 @@ static int file_insert(const char *fn, char *p, int update_ro_status)
 
        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 @@ static int file_insert(const char *fn, char *p, int update_ro_status)
        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 */
index aa228ec8561fec402ee445570bf36e29199e1190..a41b3e44097a27a6d88902577d0ebb35c8c0c3b2 100644 (file)
@@ -51,7 +51,11 @@ static int FAST_FUNC parse_module(const char *fname, struct stat *sb UNUSED_PARA
 
        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 @@ int depmod_main(int argc UNUSED_PARAM, char **argv)
        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 @@ int depmod_main(int argc UNUSED_PARAM, char **argv)
        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
index b7990bff15e787abfcc5e26973cecbc60155fdae..cf8a3f0fe1e6b9d8d815116dfffb3f1f497f40e7 100644 (file)
@@ -149,9 +149,13 @@ static void replace(char *s, char what, char with)
 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';
@@ -631,6 +635,14 @@ static void process_module(char *name, const char *cmdline_options)
                infovec = find_alias(name);
        }
 
+       if (!infovec) {
+               /* both dirscan and find_alias found nothing */
+               if (!is_rmmod && applet_name[0] != 'd') /* it wasn't rmmod or depmod */
+                       bb_error_msg("module '%s' not found", name);
+//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline?
+               goto ret;
+       }
+
        /* There can be more than one module for the given alias. For example,
         * "pci:v00008086d00007010sv00000000sd00000000bc01sc01i80" matches
         * ata_piix because it has alias "pci:v00008086d00007010sv*sd*bc*sc*i*"
@@ -646,7 +658,8 @@ static void process_module(char *name, const char *cmdline_options)
                        int r;
                        char modname[MODULE_NAME_LEN];
 
-                       filename2modname(info->pathname, modname);
+                       filename2modname(
+                               bb_get_last_path_component_nostrip(info->pathname), modname);
                        r = delete_module(modname, O_NONBLOCK | O_EXCL);
                        dbg1_error_msg("delete_module('%s', O_NONBLOCK | O_EXCL):%d", modname, r);
                        if (r != 0) {
@@ -669,14 +682,6 @@ static void process_module(char *name, const char *cmdline_options)
                 */
        }
 
-       if (!infovec) {
-               /* both dirscan and find_alias found nothing */
-               if (!is_rmmod && applet_name[0] != 'd') /* it wasn't rmmod or depmod */
-                       bb_error_msg("module '%s' not found", name);
-//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline?
-               goto ret;
-       }
-
        infoidx = 0;
        while ((info = infovec[infoidx++]) != NULL) {
                /* Iterate thru dependencies, trying to (un)load them */
index f0904285b2e8162b3033923e222eea296c784c1a..aedde5c90f8fedb50386279dc99b0f8ea3e84595 100644 (file)
@@ -229,26 +229,20 @@ static ALWAYS_INLINE struct module_entry *get_or_add_modentry(const char *module
 {
        return helper_get_module(module, 1);
 }
-static ALWAYS_INLINE struct module_entry *get_modentry(const char *module)
+/* So far this function always gets a module pathname, never an alias name.
+ * The crucial difference is that pathname needs dirname stripping,
+ * while alias name must NOT do it!
+ * Testcase where dirname stripping is likely to go wrong: "modprobe devname:snd/timer"
+ */
+static ALWAYS_INLINE struct module_entry *get_modentry(const char *pathname)
 {
-       return helper_get_module(module, 0);
+       return helper_get_module(bb_get_last_path_component_nostrip(pathname), 0);
 }
 
 static void add_probe(const char *name)
 {
        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)
@@ -428,7 +422,7 @@ static int do_modprobe(struct module_entry *m)
 
                rc = 0;
                fn = llist_pop(&m->deps); /* we leak it */
-               m2 = get_or_add_modentry(fn);
+               m2 = get_or_add_modentry(bb_get_last_path_component_nostrip(fn));
 
                if (option_mask32 & OPT_REMOVE) {
                        /* modprobe -r */
@@ -510,7 +504,7 @@ static void load_modules_dep(void)
                colon = last_char_is(tokens[0], ':');
                if (colon == NULL)
                        continue;
-               *colon = 0;
+               *colon = '\0';
 
                m = get_modentry(tokens[0]);
                if (m == NULL)
@@ -557,7 +551,6 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
 
        if (opt & OPT_LIST_ONLY) {
                int i;
-               char name[MODULE_NAME_LEN];
                char *colon, *tokens[2];
                parser_t *p = config_open2(CONFIG_DEFAULT_DEPMOD_FILE, xfopen_for_read);
 
@@ -569,10 +562,14 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
                        if (!colon)
                                continue;
                        *colon = '\0';
-                       filename2modname(tokens[0], name);
                        if (!argv[0])
                                puts(tokens[0]);
                        else {
+                               char name[MODULE_NAME_LEN];
+                               filename2modname(
+                                       bb_get_last_path_component_nostrip(tokens[0]),
+                                       name
+                               );
                                for (i = 0; argv[i]; i++) {
                                        if (fnmatch(argv[i], name, 0) == 0) {
                                                puts(tokens[0]);
index 6187ca72fd3835fa28a18158205a5856913cfd75..ff79d3fac9c80f17fe9abf8255e37852c651eb63 100644 (file)
@@ -48,13 +48,17 @@ int FAST_FUNC string_to_llist(char *string, llist_t **llist, const char *delim)
 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';
index 6adcb1dee0cfcfdfba4890666c483e899e6917e2..0c10e1f25ddedd90b46d1331ec5493acc43521a6 100644 (file)
@@ -1174,8 +1174,13 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
 
        //umask(077); - admin can set umask before starting us
 
-       /* Signals. We'll always take -EPIPE rather than a rude signal, thanks */
-       signal(SIGPIPE, SIG_IGN);
+       /* Signals */
+       bb_signals(0
+               /* We'll always take EPIPE rather than a rude signal, thanks */
+               + (1 << SIGPIPE)
+               /* LIST command spawns chilren. Prevent zombies */
+               + (1 << SIGCHLD)
+               , SIG_IGN);
 
        /* Set up options on the command socket (do we need these all? why?) */
        setsockopt(STDIN_FILENO, IPPROTO_TCP, TCP_NODELAY, &const_int_1, sizeof(const_int_1));
index 90fb00fbd36e68d0f3ec4009e5a79c3245a0914b..c5ad96909f3387cdeb840fad49e2b1e5c5b6fa9d 100644 (file)
@@ -6746,6 +6746,14 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
                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 @@ evalvar(char *p, int flags, struct strlist *var_str_list)
                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;
        }