]> git.proxmox.com Git - zfs-grub.git/commitdiff
add zfs and bios related patches from upstream
authorDietmar Maurer <dietmar@proxmox.com>
Thu, 29 Jan 2015 09:43:38 +0000 (10:43 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 29 Jan 2015 09:46:23 +0000 (10:46 +0100)
pvepatches/biosdisk-Add-missing-cast.patch [new file with mode: 0644]
pvepatches/biosdisk.c-Check-disk-size-sanity.patch [new file with mode: 0644]
pvepatches/series
pvepatches/zfs-Fix-disk-matching-logic.patch [new file with mode: 0644]
pvepatches/zfs-Fix-error-handling.patch [new file with mode: 0644]
pvepatches/zfs.c-Avoid-divisions-by-zero.patch [new file with mode: 0644]
pvepatches/zfs.c-fix-memory-leak.patch [new file with mode: 0644]
pvepatches/zfscrypt-Add-missing-explicit-cast.patch [new file with mode: 0644]
pvepatches/zfsinfo.c-memory-leak-in-print_vdev_info.patch [new file with mode: 0644]

diff --git a/pvepatches/biosdisk-Add-missing-cast.patch b/pvepatches/biosdisk-Add-missing-cast.patch
new file mode 100644 (file)
index 0000000..96315d0
--- /dev/null
@@ -0,0 +1,33 @@
+From d1130afa5f22e4fee75ab55f11e16e0fbd98597d Mon Sep 17 00:00:00 2001
+From: Vladimir Serbinenko <phcoder@gmail.com>
+Date: Sat, 24 Jan 2015 20:50:30 +0000
+Subject: biosdisk: Add missing cast.
+
+Found by: Coverity scan.
+---
+diff --git a/grub-core/disk/i386/pc/biosdisk.c b/grub-core/disk/i386/pc/biosdisk.c
+index 26a4973..f0aadd1 100644
+--- a/grub-core/disk/i386/pc/biosdisk.c
++++ b/grub-core/disk/i386/pc/biosdisk.c
+@@ -382,7 +382,8 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
+                 /* Some buggy BIOSes doesn't return the total sectors
+                    correctly but returns zero. So if it is zero, compute
+                    it by C/H/S returned by the LBA BIOS call.  */
+-                total_sectors = drp->cylinders * drp->heads * drp->sectors;
++                total_sectors = ((grub_uint64_t) drp->cylinders)
++                * drp->heads * drp->sectors;
+             if (drp->bytes_per_sector
+                 && !(drp->bytes_per_sector & (drp->bytes_per_sector - 1))
+                 && drp->bytes_per_sector >= 512
+@@ -425,7 +426,8 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
+       data->heads = 255;
+       if (! total_sectors)
+-        total_sectors = data->cylinders * data->heads * data->sectors;
++        total_sectors = ((grub_uint64_t) data->cylinders)
++        * data->heads * data->sectors;
+     }
+   disk->total_sectors = total_sectors;
+--
+cgit v0.9.0.2
diff --git a/pvepatches/biosdisk.c-Check-disk-size-sanity.patch b/pvepatches/biosdisk.c-Check-disk-size-sanity.patch
new file mode 100644 (file)
index 0000000..815a655
--- /dev/null
@@ -0,0 +1,24 @@
+From 4200ad44fe782193a397bd0f0ab72283a6d25e89 Mon Sep 17 00:00:00 2001
+From: Vladimir Serbinenko <phcoder@gmail.com>
+Date: Tue, 20 Jan 2015 14:10:34 +0000
+Subject:       * grub-core/disk/i386/pc/biosdisk.c: Check disk size sanity.
+
+---
+diff --git a/grub-core/disk/i386/pc/biosdisk.c b/grub-core/disk/i386/pc/biosdisk.c
+index 6b21525..26a4973 100644
+--- a/grub-core/disk/i386/pc/biosdisk.c
++++ b/grub-core/disk/i386/pc/biosdisk.c
+@@ -419,6 +419,11 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
+           }
+         }
++      if (data->sectors == 0)
++      data->sectors = 63;
++      if (data->heads == 0)
++      data->heads = 255;
++
+       if (! total_sectors)
+         total_sectors = data->cylinders * data->heads * data->sectors;
+     }
+--
+cgit v0.9.0.2
index ab73c1964abc8f83b4a0e04778181084ebd34bd6..fc999ce39e75cb4021656e8097739cd533c78b00 100644 (file)
@@ -1,3 +1,11 @@
 fix-control.patch
