Commit 36f87ee7 authored by Jeff Layton's avatar Jeff Layton Committed by Steve French

cifs: make cifs_copy_sid handle a source sid with variable size subauth arrays

...and lift the restriction in id_to_sid upcall that the size must be
at least as big as a full cifs_sid.
Reviewed-by: default avatarShirish Pargaonkar <shirishpargaonkar@gmail.com>
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <smfrench@gmail.com>
parent 436bb435
...@@ -277,8 +277,14 @@ compare_sids(const struct cifs_sid *ctsid, const struct cifs_sid *cwsid) ...@@ -277,8 +277,14 @@ compare_sids(const struct cifs_sid *ctsid, const struct cifs_sid *cwsid)
static void static void
cifs_copy_sid(struct cifs_sid *dst, const struct cifs_sid *src) cifs_copy_sid(struct cifs_sid *dst, const struct cifs_sid *src)
{ {
memcpy(dst, src, sizeof(*dst)); int i;
dst->revision = src->revision;
dst->num_subauth = min_t(u8, src->num_subauth, NUM_SUBAUTHS); dst->num_subauth = min_t(u8, src->num_subauth, NUM_SUBAUTHS);
for (i = 0; i < NUM_AUTHS; ++i)
dst->authority[i] = src->authority[i];
for (i = 0; i < dst->num_subauth; ++i)
dst->sub_auth[i] = src->sub_auth[i];
} }
static void static void
...@@ -427,7 +433,7 @@ id_to_sid(unsigned long cid, uint sidtype, struct cifs_sid *ssid) ...@@ -427,7 +433,7 @@ id_to_sid(unsigned long cid, uint sidtype, struct cifs_sid *ssid)
if (IS_ERR(sidkey)) { if (IS_ERR(sidkey)) {
rc = -EINVAL; rc = -EINVAL;
cFYI(1, "%s: Can't map and id to a SID", __func__); cFYI(1, "%s: Can't map and id to a SID", __func__);
} else if (sidkey->datalen < sizeof(struct cifs_sid)) { } else if (sidkey->datalen < CIFS_SID_BASE_SIZE) {
rc = -EIO; rc = -EIO;
cFYI(1, "%s: Downcall contained malformed key " cFYI(1, "%s: Downcall contained malformed key "
"(datalen=%hu)", __func__, sidkey->datalen); "(datalen=%hu)", __func__, sidkey->datalen);
......
...@@ -64,6 +64,9 @@ struct cifs_sid { ...@@ -64,6 +64,9 @@ struct cifs_sid {
__le32 sub_auth[NUM_SUBAUTHS]; /* sub_auth[num_subauth] */ __le32 sub_auth[NUM_SUBAUTHS]; /* sub_auth[num_subauth] */
} __attribute__((packed)); } __attribute__((packed));
/* size of a struct cifs_sid, sans sub_auth array */
#define CIFS_SID_BASE_SIZE (1 + 1 + NUM_AUTHS)
struct cifs_acl { struct cifs_acl {
__le16 revision; /* revision level */ __le16 revision; /* revision level */
__le16 size; __le16 size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment