forked from luck/tmp_suning_uos_patched
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: Shirish Pargaonkar <shirishpargaonkar@gmail.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
436bb435fc
commit
36f87ee70f
|
@ -277,8 +277,14 @@ compare_sids(const struct cifs_sid *ctsid, const struct cifs_sid *cwsid)
|
|||
static void
|
||||
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);
|
||||
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
|
||||
|
@ -427,7 +433,7 @@ id_to_sid(unsigned long cid, uint sidtype, struct cifs_sid *ssid)
|
|||
if (IS_ERR(sidkey)) {
|
||||
rc = -EINVAL;
|
||||
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;
|
||||
cFYI(1, "%s: Downcall contained malformed key "
|
||||
"(datalen=%hu)", __func__, sidkey->datalen);
|
||||
|
|
|
@ -64,6 +64,9 @@ struct cifs_sid {
|
|||
__le32 sub_auth[NUM_SUBAUTHS]; /* sub_auth[num_subauth] */
|
||||
} __attribute__((packed));
|
||||
|
||||
/* size of a struct cifs_sid, sans sub_auth array */
|
||||
#define CIFS_SID_BASE_SIZE (1 + 1 + NUM_AUTHS)
|
||||
|
||||
struct cifs_acl {
|
||||
__le16 revision; /* revision level */
|
||||
__le16 size;
|
||||
|
|
Loading…
Reference in New Issue
Block a user