|
@@ -224,6 +224,56 @@ sid_to_str(struct cifs_sid *sidptr, char *sidstr)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * if the two SIDs (roughly equivalent to a UUID for a user or group) are
|
|
|
+ * the same returns zero, if they do not match returns non-zero.
|
|
|
+ */
|
|
|
+static int
|
|
|
+compare_sids(const struct cifs_sid *ctsid, const struct cifs_sid *cwsid)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ int num_subauth, num_sat, num_saw;
|
|
|
+
|
|
|
+ if ((!ctsid) || (!cwsid))
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ /* compare the revision */
|
|
|
+ if (ctsid->revision != cwsid->revision) {
|
|
|
+ if (ctsid->revision > cwsid->revision)
|
|
|
+ return 1;
|
|
|
+ else
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* compare all of the six auth values */
|
|
|
+ for (i = 0; i < NUM_AUTHS; ++i) {
|
|
|
+ if (ctsid->authority[i] != cwsid->authority[i]) {
|
|
|
+ if (ctsid->authority[i] > cwsid->authority[i])
|
|
|
+ return 1;
|
|
|
+ else
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* compare all of the subauth values if any */
|
|
|
+ num_sat = ctsid->num_subauth;
|
|
|
+ num_saw = cwsid->num_subauth;
|
|
|
+ num_subauth = num_sat < num_saw ? num_sat : num_saw;
|
|
|
+ if (num_subauth) {
|
|
|
+ for (i = 0; i < num_subauth; ++i) {
|
|
|
+ if (ctsid->sub_auth[i] != cwsid->sub_auth[i]) {
|
|
|
+ if (le32_to_cpu(ctsid->sub_auth[i]) >
|
|
|
+ le32_to_cpu(cwsid->sub_auth[i]))
|
|
|
+ return 1;
|
|
|
+ else
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0; /* sids compare/match */
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
cifs_copy_sid(struct cifs_sid *dst, const struct cifs_sid *src)
|
|
|
{
|
|
@@ -630,54 +680,6 @@ cifs_destroy_idmaptrees(void)
|
|
|
spin_unlock(&gidsidlock);
|
|
|
}
|
|
|
|
|
|
-/* if the two SIDs (roughly equivalent to a UUID for a user or group) are
|
|
|
- the same returns 1, if they do not match returns 0 */
|
|
|
-int compare_sids(const struct cifs_sid *ctsid, const struct cifs_sid *cwsid)
|
|
|
-{
|
|
|
- int i;
|
|
|
- int num_subauth, num_sat, num_saw;
|
|
|
-
|
|
|
- if ((!ctsid) || (!cwsid))
|
|
|
- return 1;
|
|
|
-
|
|
|
- /* compare the revision */
|
|
|
- if (ctsid->revision != cwsid->revision) {
|
|
|
- if (ctsid->revision > cwsid->revision)
|
|
|
- return 1;
|
|
|
- else
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- /* compare all of the six auth values */
|
|
|
- for (i = 0; i < NUM_AUTHS; ++i) {
|
|
|
- if (ctsid->authority[i] != cwsid->authority[i]) {
|
|
|
- if (ctsid->authority[i] > cwsid->authority[i])
|
|
|
- return 1;
|
|
|
- else
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* compare all of the subauth values if any */
|
|
|
- num_sat = ctsid->num_subauth;
|
|
|
- num_saw = cwsid->num_subauth;
|
|
|
- num_subauth = num_sat < num_saw ? num_sat : num_saw;
|
|
|
- if (num_subauth) {
|
|
|
- for (i = 0; i < num_subauth; ++i) {
|
|
|
- if (ctsid->sub_auth[i] != cwsid->sub_auth[i]) {
|
|
|
- if (le32_to_cpu(ctsid->sub_auth[i]) >
|
|
|
- le32_to_cpu(cwsid->sub_auth[i]))
|
|
|
- return 1;
|
|
|
- else
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return 0; /* sids compare/match */
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
/* copy ntsd, owner sid, and group sid from a security descriptor to another */
|
|
|
static void copy_sec_desc(const struct cifs_ntsd *pntsd,
|
|
|
struct cifs_ntsd *pnntsd, __u32 sidsoffset)
|