diff options
author | Steve French <sfrench@us.ibm.com> | 2007-10-16 14:40:37 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2007-10-16 14:40:37 -0400 |
commit | af6f4612fdfd782c6d35272836a2b97e7e5b790e (patch) | |
tree | 6456435d2c845c43b0094473c6248ab59e7284b3 | |
parent | 016ec75f1a0c0e765fce65d794569979104f031d (diff) |
[CIFS] Fix some endianness problems in new acl code
Signed-off-by: Steve French <sfrench@us.ibm.com>
-rw-r--r-- | fs/cifs/cifsacl.c | 28 | ||||
-rw-r--r-- | fs/cifs/cifsacl.h | 23 | ||||
-rw-r--r-- | fs/cifs/cifssmb.c | 2 |
3 files changed, 26 insertions, 27 deletions
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index 601587724f9d..4735e9b47590 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 32 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
33 | 33 | ||
34 | struct cifs_wksid wksidarr[NUM_WK_SIDS] = { | 34 | static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { |
35 | {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, | 35 | {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, |
36 | {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, | 36 | {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, |
37 | {{1, 1, {0, 0, 0, 0, 0, 5}, {11, 0, 0, 0, 0} }, "net-users"}, | 37 | {{1, 1, {0, 0, 0, 0, 0, 5}, {11, 0, 0, 0, 0} }, "net-users"}, |
@@ -192,14 +192,15 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl) | |||
192 | /* BB need to add parm so we can store the SID BB */ | 192 | /* BB need to add parm so we can store the SID BB */ |
193 | 193 | ||
194 | /* validate that we do not go past end of acl */ | 194 | /* validate that we do not go past end of acl */ |
195 | if (end_of_acl < (char *)pdacl + pdacl->size) { | 195 | if (end_of_acl < (char *)pdacl + le16_to_cpu(pdacl->size)) { |
196 | cERROR(1, ("ACL too small to parse DACL")); | 196 | cERROR(1, ("ACL too small to parse DACL")); |
197 | return; | 197 | return; |
198 | } | 198 | } |
199 | 199 | ||
200 | #ifdef CONFIG_CIFS_DEBUG2 | 200 | #ifdef CONFIG_CIFS_DEBUG2 |
201 | cFYI(1, ("DACL revision %d size %d num aces %d", | 201 | cFYI(1, ("DACL revision %d size %d num aces %d", |
202 | pdacl->revision, pdacl->size, pdacl->num_aces)); | 202 | le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size), |
203 | le32_to_cpu(pdacl->num_aces))); | ||
203 | #endif | 204 | #endif |
204 | 205 | ||
205 | acl_base = (char *)pdacl; | 206 | acl_base = (char *)pdacl; |
@@ -255,7 +256,6 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl) | |||
255 | 256 | ||
256 | static int parse_sid(struct cifs_sid *psid, char *end_of_acl) | 257 | static int parse_sid(struct cifs_sid *psid, char *end_of_acl) |
257 | { | 258 | { |
258 | int num_subauth; | ||
259 | 259 | ||
260 | /* BB need to add parm so we can store the SID BB */ | 260 | /* BB need to add parm so we can store the SID BB */ |
261 | 261 | ||
@@ -265,14 +265,13 @@ static int parse_sid(struct cifs_sid *psid, char *end_of_acl) | |||
265 | return -EINVAL; | 265 | return -EINVAL; |
266 | } | 266 | } |
267 | 267 | ||
268 | num_subauth = cpu_to_le32(psid->num_subauth); | 268 | if (psid->num_subauth) { |
269 | if (num_subauth) { | ||
270 | #ifdef CONFIG_CIFS_DEBUG2 | 269 | #ifdef CONFIG_CIFS_DEBUG2 |
271 | int i; | 270 | int i; |
272 | cFYI(1, ("SID revision %d num_auth %d First subauth 0x%x", | 271 | cFYI(1, ("SID revision %d num_auth %d First subauth 0x%x", |
273 | psid->revision, psid->num_subauth, psid->sub_auth[0])); | 272 | psid->revision, psid->num_subauth, psid->sub_auth[0])); |
274 | 273 | ||
275 | for (i = 0; i < num_subauth; ++i) { | 274 | for (i = 0; i < psid->num_subauth; i++) { |
276 | cFYI(1, ("SID sub_auth[%d]: 0x%x ", i, | 275 | cFYI(1, ("SID sub_auth[%d]: 0x%x ", i, |
277 | le32_to_cpu(psid->sub_auth[i]))); | 276 | le32_to_cpu(psid->sub_auth[i]))); |
278 | } | 277 | } |
@@ -280,7 +279,7 @@ static int parse_sid(struct cifs_sid *psid, char *end_of_acl) | |||
280 | /* BB add length check to make sure that we do not have huge | 279 | /* BB add length check to make sure that we do not have huge |
281 | num auths and therefore go off the end */ | 280 | num auths and therefore go off the end */ |
282 | cFYI(1, ("RID 0x%x", | 281 | cFYI(1, ("RID 0x%x", |
283 | le32_to_cpu(psid->sub_auth[num_subauth-1]))); | 282 | le32_to_cpu(psid->sub_auth[psid->num_subauth-1]))); |
284 | #endif | 283 | #endif |
285 | } | 284 | } |
286 | 285 | ||
@@ -297,17 +296,18 @@ int parse_sec_desc(struct cifs_ntsd *pntsd, int acl_len) | |||
297 | char *end_of_acl = ((char *)pntsd) + acl_len; | 296 | char *end_of_acl = ((char *)pntsd) + acl_len; |
298 | 297 | ||
299 | owner_sid_ptr = (struct cifs_sid *)((char *)pntsd + | 298 | owner_sid_ptr = (struct cifs_sid *)((char *)pntsd + |
300 | cpu_to_le32(pntsd->osidoffset)); | 299 | le32_to_cpu(pntsd->osidoffset)); |
301 | group_sid_ptr = (struct cifs_sid *)((char *)pntsd + | 300 | group_sid_ptr = (struct cifs_sid *)((char *)pntsd + |
302 | cpu_to_le32(pntsd->gsidoffset)); | 301 | le32_to_cpu(pntsd->gsidoffset)); |
303 | dacl_ptr = (struct cifs_acl *)((char *)pntsd + | 302 | dacl_ptr = (struct cifs_acl *)((char *)pntsd + |
304 | cpu_to_le32(pntsd->dacloffset)); | 303 | le32_to_cpu(pntsd->dacloffset)); |
305 | #ifdef CONFIG_CIFS_DEBUG2 | 304 | #ifdef CONFIG_CIFS_DEBUG2 |
306 | cFYI(1, ("revision %d type 0x%x ooffset 0x%x goffset 0x%x " | 305 | cFYI(1, ("revision %d type 0x%x ooffset 0x%x goffset 0x%x " |
307 | "sacloffset 0x%x dacloffset 0x%x", | 306 | "sacloffset 0x%x dacloffset 0x%x", |
308 | pntsd->revision, pntsd->type, | 307 | pntsd->revision, pntsd->type, le32_to_cpu(pntsd->osidoffset), |
309 | pntsd->osidoffset, pntsd->gsidoffset, pntsd->sacloffset, | 308 | le32_to_cpu(pntsd->gsidoffset), |
310 | pntsd->dacloffset)); | 309 | le32_to_cpu(pntsd->sacloffset), |
310 | le32_to_cpu(pntsd->dacloffset)); | ||
311 | #endif | 311 | #endif |
312 | rc = parse_sid(owner_sid_ptr, end_of_acl); | 312 | rc = parse_sid(owner_sid_ptr, end_of_acl); |
313 | if (rc) | 313 | if (rc) |
diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h index 0362cd11f03e..fa01053fc5fa 100644 --- a/fs/cifs/cifsacl.h +++ b/fs/cifs/cifsacl.h | |||
@@ -27,25 +27,25 @@ | |||
27 | #define SIDNAMELENGTH 20 /* long enough for the ones we care about */ | 27 | #define SIDNAMELENGTH 20 /* long enough for the ones we care about */ |
28 | 28 | ||
29 | struct cifs_ntsd { | 29 | struct cifs_ntsd { |
30 | __u16 revision; /* revision level */ | 30 | __le16 revision; /* revision level */ |
31 | __u16 type; | 31 | __le16 type; |
32 | __u32 osidoffset; | 32 | __le32 osidoffset; |
33 | __u32 gsidoffset; | 33 | __le32 gsidoffset; |
34 | __u32 sacloffset; | 34 | __le32 sacloffset; |
35 | __u32 dacloffset; | 35 | __le32 dacloffset; |
36 | } __attribute__((packed)); | 36 | } __attribute__((packed)); |
37 | 37 | ||
38 | struct cifs_sid { | 38 | struct cifs_sid { |
39 | __u8 revision; /* revision level */ | 39 | __u8 revision; /* revision level */ |
40 | __u8 num_subauth; | 40 | __u8 num_subauth; |
41 | __u8 authority[6]; | 41 | __u8 authority[6]; |
42 | __u32 sub_auth[5]; /* sub_auth[num_subauth] */ | 42 | __le32 sub_auth[5]; /* sub_auth[num_subauth] */ /* BB FIXME endianness BB */ |
43 | } __attribute__((packed)); | 43 | } __attribute__((packed)); |
44 | 44 | ||
45 | struct cifs_acl { | 45 | struct cifs_acl { |
46 | __u16 revision; /* revision level */ | 46 | __le16 revision; /* revision level */ |
47 | __u16 size; | 47 | __le16 size; |
48 | __u32 num_aces; | 48 | __le32 num_aces; |
49 | } __attribute__((packed)); | 49 | } __attribute__((packed)); |
50 | 50 | ||
51 | struct cifs_ntace { /* first part of ACE which contains perms */ | 51 | struct cifs_ntace { /* first part of ACE which contains perms */ |
@@ -59,7 +59,7 @@ struct cifs_ace { /* last part of ACE which includes user info */ | |||
59 | __u8 revision; /* revision level */ | 59 | __u8 revision; /* revision level */ |
60 | __u8 num_subauth; | 60 | __u8 num_subauth; |
61 | __u8 authority[6]; | 61 | __u8 authority[6]; |
62 | __u32 sub_auth[5]; | 62 | __le32 sub_auth[5]; |
63 | } __attribute__((packed)); | 63 | } __attribute__((packed)); |
64 | 64 | ||
65 | struct cifs_wksid { | 65 | struct cifs_wksid { |
@@ -69,7 +69,6 @@ struct cifs_wksid { | |||
69 | 69 | ||
70 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 70 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
71 | 71 | ||
72 | extern struct cifs_wksid wksidarr[NUM_WK_SIDS]; | ||
73 | extern int match_sid(struct cifs_sid *); | 72 | extern int match_sid(struct cifs_sid *); |
74 | extern int compare_sids(struct cifs_sid *, struct cifs_sid *); | 73 | extern int compare_sids(struct cifs_sid *, struct cifs_sid *); |
75 | 74 | ||
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 14dabbbd8134..d22af63e8f1f 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -3121,7 +3121,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
3121 | 3121 | ||
3122 | /* BB check that data area is minimum length and as big as acl_len */ | 3122 | /* BB check that data area is minimum length and as big as acl_len */ |
3123 | 3123 | ||
3124 | acl_len = le32_to_cpu(*(__le32 *)parm); | 3124 | acl_len = le32_to_cpu(*parm); |
3125 | /* BB check if (acl_len > bufsize) */ | 3125 | /* BB check if (acl_len > bufsize) */ |
3126 | 3126 | ||
3127 | parse_sec_desc(psec_desc, acl_len); | 3127 | parse_sec_desc(psec_desc, acl_len); |