]> sourceware.org Git - lvm2.git/commitdiff
asan: fix some reports from libasan
authorZdenek Kabelac <zkabelac@redhat.com>
Mon, 7 Feb 2022 18:58:04 +0000 (19:58 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Mon, 7 Feb 2022 19:02:11 +0000 (20:02 +0100)
When compiled and used with:

CFLAGS="-fsanitize=address -g -O0"
ASAN_OPTIONS=strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1

we have few reported issue - they where not normally spotted, since
we were still accessing our own memory - but ouf of buffer-range.

TODO: there is still something to enhance with handling of #orphan vgids

lib/config/config.c
lib/format_text/format-text.c
lib/format_text/text_label.c
lib/metadata/metadata-exported.h
lib/uuid/uuid.c
tools/Makefile.in
tools/command.c

index c8dab5683a2090d15fe621d8ee005d7b759ddd8f..f9614779a743bac882b213386969bfdcf7c58ac4 100644 (file)
@@ -522,7 +522,9 @@ int config_file_read_fd(struct dm_config_tree *cft, struct device *dev, dev_io_r
        if (!(dev->flags & DEV_REGULAR) || size2)
                use_plain_read = 0;
 
-       if (!(buf = zalloc(size + size2))) {
+       /* Ensure there is extra '\0' after end of buffer since we pass
+        * buffer to funtions like strtoll() */
+       if (!(buf = zalloc(size + size2 + 1))) {
                log_error("Failed to allocate circular buffer.");
                return 0;
        }
index 00443faa12f7994de4e96fc338d74bf76471f0c1..07aaa0b2888099257198a7abc2ac9f159d40e0a5 100644 (file)
@@ -2601,7 +2601,7 @@ struct format_type *create_text_format(struct cmd_context *cmd)
        fmt->ops = &_text_handler;
        fmt->name = FMT_TEXT_NAME;
        fmt->alias = FMT_TEXT_ALIAS;
-       fmt->orphan_vg_name = ORPHAN_VG_NAME(FMT_TEXT_NAME);
+       strncpy(fmt->orphan_vg_name, ORPHAN_VG_NAME(FMT_TEXT_NAME), sizeof(fmt->orphan_vg_name));
        fmt->features = FMT_SEGMENTS | FMT_TAGS | FMT_PRECOMMIT |
                        FMT_UNLIMITED_VOLS | FMT_RESIZE_PV |
                        FMT_UNLIMITED_STRIPESIZE | FMT_CONFIG_PROFILE |
index 29b4702711704fd37ea7895a8b4a46ee51ad0621..324c86e449786cc716946c66800192b2b6cf56e9 100644 (file)
@@ -410,6 +410,7 @@ static int _text_read(struct cmd_context *cmd, struct labeller *labeller, struct
 {
        struct lvmcache_vgsummary vgsummary;
        char pvid[ID_LEN + 1] __attribute__((aligned(8))) = { 0 };
+       char vgid[ID_LEN + 1] __attribute__((aligned(8))) = { 0 };
        struct lvmcache_info *info;
        const struct format_type *fmt = labeller->fmt;
        struct label_header *lh = (struct label_header *) label_buf;
@@ -433,6 +434,7 @@ static int _text_read(struct cmd_context *cmd, struct labeller *labeller, struct
        pvhdr = (struct pv_header *) ((char *) label_buf + xlate32(lh->offset_xl));
 
        memcpy(pvid, &pvhdr->pv_uuid, ID_LEN);
+       strncpy(vgid, FMT_TEXT_ORPHAN_VG_NAME, ID_LEN);
 
        /*
         * FIXME: stop adding the device to lvmcache initially as an orphan
@@ -449,8 +451,8 @@ static int _text_read(struct cmd_context *cmd, struct labeller *labeller, struct
         * Other reasons for lvmcache_add to return NULL are internal errors.
         */
        if (!(info = lvmcache_add(cmd, labeller, pvid, dev, label_sector,
-                                 FMT_TEXT_ORPHAN_VG_NAME,
-                                 FMT_TEXT_ORPHAN_VG_NAME, 0, is_duplicate)))
+                                 vgid,
+                                 vgid, 0, is_duplicate)))
                return_0;
 
        lvmcache_set_device_size(info, xlate64(pvhdr->device_size_xl));
index 7bac5b9003437f1f6657cb63394f833af6703055..fd370d4b261aa2bca05ab496cc7825653d030564 100644 (file)
@@ -371,7 +371,7 @@ struct format_type {
        struct labeller *labeller;
        const char *name;
        const char *alias;
-       const char *orphan_vg_name;
+       char orphan_vg_name[ID_LEN];
        struct volume_group *orphan_vg; /* Only one ever exists. */
        uint32_t features;
        void *library;
index be4cbc3ec1945cf36d99a004f9c75794e01a350f..d8b72422bc0f48bf4dcce8ea8f3d4cdcc6ec684a 100644 (file)
@@ -168,6 +168,11 @@ int id_write_format(const struct id *id, char *buffer, size_t size)
 
        assert(ID_LEN == 32);
 
+       if (id->uuid[0] == '#') {
+               (void) dm_strncpy(buffer, (char*)id->uuid, size);
+               return 1;
+       }
+
        /* split into groups separated by dashes */
        if (size < (32 + 6 + 1)) {
                if (size > 0)
index e0e180474789c14f3393ec89b0b37e983c1213a7..25fe3b6b36d8b553f2fb371400c0fbf99b85503e 100644 (file)
@@ -190,9 +190,9 @@ command-lines-input.h: $(srcdir)/command-lines.in Makefile
        $(Q) set -o pipefail && \
        ( cat $(srcdir)/license.inc && \
          echo "/* Do not edit. This file is generated by the Makefile. */" && \
-         echo -en "const char _command_input[] =\n\n\"" && \
+         echo -en "static const char _command_input[] =\n\n\"" && \
          $(EGREP) -v '^#|\-\-\-|^$$' $(srcdir)/command-lines.in | $(AWK) 'BEGIN {ORS = "\\n\"\n\""} //' && \
-         echo "\\n\";" \
+         echo "\\n\\n\";" \
        ) > $@
 
 $(SOURCES:%.c=%.d) $(SOURCES2:%.c=%.d): command-lines-input.h command-count.h cmds.h
index 18ffd64ed986795f2ce3929eddbac8b60fef3c8f..8de8825e4cbd8b7ad7669a5ba27a18a5e5234542 100644 (file)
@@ -2549,7 +2549,7 @@ static const char *_man_long_opt_name(const char *cmdname, int opt_enum)
        }
 
        if (strchr(long_opt, '[')) {
-               for (i = 0; i < sizeof(long_opt_name) - 1; ++long_opt, ++i) {
+               for (i = 0; *long_opt && i < sizeof(long_opt_name) - 1; ++long_opt, ++i) {
                        if (i < (sizeof(long_opt_name) - 8))
                                switch(*long_opt) {
                                case '[':
This page took 0.041973 seconds and 5 git commands to generate.