Apply post-1.13.2 fixes, bump version to 1.13.3
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 26 Feb 2009 11:57:01 +0000 (11:57 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 26 Feb 2009 11:57:01 +0000 (11:57 -0000)
Makefile
archival/tar.c
archival/unzip.c
editors/awk.c
include/libbb.h
init/init.c
modutils/depmod.c
modutils/modutils-24.c
testsuite/mdev.tests
util-linux/mdev.c

index a2b2b015b92ecaf2a04191260a0ad6caa99b82bc..4bd5ebc2407ba50f51c7a436066173abbc0dc8d7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 13
-SUBLEVEL = 2
+SUBLEVEL = 3
 EXTRAVERSION =
 NAME = Unnamed
 
index deb5c89b0487724067d6daf4452051a81b3462f2..47cc39c8046020659ced081722c6d8349f1feb7f 100644 (file)
@@ -591,8 +591,6 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
        struct TarBallInfo tbInfo;
 
        tbInfo.hlInfoHead = NULL;
-
-       fchmod(tar_fd, 0644);
        tbInfo.tarFd = tar_fd;
        tbInfo.verboseFlag = verboseFlag;
 
index e468ff451db4dca764600812bcf156ab1f1ccbbf..7b47a8ab8cbfa8f358cc58476864c8002e404b5c 100644 (file)
@@ -140,7 +140,7 @@ struct BUG_cde_header_must_be_16_bytes {
 };
 
 #define FIX_ENDIANNESS_CDE(cde_header) do { \
-       (cde_header).formatted.cds_offset = SWAP_LE16((cde_header).formatted.cds_offset); \
+       (cde_header).formatted.cds_offset = SWAP_LE32((cde_header).formatted.cds_offset); \
 } while (0)
 
 enum { zip_fd = 3 };
