diff options
Diffstat (limited to 'net/core/scm.c')
-rw-r--r-- | net/core/scm.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/net/core/scm.c b/net/core/scm.c index b88f6f9d0b97..413cab89017d 100644 --- a/net/core/scm.c +++ b/net/core/scm.c | |||
@@ -130,6 +130,7 @@ void __scm_destroy(struct scm_cookie *scm) | |||
130 | } | 130 | } |
131 | } | 131 | } |
132 | } | 132 | } |
133 | EXPORT_SYMBOL(__scm_destroy); | ||
133 | 134 | ||
134 | int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p) | 135 | int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p) |
135 | { | 136 | { |
@@ -170,6 +171,30 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p) | |||
170 | err = scm_check_creds(&p->creds); | 171 | err = scm_check_creds(&p->creds); |
171 | if (err) | 172 | if (err) |
172 | goto error; | 173 | goto error; |
174 | |||
175 | if (pid_vnr(p->pid) != p->creds.pid) { | ||
176 | struct pid *pid; | ||
177 | err = -ESRCH; | ||
178 | pid = find_get_pid(p->creds.pid); | ||
179 | if (!pid) | ||
180 | goto error; | ||
181 | put_pid(p->pid); | ||
182 | p->pid = pid; | ||
183 | } | ||
184 | |||
185 | if ((p->cred->euid != p->creds.uid) || | ||
186 | (p->cred->egid != p->creds.gid)) { | ||
187 | struct cred *cred; | ||
188 | err = -ENOMEM; | ||
189 | cred = prepare_creds(); | ||
190 | if (!cred) | ||
191 | goto error; | ||
192 | |||
193 | cred->uid = cred->euid = p->creds.uid; | ||
194 | cred->gid = cred->egid = p->creds.uid; | ||
195 | put_cred(p->cred); | ||
196 | p->cred = cred; | ||
197 | } | ||
173 | break; | 198 | break; |
174 | default: | 199 | default: |
175 | goto error; | 200 | goto error; |
@@ -187,6 +212,7 @@ error: | |||
187 | scm_destroy(p); | 212 | scm_destroy(p); |
188 | return err; | 213 | return err; |
189 | } | 214 | } |
215 | EXPORT_SYMBOL(__scm_send); | ||
190 | 216 | ||
191 | int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data) | 217 | int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data) |
192 | { | 218 | { |
@@ -225,6 +251,7 @@ int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data) | |||
225 | out: | 251 | out: |
226 | return err; | 252 | return err; |
227 | } | 253 | } |
254 | EXPORT_SYMBOL(put_cmsg); | ||
228 | 255 | ||
229 | void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) | 256 | void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) |
230 | { | 257 | { |
@@ -294,6 +321,7 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) | |||
294 | */ | 321 | */ |
295 | __scm_destroy(scm); | 322 | __scm_destroy(scm); |
296 | } | 323 | } |
324 | EXPORT_SYMBOL(scm_detach_fds); | ||
297 | 325 | ||
298 | struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl) | 326 | struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl) |
299 | { | 327 | { |
@@ -311,9 +339,4 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl) | |||
311 | } | 339 | } |
312 | return new_fpl; | 340 | return new_fpl; |
313 | } | 341 | } |
314 | |||
315 | EXPORT_SYMBOL(__scm_destroy); | ||
316 | EXPORT_SYMBOL(__scm_send); | ||
317 | EXPORT_SYMBOL(put_cmsg); | ||
318 | EXPORT_SYMBOL(scm_detach_fds); | ||
319 | EXPORT_SYMBOL(scm_fp_dup); | 342 | EXPORT_SYMBOL(scm_fp_dup); |