xref: /netbsd-src/sys/compat/common/uipc_usrreq_70.c (revision 8a031a1d1e0aac23d43015c71ae6350b917c8347)
1*8a031a1dSpgoyette /*	$NetBSD: uipc_usrreq_70.c,v 1.5 2019/12/12 02:15:42 pgoyette Exp $	*/
2bb67ec8fSroy 
3bb67ec8fSroy /*-
4bb67ec8fSroy  * Copyright (c) 2016 The NetBSD Foundation, Inc.
5bb67ec8fSroy  * All rights reserved.
6bb67ec8fSroy  *
7bb67ec8fSroy  * This code is derived from software contributed to The NetBSD Foundation
8bb67ec8fSroy  * by Roy Marples.
9bb67ec8fSroy  *
10bb67ec8fSroy  * Redistribution and use in source and binary forms, with or without
11bb67ec8fSroy  * modification, are permitted provided that the following conditions
12bb67ec8fSroy  * are met:
13bb67ec8fSroy  * 1. Redistributions of source code must retain the above copyright
14bb67ec8fSroy  *    notice, this list of conditions and the following disclaimer.
15bb67ec8fSroy  * 2. Redistributions in binary form must reproduce the above copyright
16bb67ec8fSroy  *    notice, this list of conditions and the following disclaimer in the
17bb67ec8fSroy  *    documentation and/or other materials provided with the distribution.
18bb67ec8fSroy  *
19bb67ec8fSroy  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20bb67ec8fSroy  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21bb67ec8fSroy  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22bb67ec8fSroy  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23bb67ec8fSroy  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24bb67ec8fSroy  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25bb67ec8fSroy  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26bb67ec8fSroy  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27bb67ec8fSroy  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28bb67ec8fSroy  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29bb67ec8fSroy  * POSSIBILITY OF SUCH DAMAGE.
30bb67ec8fSroy  */
31bb67ec8fSroy 
32bb67ec8fSroy #include <sys/cdefs.h>
33*8a031a1dSpgoyette __KERNEL_RCSID(0, "$NetBSD: uipc_usrreq_70.c,v 1.5 2019/12/12 02:15:42 pgoyette Exp $");
34d91f98a8Spgoyette 
35d91f98a8Spgoyette #if defined(_KERNEL_OPT)
36d91f98a8Spgoyette #include "opt_compat_netbsd.h"
37d91f98a8Spgoyette #endif
38bb67ec8fSroy 
39bb67ec8fSroy #include <sys/param.h>
40bb67ec8fSroy #include <sys/lwp.h>
41bb67ec8fSroy #include <sys/socket.h>
42bb67ec8fSroy #include <sys/socketvar.h>
43bb67ec8fSroy #include <sys/unpcb.h>
44bb67ec8fSroy #include <sys/mbuf.h>
45bb67ec8fSroy #include <sys/kauth.h>
46d91f98a8Spgoyette #include <sys/compat_stub.h>
47bb67ec8fSroy 
48bb67ec8fSroy #include <compat/sys/socket.h>
49bb67ec8fSroy 
50bb67ec8fSroy struct mbuf *
compat_70_unp_addsockcred(struct lwp * l,struct mbuf * control)51bb67ec8fSroy compat_70_unp_addsockcred(struct lwp *l, struct mbuf *control)
52bb67ec8fSroy {
53bb67ec8fSroy 	struct sockcred70 *sc;
54bb67ec8fSroy 	struct mbuf *m;
55bb67ec8fSroy 	void *p;
56bb67ec8fSroy 
57bb67ec8fSroy 	m = sbcreatecontrol1(&p, SOCKCRED70SIZE(kauth_cred_ngroups(l->l_cred)),
58bb67ec8fSroy 		SCM_OCREDS, SOL_SOCKET, M_WAITOK);
59d91f98a8Spgoyette 	if (m == NULL) {
60bb67ec8fSroy 		return control;
61d91f98a8Spgoyette 	}
62bb67ec8fSroy 
63bb67ec8fSroy 	sc = p;
64bb67ec8fSroy 	sc->sc_uid = kauth_cred_getuid(l->l_cred);
65bb67ec8fSroy 	sc->sc_euid = kauth_cred_geteuid(l->l_cred);
66bb67ec8fSroy 	sc->sc_gid = kauth_cred_getgid(l->l_cred);
67bb67ec8fSroy 	sc->sc_egid = kauth_cred_getegid(l->l_cred);
68bb67ec8fSroy 	sc->sc_ngroups = kauth_cred_ngroups(l->l_cred);
69bb67ec8fSroy 
70bb67ec8fSroy 	for (int i = 0; i < sc->sc_ngroups; i++)
71bb67ec8fSroy 		sc->sc_groups[i] = kauth_cred_group(l->l_cred, i);
72bb67ec8fSroy 
73bb67ec8fSroy 	return m_add(control, m);
74bb67ec8fSroy }
75d91f98a8Spgoyette 
76d91f98a8Spgoyette void
uipc_usrreq_70_init(void)77d91f98a8Spgoyette uipc_usrreq_70_init(void)
78d91f98a8Spgoyette {
79d91f98a8Spgoyette 
80*8a031a1dSpgoyette 	MODULE_HOOK_SET(uipc_unp_70_hook, compat_70_unp_addsockcred);
81d91f98a8Spgoyette }
82d91f98a8Spgoyette 
83d91f98a8Spgoyette void
uipc_usrreq_70_fini(void)84d91f98a8Spgoyette uipc_usrreq_70_fini(void)
85d91f98a8Spgoyette {
86d91f98a8Spgoyette 
878c2f80f1Spgoyette 	MODULE_HOOK_UNSET(uipc_unp_70_hook);
88d91f98a8Spgoyette }
89