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