]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
Coverity: Resource leak: close fd before return
[thirdparty/mdadm.git] / super1.c
index f80e38affd2a8ba522aec61075cb79226d2025fe..636a286697bc00b12a1382277b15dd2c86f874e0 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -1185,20 +1185,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
         * ignored.
         */
        int rv = 0;
-       int lockid;
        struct mdp_superblock_1 *sb = st->sb;
        bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
 
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
-               rv = cluster_get_dlmlock(&lockid);
-               if (rv) {
-                       pr_err("Cannot get dlmlock in %s return %d\n",
-                              __func__, rv);
-                       cluster_release_dlmlock(lockid);
-                       return rv;
-               }
-       }
-
        if (strcmp(update, "homehost") == 0 &&
            homehost) {
                /* Note that 'homehost' is special as it is really
@@ -1445,8 +1434,15 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        strcpy(sb->set_name, homehost);
                        strcat(sb->set_name, ":");
                        strcat(sb->set_name, info->name);
-               } else
-                       strncpy(sb->set_name, info->name, sizeof(sb->set_name));
+               } else {
+                       int namelen;
+
+                       namelen = min((int)strlen(info->name),
+                                     (int)sizeof(sb->set_name) - 1);
+                       memcpy(sb->set_name, info->name, namelen);
+                       memset(&sb->set_name[namelen], '\0',
+                              sizeof(sb->set_name) - namelen);
+               }
        } else if (strcmp(update, "devicesize") == 0 &&
                   __le64_to_cpu(sb->super_offset) <
                   __le64_to_cpu(sb->data_offset)) {
@@ -1551,8 +1547,6 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                rv = -1;
 
        sb->sb_csum = calc_sb_1_csum(sb);
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
-               cluster_release_dlmlock(lockid);
 
        return rv;
 }
@@ -1605,8 +1599,15 @@ static int init_super1(struct supertype *st, mdu_array_info_t *info,
                strcpy(sb->set_name, homehost);
                strcat(sb->set_name, ":");
                strcat(sb->set_name, name);
-       } else
-               strncpy(sb->set_name, name, sizeof(sb->set_name));
+       } else {
+               int namelen;
+
+               namelen = min((int)strlen(name),
+                             (int)sizeof(sb->set_name) - 1);
+               memcpy(sb->set_name, name, namelen);
+               memset(&sb->set_name[namelen], '\0',
+                      sizeof(sb->set_name) - namelen);
+       }
 
        sb->ctime = __cpu_to_le64((unsigned long long)time(0));
        sb->level = __cpu_to_le32(info->level);
@@ -1656,20 +1657,8 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
        struct mdp_superblock_1 *sb = st->sb;
        __u16 *rp = sb->dev_roles + dk->number;
        struct devinfo *di, **dip;
-       bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
-       int rv, lockid;
        int dk_state;
 
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
-               rv = cluster_get_dlmlock(&lockid);
-               if (rv) {
-                       pr_err("Cannot get dlmlock in %s return %d\n",
-                              __func__, rv);
-                       cluster_release_dlmlock(lockid);
-                       return rv;
-               }
-       }
-
        dk_state = dk->state & ~(1<<MD_DISK_FAILFAST);
        if ((dk_state & (1<<MD_DISK_ACTIVE)) &&
            (dk_state & (1<<MD_DISK_SYNC)))/* active, sync */
@@ -1701,9 +1690,6 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
        di->next = NULL;
        *dip = di;
 
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
-               cluster_release_dlmlock(lockid);
-
        return 0;
 }
 
@@ -1716,18 +1702,6 @@ static int store_super1(struct supertype *st, int fd)
        struct align_fd afd;
        int sbsize;
        unsigned long long dsize;
-       bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
-       int rv, lockid;
-
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
-               rv = cluster_get_dlmlock(&lockid);
-               if (rv) {
-                       pr_err("Cannot get dlmlock in %s return %d\n",
-                              __func__, rv);
-                       cluster_release_dlmlock(lockid);
-                       return rv;
-               }
-       }
 
        if (!get_dev_size(fd, NULL, &dsize))
                return 1;
@@ -1788,8 +1762,6 @@ static int store_super1(struct supertype *st, int fd)
                }
        }
        fsync(fd);
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
-               cluster_release_dlmlock(lockid);
 
        return 0;
 }
@@ -1823,6 +1795,11 @@ static int write_init_ppl1(struct supertype *st, struct mdinfo *info, int fd)
        struct ppl_header *ppl_hdr;
        int ret;
 
+       /* first clear entire ppl space */
+       ret = zero_disk_range(fd, info->ppl_sector, info->ppl_size);
+       if (ret)
+               return ret;
+
        ret = posix_memalign(&buf, 4096, PPL_HEADER_SIZE);
        if (ret) {
                pr_err("Failed to allocate PPL header buffer\n");