/* check value type */
        switch (xattr_data->type) {
        case EVM_XATTR_HMAC:
-               if (xattr_len != sizeof(struct evm_ima_xattr_data)) {
+               if (xattr_len != sizeof(struct evm_xattr)) {
                        evm_status = INTEGRITY_FAIL;
                        goto out;
                }
                                   xattr_value_len, &digest);
                if (rc)
                        break;
-               rc = crypto_memneq(xattr_data->digest, digest.digest,
+               rc = crypto_memneq(xattr_data->data, digest.digest,
                                   SHA1_DIGEST_SIZE);
                if (rc)
                        rc = -EINVAL;
                                 const struct xattr *lsm_xattr,
                                 struct xattr *evm_xattr)
 {
-       struct evm_ima_xattr_data *xattr_data;
+       struct evm_xattr *xattr_data;
        int rc;
 
        if (!evm_key_loaded() || !evm_protected_xattr(lsm_xattr->name))
        if (!xattr_data)
                return -ENOMEM;
 
-       xattr_data->type = EVM_XATTR_HMAC;
+       xattr_data->data.type = EVM_XATTR_HMAC;
        rc = evm_init_hmac(inode, lsm_xattr, xattr_data->digest);
        if (rc < 0)
                goto out;
 
                return sig->hash_algo;
                break;
        case IMA_XATTR_DIGEST_NG:
-               ret = xattr_value->digest[0];
+               /* first byte contains algorithm id */
+               ret = xattr_value->data[0];
                if (ret < HASH_ALGO__LAST)
                        return ret;
                break;
                /* this is for backward compatibility */
                if (xattr_len == 21) {
                        unsigned int zero = 0;
-                       if (!memcmp(&xattr_value->digest[16], &zero, 4))
+                       if (!memcmp(&xattr_value->data[16], &zero, 4))
                                return HASH_ALGO_MD5;
                        else
                                return HASH_ALGO_SHA1;
                        /* xattr length may be longer. md5 hash in previous
                           version occupied 20 bytes in xattr, instead of 16
                         */
-                       rc = memcmp(&xattr_value->digest[hash_start],
+                       rc = memcmp(&xattr_value->data[hash_start],
                                    iint->ima_hash->digest,
                                    iint->ima_hash->length);
                else
 
 
 struct evm_ima_xattr_data {
        u8 type;
+       u8 data[];
+} __packed;
+
+/* Only used in the EVM HMAC code. */
+struct evm_xattr {
+       struct evm_ima_xattr_data data;
        u8 digest[SHA1_DIGEST_SIZE];
 } __packed;