The current method of trying to convert a name to a password struct and
then back to a SID is just weird. It also doesn't seem to work correctly.

Instead, look for a '\\' in the string. If there isn't one then try to
convert it directly to a SID.

If there is a '\\' or the direct-to-SID conversion didn't work, then
use wbcLookupName to do the conversion directly to a SID instead.

Also, fix the error handling. These routines return a wbcErr, so we
should use their macros to check whether it worked or not.

Signed-off-by: Jeff Layton <[email protected]>
---
 setcifsacl.c | 48 ++++++++++++++++++++++++------------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/setcifsacl.c b/setcifsacl.c
index 54d8cbc..9f748c1 100644
--- a/setcifsacl.c
+++ b/setcifsacl.c
@@ -396,30 +396,30 @@ build_fetched_aces_ret:
 static int
 verify_ace_sid(char *sidstr, struct cifs_sid *sid)
 {
-       int rc, i;
-       char *lstr;
-       struct passwd *winpswdptr;
-
-       lstr = strstr(sidstr, "\\"); /* everything before | */
-       if (lstr)
-               ++lstr;
-       else
-               lstr = sidstr;
-
-       /* Check if it is a (raw) SID (string) */
-       rc = wbcStringToSid(lstr, (struct wbcDomainSid *)sid);
-       if (!rc)
-               goto fix_endianness;
-
-       /* Check if it a name (string) which can be resolved to a SID*/
-       rc = wbcGetpwnam(lstr, &winpswdptr);
-       if (rc) {
-               printf("%s: Invalid user name: %s\n", __func__, sidstr);
-               return rc;
-       }
-       rc = wbcUidToSid(winpswdptr->pw_uid, (struct wbcDomainSid *)sid);
-       if (rc) {
-               printf("%s: Invalid user: %s\n", __func__, sidstr);
+       int i;
+       wbcErr rc;
+       char *name, *domain;
+       enum wbcSidType type;
+
+       name = strchr(sidstr, '\\');
+       if (!name) {
+               /* might be a raw string representation of SID */
+               rc = wbcStringToSid(sidstr, (struct wbcDomainSid *)sid);
+               if (WBC_ERROR_IS_OK(rc))
+                       goto fix_endianness;
+
+               domain = "";
+               name = sidstr;
+       } else {
+               domain = sidstr;
+               *name = '\0';
+               ++name;
+       }
+
+       rc = wbcLookupName(domain, name, (struct wbcDomainSid *)sid, &type);
+       if (!WBC_ERROR_IS_OK(rc)) {
+               printf("%s: Error converting %s\\%s to SID: %s\n",
+                       __func__, domain, name, wbcErrorString(rc));
                return rc;
        }
 
-- 
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to