index 1d0792e198eeab3756bfc4a867699affcfa23c57..64371f0602b1179b1201e4e9466e1c4270328892 100644 (file)
@@ -392,8 +392,12 @@ static const uint16_t PRIMES[] ALIGN2 = { 251, 1021, 4093, 16381, 65521 };
 
 
 /* Globals. Split in two parts so that first one is addressed
- * with (mostly short) negative offsets */
+ * with (mostly short) negative offsets.
+ * NB: it's unsafe to put members of type "double"
+ * into globals2 (gcc may fail to align them).
+ */
 struct globals {
+       double t_double;
        chain beginseq, mainseq, endseq;
        chain *seq;
        node *break_ptr, *continue_ptr;
@@ -442,16 +446,16 @@ struct globals2 {
        tsplitter exec_builtin__tspl;
 
        /* biggest and least used members go last */
-       double t_double;
        tsplitter fsplitter, rsplitter;
 };
 #define G1 (ptr_to_globals[-1])
 #define G (*(struct globals2 *)ptr_to_globals)
 /* For debug. nm --size-sort awk.o | grep -vi ' [tr] ' */
-/* char G1size[sizeof(G1)]; - 0x6c */
-/* char Gsize[sizeof(G)]; - 0x1cc */
+/*char G1size[sizeof(G1)]; - 0x74 */
+/*char Gsize[sizeof(G)]; - 0x1c4 */
 /* Trying to keep most of members accessible with short offsets: */
-/* char Gofs_seed[offsetof(struct globals2, evaluate__seed)]; - 0x90 */
+/*char Gofs_seed[offsetof(struct globals2, evaluate__seed)]; - 0x90 */
+#define t_double     (G1.t_double    )
 #define beginseq     (G1.beginseq    )
 #define mainseq      (G1.mainseq     )
 #define endseq       (G1.endseq      )
@@ -479,7 +483,6 @@ struct globals2 {
 #define t_info       (G.t_info      )
 #define t_tclass     (G.t_tclass    )
 #define t_string     (G.t_string    )
-#define t_double     (G.t_double    )
 #define t_lineno     (G.t_lineno    )
 #define t_rollback   (G.t_rollback  )
 #define intvar       (G.intvar      )
index 9e0399eee56396ca3a2cde88ea0e16ebc1351ef5..08fed90a724492bb3f34dd7920c7d163d2ce46cd 100644 (file)
@@ -1275,7 +1275,13 @@ enum {
        PSSCAN_UTIME    = 1 << 13,
        PSSCAN_TTY      = 1 << 14,
        PSSCAN_SMAPS    = (1 << 15) * ENABLE_FEATURE_TOPMEM,
-       PSSCAN_ARGVN    = (1 << 16) * (ENABLE_PGREP || ENABLE_PKILL || ENABLE_PIDOF),
+       /* NB: used by find_pid_by_name(). Any applet using it
+        * needs to be mentioned here. */
+       PSSCAN_ARGVN    = (1 << 16) * (ENABLE_KILLALL
+                               || ENABLE_PGREP || ENABLE_PKILL
+                               || ENABLE_PIDOF
+                               || ENABLE_SESTATUS 
+                               ),
        USE_SELINUX(PSSCAN_CONTEXT = 1 << 17,)
        PSSCAN_START_TIME = 1 << 18,
        PSSCAN_CPU      = 1 << 19,
index 10f5ba68de69b4e17956631c4d584fc077c30ab5..553650411e3bc4d9c8675b91b51178740a43bbb4 100644 (file)
@@ -671,15 +671,14 @@ static void new_init_action(uint8_t action_type, const char *command, const char
  */
 static void parse_inittab(void)
 {
+#if ENABLE_FEATURE_USE_INITTAB
        char *token[4];
-       /* order must correspond to SYSINIT..RESTART constants */
-       static const char actions[] ALIGN1 =
-               "sysinit\0""respawn\0""askfirst\0""wait\0""once\0"
-               "ctrlaltdel\0""shutdown\0""restart\0";
-
-       parser_t *parser = config_open2(INITTAB, fopen_for_read);
-       /* No inittab file -- set up some default behavior */
-       if (parser == NULL) {
+       parser_t *parser = config_open2("/etc/inittab", fopen_for_read);
+
+       if (parser == NULL)
+#endif
+       {
+               /* No inittab file -- set up some default behavior */
                /* Reboot on Ctrl-Alt-Del */
                new_init_action(CTRLALTDEL, "reboot", "");
                /* Umount all filesystems on halt/reboot */
@@ -699,11 +698,17 @@ static void parse_inittab(void)
                new_init_action(SYSINIT, INIT_SCRIPT, "");
                return;
        }
+
+#if ENABLE_FEATURE_USE_INITTAB
        /* optional_tty:ignored_runlevel:action:command
         * Delims are not to be collapsed and need exactly 4 tokens
         */
        while (config_read(parser, token, 4, 0, "#:",
                                PARSE_NORMAL & ~(PARSE_TRIM | PARSE_COLLAPSE))) {
+               /* order must correspond to SYSINIT..RESTART constants */
+               static const char actions[] ALIGN1 =
+                       "sysinit\0""respawn\0""askfirst\0""wait\0""once\0"
+                       "ctrlaltdel\0""shutdown\0""restart\0";
                int action;
                char *tty = token[0];
 
@@ -727,6 +732,7 @@ static void parse_inittab(void)
                                parser->lineno);
        }
        config_close(parser);
+#endif
 }
 
 #if ENABLE_FEATURE_USE_INITTAB
index a4474d5e4a96a7ab7b4687fd8100c8dcece95b48..7f3e1d8a633415255246e672619667615fb718b9 100644 (file)
@@ -33,7 +33,7 @@ typedef struct module_info {
 enum {
        ARG_a = (1<<0), /* All modules, ignore mods in argv */
        ARG_A = (1<<1), /* Only emit .ko that are newer than modules.dep file */
-       ARG_b = (1<<2), /* not /lib/modules/$(uname -r)/ but this base-dir */
+       ARG_b = (1<<2), /* base directory when modules are in staging area */
        ARG_e = (1<<3), /* with -F, print unresolved symbols */
        ARG_F = (1<<4), /* System.map that contains the symbols */
        ARG_n = (1<<5)  /* dry-run, print to stdout only */
@@ -57,7 +57,7 @@ static int FAST_FUNC parse_module(const char *fname, struct stat *sb,
        *first = info;
 
        info->dnext = info->dprev = info;
-       info->name = xstrdup(fname);
+       info->name = xasprintf("/%s", fname);
        info->modname = filename2modname(fname, NULL);
        for (ptr = image; ptr < image + len - 10; ptr++) {
                if (strncmp(ptr, "depends=", 8) == 0) {
@@ -123,44 +123,61 @@ static void order_dep_list(module_info *modules, module_info *start,
        }
 }
 
+static void xfreopen_write(const char *file, FILE *f)
+{
+       if (freopen(file, "w", f) == NULL)
+               bb_perror_msg_and_die("can't open '%s'", file);
+}
+
 int depmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int depmod_main(int argc UNUSED_PARAM, char **argv)
 {
        module_info *modules = NULL, *m, *dep;
-       char *moddir_base = (char *)CONFIG_DEFAULT_MODULES_DIR;
+       const char *moddir_base = "/";
+       char *moddir, *version;
+       struct utsname uts;
        int tmp;
 
        getopt32(argv, "aAb:eF:n", &moddir_base, NULL);
        argv += optind;
 
        /* goto modules location */
+       xchdir(moddir_base);
 
        /* If a version is provided, then that kernel version's module directory
         * is used, rather than the current kernel version (as returned by
         * "uname -r").  */
-       xchdir(moddir_base);
-       if (*argv && (sscanf(*argv, "%d.%d.%d", &tmp, &tmp, &tmp) == 3)) {
-               xchdir(*argv++);
+       if (*argv && sscanf(*argv, "%d.%d.%d", &tmp, &tmp, &tmp) == 3) {
+               version = *argv++;
        } else {
-               struct utsname uts;
                uname(&uts);
-               xchdir(uts.release);
+               version = uts.release;
        }
-       /* If no modules are given on the command-line, -a is on per default.  */
-       option_mask32 |= *argv == NULL;
+       moddir = concat_path_file(&CONFIG_DEFAULT_MODULES_DIR[1], version);
 
        /* Scan modules */
-       moddir_base = xrealloc_getcwd_or_warn(NULL);
-       do {
-               recursive_action((option_mask32 & ARG_a) ? moddir_base : *argv,
-                               ACTION_RECURSE, parse_module, NULL,  &modules, 0);
-       } while (!(option_mask32 & ARG_a) && *(++argv));
+       if (*argv) {
+               char *modfile;
+               struct stat sb;
+               do {
+                       modfile = concat_path_file(moddir, *argv);
+                       xstat(modfile, &sb);
+                       parse_module(modfile, &sb, &modules, 0);
+                       free(modfile);
+               } while (*(++argv));
+       } else {
+               recursive_action(moddir, ACTION_RECURSE,
+                                parse_module, NULL, &modules, 0);
+       }
+
+       /* Prepare for writing out the dep files */
+       xchdir(moddir);
        if (ENABLE_FEATURE_CLEAN_UP)
-               free(moddir_base);
+               free(moddir);
 
        /* Generate dependency and alias files */
        if (!(option_mask32 & ARG_n))
-               freopen(CONFIG_DEFAULT_DEPMOD_FILE, "w", stdout);
+               xfreopen_write(CONFIG_DEFAULT_DEPMOD_FILE, stdout);
        for (m = modules; m != NULL; m = m->next) {
                printf("%s:", m->name);
 
@@ -174,12 +191,12 @@ int depmod_main(int argc UNUSED_PARAM, char **argv)
                        dep->dprev->dnext = dep->dnext;
                        dep->dnext = dep->dprev = dep;
                }
-               puts("");
+               bb_putchar('\n');
        }
 
 #if ENABLE_FEATURE_MODUTILS_ALIAS
        if (!(option_mask32 & ARG_n))
-               freopen("modules.alias", "w", stdout);
+               xfreopen_write("modules.alias", stdout);
        for (m = modules; m != NULL; m = m->next) {
                while (m->aliases) {
                        printf("alias %s %s\n",
@@ -190,7 +207,7 @@ int depmod_main(int argc UNUSED_PARAM, char **argv)
 #endif
 #if ENABLE_FEATURE_MODUTILS_SYMBOLS
        if (!(option_mask32 & ARG_n))
-               freopen("modules.symbols", "w", stdout);
+               xfreopen_write("modules.symbols", stdout);
        for (m = modules; m != NULL; m = m->next) {
                while (m->symbols) {
                        printf("alias symbol:%s %s\n",
index c6e7226cd0600631aa9222a12d85905ee7b40ad0..622ab3abe7ceabb98d0b88b6e5f6019706289ec1 100644 (file)
@@ -2150,7 +2150,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);
 
@@ -2165,7 +2165,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;
@@ -2175,7 +2175,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;
@@ -2571,8 +2571,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;
@@ -2652,13 +2651,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,
@@ -2965,9 +2965,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;
@@ -3006,12 +3006,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;
                }
        }
@@ -3275,14 +3272,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;
 
index 22855791a4ec5242c9b54fcb18ac5d6f5dc6a40d..90379e6685b466cf8e5e92777a9d296fe741afba 100755 (executable)
@@ -109,6 +109,22 @@ brw-r--r-- 1 0 0 8,0 sda
 " \
        "" ""
 
+# continuing to use directory structure from prev test
+rm -rf mdev.testdir/dev/*
+echo "sda 0:0 644 =block/ @echo @echo TEST" >mdev.testdir/etc/mdev.conf
+testing "mdev move and command" \
+       "env - PATH=$PATH ACTION=add DEVPATH=/block/sda chroot mdev.testdir /mdev 2>&1;
+       ls -lnR mdev.testdir/dev | $FILTER_LS2" \
+"\
+@echo TEST
+mdev.testdir/dev:
+drwxr-xr-x 2 0 0 block
+
+mdev.testdir/dev/block:
+brw-r--r-- 1 0 0 sda
+" \
+       "" ""
+
 # continuing to use directory structure from prev test
 rm -rf mdev.testdir/dev/*
 echo "@8,0 :1 644" >mdev.testdir/etc/mdev.conf
index 34cabc93457b4a931278c8fef9acb1ba54bf2d13..d8b603e2b38995226af9a54764e60cd99c02069b 100644 (file)
@@ -179,8 +179,9 @@ static void make_device(char *path, int delete)
                        unsigned i, n;
 #endif
                        char *a = val;
-                       s = strchr(val, ' ');
-                       val = (s && s[1]) ? s+1 : NULL;
+                       s = strchrnul(val, ' ');
+                       val = (s[0] && s[1]) ? s+1 : NULL;
+                       s[0] = '\0';
 #if ENABLE_FEATURE_MDEV_RENAME_REGEXP
                        /* substitute %1..9 with off[1..9], if any */
                        n = 0;