l2tp: pass tunnel pointer to ->session_create()
[pandora-kernel.git] / net / core / scm.c
index 811b53f..9adabed 100644 (file)
@@ -80,6 +80,7 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
                *fplp = fpl;
                fpl->count = 0;
                fpl->max = SCM_MAX_FD;
+               fpl->user = NULL;
        }
        fpp = &fpl->fp[fpl->count];
 
@@ -100,6 +101,10 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
                *fpp++ = file;
                fpl->count++;
        }
+
+       if (!fpl->user)
+               fpl->user = get_uid(current_user());
+
        return num;
 }
 
@@ -124,6 +129,7 @@ void __scm_destroy(struct scm_cookie *scm)
                                list_del(&fpl->list);
                                for (i=fpl->count-1; i>=0; i--)
                                        fput(fpl->fp[i]);
+                               free_uid(fpl->user);
                                kfree(fpl);
                        }
 
@@ -173,7 +179,7 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)
                        if (err)
                                goto error;
 
-                       if (pid_vnr(p->pid) != p->creds.pid) {
+                       if (!p->pid || pid_vnr(p->pid) != p->creds.pid) {
                                struct pid *pid;
                                err = -ESRCH;
                                pid = find_get_pid(p->creds.pid);
@@ -183,8 +189,9 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)
                                p->pid = pid;
                        }
 
-                       if ((p->cred->euid != p->creds.uid) ||
-                               (p->cred->egid != p->creds.gid)) {
+                       if (!p->cred ||
+                           (p->cred->euid != p->creds.uid) ||
+                           (p->cred->egid != p->creds.gid)) {
                                struct cred *cred;
                                err = -ENOMEM;
                                cred = prepare_creds();
@@ -193,7 +200,8 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)
 
                                cred->uid = cred->euid = p->creds.uid;
                                cred->gid = cred->egid = p->creds.gid;
-                               put_cred(p->cred);
+                               if (p->cred)
+                                       put_cred(p->cred);
                                p->cred = cred;
                        }
                        break;
@@ -309,6 +317,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm)
                        err = put_user(cmlen, &cm->cmsg_len);
                if (!err) {
                        cmlen = CMSG_SPACE(i*sizeof(int));
+                       if (msg->msg_controllen < cmlen)
+                               cmlen = msg->msg_controllen;
                        msg->msg_control += cmlen;
                        msg->msg_controllen -= cmlen;
                }
@@ -338,6 +348,7 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl)
                for (i = 0; i < fpl->count; i++)
                        get_file(fpl->fp[i]);
                new_fpl->max = new_fpl->count;
+               new_fpl->user = get_uid(fpl->user);
        }
        return new_fpl;
 }