]> granicus.if.org Git - zfs/commitdiff
Fix bounds check in zio_crypt_do_objset_hmacs
authorTom Caputi <tcaputi@datto.com>
Thu, 22 Feb 2018 16:50:14 +0000 (11:50 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 22 Feb 2018 16:50:14 +0000 (08:50 -0800)
The current bounds check in zio_crypt_do_objset_hmacs() does not
properly handle the possible sizes of the objset_phys_t and
can therefore read outside the buffer's memory. If that memory
happened to match what the check was actually looking for, the
objset would fail to be owned, complaining that the MAC was
invalid.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #7210

module/zfs/zio_crypt.c

index 155bce9fb433f5de514d5f0885ecb9cafc7e8565..d0b39a3f206ce2ae0764ad332f52f50ecd8dd0ca 100644 (file)
@@ -1196,13 +1196,17 @@ zio_crypt_do_objset_hmacs(zio_crypt_key_t *key, void *data, uint_t datalen,
        bcopy(raw_portable_mac, portable_mac, ZIO_OBJSET_MAC_LEN);
 
        /*
-        * The local MAC protects the user and group accounting. If these
-        * objects are not present, the local MAC is zeroed out.
+        * The local MAC protects the user, group and project accounting.
+        * If these objects are not present, the local MAC is zeroed out.
         */
-       if (datalen >= OBJSET_PHYS_SIZE_V2 &&
+       if ((datalen >= OBJSET_PHYS_SIZE_V3 &&
            osp->os_userused_dnode.dn_type == DMU_OT_NONE &&
            osp->os_groupused_dnode.dn_type == DMU_OT_NONE &&
-           osp->os_projectused_dnode.dn_type == DMU_OT_NONE) {
+           osp->os_projectused_dnode.dn_type == DMU_OT_NONE) ||
+           (datalen >= OBJSET_PHYS_SIZE_V2 &&
+           osp->os_userused_dnode.dn_type == DMU_OT_NONE &&
+           osp->os_groupused_dnode.dn_type == DMU_OT_NONE) ||
+           (datalen <= OBJSET_PHYS_SIZE_V1)) {
                bzero(local_mac, ZIO_OBJSET_MAC_LEN);
                return (0);
        }