summaryrefslogtreecommitdiffstats
path: root/fs/cifs/cifsacl.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2012-11-25 14:00:37 +0100
committerSteve French <smfrench@gmail.com>2012-12-05 20:13:11 +0100
commit36f87ee70f754d04e55518853e6fb30ed4732dda (patch)
tree59169a8e5ce4a3ff23a7d5e9dbaa88a3515259cb /fs/cifs/cifsacl.c
parentcifs: make compare_sids static (diff)
downloadlinux-36f87ee70f754d04e55518853e6fb30ed4732dda.tar.xz
linux-36f87ee70f754d04e55518853e6fb30ed4732dda.zip
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>
Diffstat (limited to 'fs/cifs/cifsacl.c')
-rw-r--r--fs/cifs/cifsacl.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
index 5a312eb45a92..141a944c9dfd 100644
--- a/fs/cifs/cifsacl.c
+++ b/fs/cifs/cifsacl.c
@@ -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);