-fix-zfs-ldadd.patch
 fix-grub-pc-postinst.patch
+fix-zfs-ldadd.patch
+zfsinfo.c-memory-leak-in-print_vdev_info.patch
+zfs.c-Avoid-divisions-by-zero.patch
+zfs-Fix-disk-matching-logic.patch
+zfs-Fix-error-handling.patch
+zfscrypt-Add-missing-explicit-cast.patch
+zfs.c-fix-memory-leak.patch
+biosdisk-Add-missing-cast.patch
+biosdisk.c-Check-disk-size-sanity.patch
diff --git a/pvepatches/zfs-Fix-disk-matching-logic.patch b/pvepatches/zfs-Fix-disk-matching-logic.patch
new file mode 100644 (file)
index 0000000..cf702ab
--- /dev/null
@@ -0,0 +1,66 @@
+From 12a9c52e516b94888db0a4502946242e3b14709f Mon Sep 17 00:00:00 2001
+From: Vladimir Serbinenko <phcoder@gmail.com>
+Date: Sat, 24 Jan 2015 19:57:26 +0000
+Subject: zfs: Fix disk-matching logic.
+
+Reported by: Tim Chase <dweeezil>
+---
+(limited to 'grub-core/fs/zfs')
+
+diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c
+index c943b52..c8c7b97 100644
+--- a/grub-core/fs/zfs/zfs.c
++++ b/grub-core/fs/zfs/zfs.c
+@@ -252,7 +252,6 @@ struct grub_zfs_data
+   uberblock_t current_uberblock;
+-  int mounted;
+   grub_uint64_t guid;
+ };
+@@ -957,7 +956,7 @@ nvpair_value (const char *nvp,char **val,
+ static grub_err_t
+ check_pool_label (struct grub_zfs_data *data,
+                 struct grub_zfs_device_desc *diskdesc,
+-                int *inserted)
++                int *inserted, int original)
+ {
+   grub_uint64_t pool_state, txg = 0;
+   char *nvlist,*features;
+@@ -1081,11 +1080,12 @@ check_pool_label (struct grub_zfs_data *data,
+   grub_dprintf ("zfs", "check 11 passed\n");
+-  if (data->mounted && data->guid != poolguid)
+-    return grub_error (GRUB_ERR_BAD_FS, "another zpool");
+-  else
++  if (original)
+     data->guid = poolguid;
++  if (data->guid != poolguid)
++    return grub_error (GRUB_ERR_BAD_FS, "another zpool");
++
+   {
+     char *nv;
+     nv = grub_zfs_nvlist_lookup_nvlist (nvlist, ZPOOL_CONFIG_VDEV_TREE);
+@@ -1186,7 +1186,7 @@ scan_disk (grub_device_t dev, struct grub_zfs_data *data,
+       }
+       grub_dprintf ("zfs", "label ok %d\n", label);
+-      err = check_pool_label (data, &desc, inserted);
++      err = check_pool_label (data, &desc, inserted, original);
+       if (err || !*inserted)
+       {
+         grub_errno = GRUB_ERR_NONE;
+@@ -3612,8 +3612,6 @@ zfs_mount (grub_device_t dev)
+                                        ub_endian) >> 63) & 1;
+   grub_free (osp);
+-  data->mounted = 1;
+-
+   return data;
+ }
+--
+cgit v0.9.0.2
diff --git a/pvepatches/zfs-Fix-error-handling.patch b/pvepatches/zfs-Fix-error-handling.patch
new file mode 100644 (file)
index 0000000..cc5af07
--- /dev/null
@@ -0,0 +1,61 @@
+From 0daf46fdbd37627411f3a0dd99390ee4523de1bb Mon Sep 17 00:00:00 2001
+From: Vladimir Serbinenko <phcoder@gmail.com>
+Date: Tue, 27 Jan 2015 15:31:35 +0000
+Subject: fs/zfs: Fix error handling.
+
+Found by: Coverity Scan.
+---
+(limited to 'grub-core/fs/zfs')
+
+diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c
+index c8c7b97..9edac50 100644
+--- a/grub-core/fs/zfs/zfs.c
++++ b/grub-core/fs/zfs/zfs.c
+@@ -285,7 +285,7 @@ static const char *spa_feature_names[] = {
+ static int
+ check_feature(const char *name, grub_uint64_t val, struct grub_zfs_dir_ctx *ctx);
+-static int
++static grub_err_t
+ check_mos_features(dnode_phys_t *mosmdn_phys,grub_zfs_endian_t endian,struct grub_zfs_data* data );
+ static grub_err_t 
+@@ -1975,7 +1975,7 @@ dmu_read (dnode_end_t * dn, grub_uint64_t blkid, void **buf,
+                                               dn->endian) 
+           << SPA_MINBLOCKSHIFT;
+         *buf = grub_malloc (size);
+-        if (*buf)
++        if (!*buf)
+           {
+             err = grub_errno;
+             break;
+@@ -3979,7 +3979,12 @@ iterate_zap (const char *name, grub_uint64_t val, struct grub_zfs_dir_ctx *ctx)
+   dnode_end_t dn;
+   grub_memset (&info, 0, sizeof (info));
+-  dnode_get (&(ctx->data->subvol.mdn), val, 0, &dn, ctx->data);
++  err = dnode_get (&(ctx->data->subvol.mdn), val, 0, &dn, ctx->data);
++  if (err)
++    {
++      grub_print_error ();
++      return 0;
++    }
+   if (dn.dn.dn_bonustype == DMU_OT_SA)
+     {
+@@ -4200,11 +4205,11 @@ check_feature (const char *name, grub_uint64_t val,
+  *    errnum: Failure.
+  */
+                  
+-static int
++static grub_err_t
+ check_mos_features(dnode_phys_t *mosmdn_phys,grub_zfs_endian_t endian,struct grub_zfs_data* data )
+ {
+   grub_uint64_t objnum;
+-  grub_uint8_t errnum = 0;
++  grub_err_t errnum = 0;
+   dnode_end_t dn,mosmdn;
+   mzap_phys_t* mzp;
+   grub_zfs_endian_t endianzap;
+--
+cgit v0.9.0.2
diff --git a/pvepatches/zfs.c-Avoid-divisions-by-zero.patch b/pvepatches/zfs.c-Avoid-divisions-by-zero.patch
new file mode 100644 (file)
index 0000000..13ef874
--- /dev/null
@@ -0,0 +1,47 @@
+From 475bffeae67fa0f6787c33147c120b40e89b1985 Mon Sep 17 00:00:00 2001
+From: Vladimir Serbinenko <phcoder@gmail.com>
+Date: Tue, 20 Jan 2015 16:46:55 +0000
+Subject:       * grub-core/fs/zfs.c: Avoid divisions by zero.
+
+---
+(limited to 'grub-core/fs/zfs')
+
+diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c
+index cfb25c0..c943b52 100644
+--- a/grub-core/fs/zfs/zfs.c
++++ b/grub-core/fs/zfs/zfs.c
+@@ -1501,6 +1501,9 @@ read_device (grub_uint64_t offset, struct grub_zfs_device_desc *desc,
+         return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, 
+                            "raidz%d is not supported", desc->nparity);
++      if (desc->n_children <= desc->nparity || desc->n_children < 1)
++        return grub_error(GRUB_ERR_BAD_FS, "too little devices for given parity");
++
+       orig_s = (((len + (1 << desc->ashift) - 1) >> desc->ashift)
+                 + (desc->n_children - desc->nparity) - 1);
+       s = orig_s;
+@@ -2804,6 +2807,9 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
+                                         dnode_path->dn.endian)
+                      << SPA_MINBLOCKSHIFT);
++            if (blksz == 0)
++              return grub_error(GRUB_ERR_BAD_FS, "0-sized block");
++
+             sym_value = grub_malloc (sym_sz);
+             if (!sym_value)
+               return grub_errno;
+@@ -3798,6 +3804,12 @@ grub_zfs_read (grub_file_t file, char *buf, grub_size_t len)
+   blksz = grub_zfs_to_cpu16 (data->dnode.dn.dn_datablkszsec, 
+                            data->dnode.endian) << SPA_MINBLOCKSHIFT;
++  if (blksz == 0)
++    {
++      grub_error (GRUB_ERR_BAD_FS, "0-sized block");
++      return -1;
++    }
++
+   /*
+    * Entire Dnode is too big to fit into the space available.  We
+    * will need to read it in chunks.  This could be optimized to
+--
+cgit v0.9.0.2
diff --git a/pvepatches/zfs.c-fix-memory-leak.patch b/pvepatches/zfs.c-fix-memory-leak.patch
new file mode 100644 (file)
index 0000000..33394d2
--- /dev/null
@@ -0,0 +1,24 @@
+From e871994849802889af1ad26ddde68e9a12466ba1 Mon Sep 17 00:00:00 2001
+From: Andrei Borzenkov <arvidjaar@gmail.com>
+Date: Tue, 27 Jan 2015 17:52:27 +0000
+Subject: fs/zfs/zfs.c: fix memory leak.
+
+Found by: Coverity scan.
+---
+(limited to 'grub-core/fs/zfs')
+
+diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c
+index 9edac50..057b471 100644
+--- a/grub-core/fs/zfs/zfs.c
++++ b/grub-core/fs/zfs/zfs.c
+@@ -2835,6 +2835,8 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
+         if (!path_buf)
+           {
+             grub_free (oldpathbuf);
++            if (free_symval)
++              grub_free (sym_value);
+             return grub_errno;
+           }
+         grub_memcpy (path, sym_value, sym_sz);
+--
+cgit v0.9.0.2
diff --git a/pvepatches/zfscrypt-Add-missing-explicit-cast.patch b/pvepatches/zfscrypt-Add-missing-explicit-cast.patch
new file mode 100644 (file)
index 0000000..a946c90
--- /dev/null
@@ -0,0 +1,24 @@
+From 916733ea6ae90c56797d39bb41b72427da3e1e4f Mon Sep 17 00:00:00 2001
+From: Vladimir Serbinenko <phcoder@gmail.com>
+Date: Tue, 27 Jan 2015 15:35:37 +0000
+Subject: fs/zfscrypt: Add missing explicit cast.
+
+Found by: Coverity scan.
+---
+(limited to 'grub-core/fs/zfs')
+
+diff --git a/grub-core/fs/zfs/zfscrypt.c b/grub-core/fs/zfs/zfscrypt.c
+index 88dae72..91a0af6 100644
+--- a/grub-core/fs/zfs/zfscrypt.c
++++ b/grub-core/fs/zfs/zfscrypt.c
+@@ -238,7 +238,7 @@ grub_gcm_decrypt (grub_crypto_cipher_handle_t cipher,
+       grub_crypto_xor (out + 16 * i, in + 16 * i, mul, csize);
+     }
+   for (j = 0; j < 8; j++)
+-    mac[15 - j] ^= ((psize * 8) >> (8 * j));
++    mac[15 - j] ^= ((((grub_uint64_t) psize) * 8) >> (8 * j));
+   grub_gcm_mul (mac, h);
+   if (mac_out)
+--
+cgit v0.9.0.2
diff --git a/pvepatches/zfsinfo.c-memory-leak-in-print_vdev_info.patch b/pvepatches/zfsinfo.c-memory-leak-in-print_vdev_info.patch
new file mode 100644 (file)
index 0000000..ff9ab8f
--- /dev/null
@@ -0,0 +1,28 @@
+From 03d79a878ba04db2cfbbe05564728748de0f6a2f Mon Sep 17 00:00:00 2001
+From: Andrei Borzenkov <arvidjaar@gmail.com>
+Date: Mon, 01 Dec 2014 17:54:12 +0000
+Subject: grub-core/fs/zfs/zfsinfo.c: memory leak in print_vdev_info
+
+CID: 73635
+---
+(limited to 'grub-core/fs/zfs')
+
+diff --git a/grub-core/fs/zfs/zfsinfo.c b/grub-core/fs/zfs/zfsinfo.c
+index c96bf21..c8a28ac 100644
+--- a/grub-core/fs/zfs/zfsinfo.c
++++ b/grub-core/fs/zfs/zfsinfo.c
+@@ -130,10 +130,12 @@ print_vdev_info (char *nvlist, int tab)
+       grub_free (bootpath);
+       grub_free (devid);
+       grub_free (path);
++      grub_free (type);
+       return GRUB_ERR_NONE;
+     }
+   char is_mirror=(grub_strcmp(type,VDEV_TYPE_MIRROR) == 0);
+   char is_raidz=(grub_strcmp(type,VDEV_TYPE_RAIDZ) == 0);
++  grub_free (type);
+   if (is_mirror || is_raidz)
+     {
+--
+cgit v0.9.0.2