diff options
Diffstat (limited to 'fs/cifs/cifsacl.c')
-rw-r--r-- | fs/cifs/cifsacl.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index 1ea780bc6376..3f93125916bf 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
@@ -58,16 +58,15 @@ cifs_idmap_key_instantiate(struct key *key, struct key_preparsed_payload *prep) | |||
58 | * dereference payload.data! | 58 | * dereference payload.data! |
59 | */ | 59 | */ |
60 | if (prep->datalen <= sizeof(key->payload)) { | 60 | if (prep->datalen <= sizeof(key->payload)) { |
61 | key->payload.value = 0; | 61 | key->payload.data[0] = NULL; |
62 | memcpy(&key->payload.value, prep->data, prep->datalen); | 62 | memcpy(&key->payload, prep->data, prep->datalen); |
63 | key->datalen = prep->datalen; | 63 | } else { |
64 | return 0; | 64 | payload = kmemdup(prep->data, prep->datalen, GFP_KERNEL); |
65 | if (!payload) | ||
66 | return -ENOMEM; | ||
67 | key->payload.data[0] = payload; | ||
65 | } | 68 | } |
66 | payload = kmemdup(prep->data, prep->datalen, GFP_KERNEL); | ||
67 | if (!payload) | ||
68 | return -ENOMEM; | ||
69 | 69 | ||
70 | key->payload.data = payload; | ||
71 | key->datalen = prep->datalen; | 70 | key->datalen = prep->datalen; |
72 | return 0; | 71 | return 0; |
73 | } | 72 | } |
@@ -76,7 +75,7 @@ static inline void | |||
76 | cifs_idmap_key_destroy(struct key *key) | 75 | cifs_idmap_key_destroy(struct key *key) |
77 | { | 76 | { |
78 | if (key->datalen > sizeof(key->payload)) | 77 | if (key->datalen > sizeof(key->payload)) |
79 | kfree(key->payload.data); | 78 | kfree(key->payload.data[0]); |
80 | } | 79 | } |
81 | 80 | ||
82 | static struct key_type cifs_idmap_key_type = { | 81 | static struct key_type cifs_idmap_key_type = { |
@@ -233,8 +232,8 @@ id_to_sid(unsigned int cid, uint sidtype, struct cifs_sid *ssid) | |||
233 | * it could be. | 232 | * it could be. |
234 | */ | 233 | */ |
235 | ksid = sidkey->datalen <= sizeof(sidkey->payload) ? | 234 | ksid = sidkey->datalen <= sizeof(sidkey->payload) ? |
236 | (struct cifs_sid *)&sidkey->payload.value : | 235 | (struct cifs_sid *)&sidkey->payload : |
237 | (struct cifs_sid *)sidkey->payload.data; | 236 | (struct cifs_sid *)sidkey->payload.data[0]; |
238 | 237 | ||
239 | ksid_size = CIFS_SID_BASE_SIZE + (ksid->num_subauth * sizeof(__le32)); | 238 | ksid_size = CIFS_SID_BASE_SIZE + (ksid->num_subauth * sizeof(__le32)); |
240 | if (ksid_size > sidkey->datalen) { | 239 | if (ksid_size > sidkey->datalen) { |
@@ -307,14 +306,14 @@ sid_to_id(struct cifs_sb_info *cifs_sb, struct cifs_sid *psid, | |||
307 | if (sidtype == SIDOWNER) { | 306 | if (sidtype == SIDOWNER) { |
308 | kuid_t uid; | 307 | kuid_t uid; |
309 | uid_t id; | 308 | uid_t id; |
310 | memcpy(&id, &sidkey->payload.value, sizeof(uid_t)); | 309 | memcpy(&id, &sidkey->payload.data[0], sizeof(uid_t)); |
311 | uid = make_kuid(&init_user_ns, id); | 310 | uid = make_kuid(&init_user_ns, id); |
312 | if (uid_valid(uid)) | 311 | if (uid_valid(uid)) |
313 | fuid = uid; | 312 | fuid = uid; |
314 | } else { | 313 | } else { |
315 | kgid_t gid; | 314 | kgid_t gid; |
316 | gid_t id; | 315 | gid_t id; |
317 | memcpy(&id, &sidkey->payload.value, sizeof(gid_t)); | 316 | memcpy(&id, &sidkey->payload.data[0], sizeof(gid_t)); |
318 | gid = make_kgid(&init_user_ns, id); | 317 | gid = make_kgid(&init_user_ns, id); |
319 | if (gid_valid(gid)) | 318 | if (gid_valid(gid)) |
320 | fgid = gid; | 319 | fgid = gid; |