diff options
author | Steve French <sfrench@us.ibm.com> | 2007-10-17 18:50:39 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2007-10-17 18:50:39 -0400 |
commit | a750e77c21d75abd26fbbde2e104fd406566b6e5 (patch) | |
tree | d4ec933e45547926dbc02d17ea786dacdd8b24ba | |
parent | d5d18501090179d557a4ca976d1c30bfaf5de091 (diff) |
[CIFS] acl support part 4
Signed-off-by: Steve French <sfrench@us.ibm.com>
-rw-r--r-- | fs/cifs/cifsacl.c | 19 | ||||
-rw-r--r-- | fs/cifs/cifsacl.h | 9 | ||||
-rw-r--r-- | fs/cifs/cifspdu.h | 6 |
3 files changed, 25 insertions, 9 deletions
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index c46f26bcd8b2..ecd6da9e9d38 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
@@ -95,23 +95,24 @@ int match_sid(struct cifs_sid *ctsid) | |||
95 | return (-1); | 95 | return (-1); |
96 | } | 96 | } |
97 | 97 | ||
98 | 98 | /* if the two SIDs (roughly equivalent to a UUID for a user or group) are | |
99 | the same returns 1, if they do not match returns 0 */ | ||
99 | int compare_sids(struct cifs_sid *ctsid, struct cifs_sid *cwsid) | 100 | int compare_sids(struct cifs_sid *ctsid, struct cifs_sid *cwsid) |
100 | { | 101 | { |
101 | int i; | 102 | int i; |
102 | int num_subauth, num_sat, num_saw; | 103 | int num_subauth, num_sat, num_saw; |
103 | 104 | ||
104 | if ((!ctsid) || (!cwsid)) | 105 | if ((!ctsid) || (!cwsid)) |
105 | return (-1); | 106 | return (0); |
106 | 107 | ||
107 | /* compare the revision */ | 108 | /* compare the revision */ |
108 | if (ctsid->revision != cwsid->revision) | 109 | if (ctsid->revision != cwsid->revision) |
109 | return (-1); | 110 | return (0); |
110 | 111 | ||
111 | /* compare all of the six auth values */ | 112 | /* compare all of the six auth values */ |
112 | for (i = 0; i < 6; ++i) { | 113 | for (i = 0; i < 6; ++i) { |
113 | if (ctsid->authority[i] != cwsid->authority[i]) | 114 | if (ctsid->authority[i] != cwsid->authority[i]) |
114 | return (-1); | 115 | return (0); |
115 | } | 116 | } |
116 | 117 | ||
117 | /* compare all of the subauth values if any */ | 118 | /* compare all of the subauth values if any */ |
@@ -121,11 +122,11 @@ int compare_sids(struct cifs_sid *ctsid, struct cifs_sid *cwsid) | |||
121 | if (num_subauth) { | 122 | if (num_subauth) { |
122 | for (i = 0; i < num_subauth; ++i) { | 123 | for (i = 0; i < num_subauth; ++i) { |
123 | if (ctsid->sub_auth[i] != cwsid->sub_auth[i]) | 124 | if (ctsid->sub_auth[i] != cwsid->sub_auth[i]) |
124 | return (-1); | 125 | return (0); |
125 | } | 126 | } |
126 | } | 127 | } |
127 | 128 | ||
128 | return (0); /* sids compare/match */ | 129 | return (1); /* sids compare/match */ |
129 | } | 130 | } |
130 | 131 | ||
131 | 132 | ||
@@ -180,7 +181,8 @@ static void parse_ntace(struct cifs_ntace *pntace, char *end_of_acl) | |||
180 | 181 | ||
181 | 182 | ||
182 | 183 | ||
183 | static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl) | 184 | static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl, |
185 | struct cifs_sid *pownersid, struct cifs_sid pgrpsid) | ||
184 | { | 186 | { |
185 | int i; | 187 | int i; |
186 | int num_aces = 0; | 188 | int num_aces = 0; |
@@ -219,7 +221,6 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl) | |||
219 | cifscred->aces = kmalloc(num_aces * | 221 | cifscred->aces = kmalloc(num_aces * |
220 | sizeof(struct cifs_ace *), GFP_KERNEL);*/ | 222 | sizeof(struct cifs_ace *), GFP_KERNEL);*/ |
221 | 223 | ||
222 | |||
223 | for (i = 0; i < num_aces; ++i) { | 224 | for (i = 0; i < num_aces; ++i) { |
224 | ppntace[i] = (struct cifs_ntace *) | 225 | ppntace[i] = (struct cifs_ntace *) |
225 | (acl_base + acl_size); | 226 | (acl_base + acl_size); |
@@ -317,7 +318,7 @@ int parse_sec_desc(struct cifs_ntsd *pntsd, int acl_len) | |||
317 | if (rc) | 318 | if (rc) |
318 | return rc; | 319 | return rc; |
319 | 320 | ||
320 | parse_dacl(dacl_ptr, end_of_acl); | 321 | parse_dacl(dacl_ptr, end_of_acl, owner_sid_ptr, group_sid_ptr); |
321 | 322 | ||
322 | /* cifscred->uid = owner_sid_ptr->rid; | 323 | /* cifscred->uid = owner_sid_ptr->rid; |
323 | cifscred->gid = group_sid_ptr->rid; | 324 | cifscred->gid = group_sid_ptr->rid; |
diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h index fa01053fc5fa..420f87813647 100644 --- a/fs/cifs/cifsacl.h +++ b/fs/cifs/cifsacl.h | |||
@@ -23,9 +23,18 @@ | |||
23 | #define _CIFSACL_H | 23 | #define _CIFSACL_H |
24 | 24 | ||
25 | 25 | ||
26 | #define NUM_AUTHS 6 /* number of authority fields */ | ||
27 | #define NUM_SUBAUTHS 5 /* number of sub authority fields */ | ||
26 | #define NUM_WK_SIDS 7 /* number of well known sids */ | 28 | #define NUM_WK_SIDS 7 /* number of well known sids */ |
27 | #define SIDNAMELENGTH 20 /* long enough for the ones we care about */ | 29 | #define SIDNAMELENGTH 20 /* long enough for the ones we care about */ |
28 | 30 | ||
31 | #define READ_BIT 0x4 | ||
32 | #define WRITE_BIT 0x2 | ||
33 | #define EXEC_BIT 0x1 | ||
34 | |||
35 | #define UBITSHIFT 6 | ||
36 | #define GBITSHIFT 3 | ||
37 | |||
29 | struct cifs_ntsd { | 38 | struct cifs_ntsd { |
30 | __le16 revision; /* revision level */ | 39 | __le16 revision; /* revision level */ |
31 | __le16 type; | 40 | __le16 type; |
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h index d2f0cf23bbba..c41ff74e9128 100644 --- a/fs/cifs/cifspdu.h +++ b/fs/cifs/cifspdu.h | |||
@@ -215,6 +215,12 @@ | |||
215 | /* file_execute, file_read_attributes*/ | 215 | /* file_execute, file_read_attributes*/ |
216 | /* write_dac, and delete. */ | 216 | /* write_dac, and delete. */ |
217 | 217 | ||
218 | #define FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES) | ||
219 | #define FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \ | ||
220 | | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES) | ||
221 | #define FILE_EXEC_RIGHTS (FILE_EXECUTE) | ||
222 | |||
223 | |||
218 | /* | 224 | /* |
219 | * Invalid readdir handle | 225 | * Invalid readdir handle |
220 | */ | 226 | */ |