aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/cifsacl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs/cifsacl.c')
-rw-r--r--fs/cifs/cifsacl.c25
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
76cifs_idmap_key_destroy(struct key *key) 75cifs_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
82static struct key_type cifs_idmap_key_type = { 81static 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;