cifs.upcall: clean up flag handling
authorJeff Layton <jlayton@redhat.com>
Fri, 14 Aug 2009 11:59:50 +0000 (07:59 -0400)
committerJeff Layton <jlayton@redhat.com>
Fri, 14 Aug 2009 11:59:50 +0000 (07:59 -0400)
Add a new stack var to hold the flags returned by the decoder routine
so that we don't need to worry so much about preserving "rc".

With this, we can drop privs before trying to find the location of
the credcache.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
client/cifs.upcall.c

index e60fb50e5770c2090418d7549d0593f56d11bc9d..904ec8e1c1c35ad8d67456b0ca2b6fe53e2d6ae4 100644 (file)
@@ -164,7 +164,7 @@ static struct decoded_args {
        sectype_t       sec;
 };
 
-static int
+static unsigned int
 decode_key_description(const char *desc, struct decoded_args *arg)
 {
        int retval = 0;
@@ -302,6 +302,7 @@ int main(const int argc, char *const argv[])
        DATA_BLOB sess_key = data_blob_null;
        key_serial_t key = 0;
        size_t datalen;
+       unsigned int have;
        long rc = 1;
        int c;
        char *buf, *princ, *ccname = NULL;
@@ -355,15 +356,14 @@ int main(const int argc, char *const argv[])
                goto out;
        }
 
-       rc = decode_key_description(buf, &arg);
-       if ((rc & DKD_MUSTHAVE_SET) != DKD_MUSTHAVE_SET) {
+       have = decode_key_description(buf, &arg);
+       SAFE_FREE(buf);
+       if ((have & DKD_MUSTHAVE_SET) != DKD_MUSTHAVE_SET) {
                syslog(LOG_ERR, "unable to get necessary params from key "
-                               "description (0x%x)", rc);
+                               "description (0x%x)", have);
                rc = 1;
-               SAFE_FREE(buf);
                goto out;
        }
-       SAFE_FREE(buf);
 
        if (arg.ver > CIFS_SPNEGO_UPCALL_VERSION) {
                syslog(LOG_ERR, "incompatible kernel upcall version: 0x%x",
@@ -372,10 +372,7 @@ int main(const int argc, char *const argv[])
                goto out;
        }
 
-       if (rc & DKD_HAVE_PID)
-               ccname = get_krb5_ccname(arg.pid);
-
-       if (rc & DKD_HAVE_UID) {
+       if (have & DKD_HAVE_UID) {
                rc = setuid(arg.uid);
                if (rc == -1) {
                        syslog(LOG_ERR, "setuid: %s", strerror(errno));
@@ -383,6 +380,9 @@ int main(const int argc, char *const argv[])
                }
        }
 
+       if (have & DKD_HAVE_PID)
+               ccname = get_krb5_ccname(arg.pid);
+
        // do mech specific authorization
        switch (arg.sec) {
        case MS_KRB5: