annotate vendor/golang.org/x/sys/unix/cap_freebsd.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 // Copyright 2017 The Go Authors. All rights reserved.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 // license that can be found in the LICENSE file.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 //go:build freebsd
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 // +build freebsd
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 package unix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 "errors"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 // Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 // This is the version of CapRights this package understands. See C implementation for parallels.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 capRightsGoVersion = CAP_RIGHTS_VERSION_00
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 capArSizeMin = CAP_RIGHTS_VERSION_00 + 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 capArSizeMax = capRightsGoVersion + 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 bit2idx = []int{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 func capidxbit(right uint64) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 return int((right >> 57) & 0x1f)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 func rightToIndex(right uint64) (int, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 idx := capidxbit(right)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 if idx < 0 || idx >= len(bit2idx) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 return -2, fmt.Errorf("index for right 0x%x out of range", right)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 return bit2idx[idx], nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 func caprver(right uint64) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 return int(right >> 62)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 func capver(rights *CapRights) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 return caprver(rights.Rights[0])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 func caparsize(rights *CapRights) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 return capver(rights) + 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 // CapRightsSet sets the permissions in setrights in rights.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 func CapRightsSet(rights *CapRights, setrights []uint64) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 // This is essentially a copy of cap_rights_vset()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 if capver(rights) != CAP_RIGHTS_VERSION_00 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 return fmt.Errorf("bad rights version %d", capver(rights))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 n := caparsize(rights)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 if n < capArSizeMin || n > capArSizeMax {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 return errors.New("bad rights size")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 for _, right := range setrights {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 if caprver(right) != CAP_RIGHTS_VERSION_00 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 return errors.New("bad right version")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 i, err := rightToIndex(right)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 if i >= n {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 return errors.New("index overflow")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 if capidxbit(rights.Rights[i]) != capidxbit(right) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 return errors.New("index mismatch")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 rights.Rights[i] |= right
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 if capidxbit(rights.Rights[i]) != capidxbit(right) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 return errors.New("index mismatch (after assign)")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 // CapRightsClear clears the permissions in clearrights from rights.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 func CapRightsClear(rights *CapRights, clearrights []uint64) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 // This is essentially a copy of cap_rights_vclear()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 if capver(rights) != CAP_RIGHTS_VERSION_00 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 return fmt.Errorf("bad rights version %d", capver(rights))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 n := caparsize(rights)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 if n < capArSizeMin || n > capArSizeMax {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 return errors.New("bad rights size")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 for _, right := range clearrights {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 if caprver(right) != CAP_RIGHTS_VERSION_00 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 return errors.New("bad right version")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 i, err := rightToIndex(right)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 return err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 if i >= n {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 return errors.New("index overflow")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 if capidxbit(rights.Rights[i]) != capidxbit(right) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 return errors.New("index mismatch")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 if capidxbit(rights.Rights[i]) != capidxbit(right) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 return errors.New("index mismatch (after assign)")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 // CapRightsIsSet checks whether all the permissions in setrights are present in rights.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 // This is essentially a copy of cap_rights_is_vset()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 if capver(rights) != CAP_RIGHTS_VERSION_00 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 return false, fmt.Errorf("bad rights version %d", capver(rights))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 n := caparsize(rights)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 if n < capArSizeMin || n > capArSizeMax {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 return false, errors.New("bad rights size")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 for _, right := range setrights {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 if caprver(right) != CAP_RIGHTS_VERSION_00 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 return false, errors.New("bad right version")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 i, err := rightToIndex(right)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 return false, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 if i >= n {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 return false, errors.New("index overflow")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 if capidxbit(rights.Rights[i]) != capidxbit(right) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 return false, errors.New("index mismatch")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 if (rights.Rights[i] & right) != right {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 return false, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 return true, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 func capright(idx uint64, bit uint64) uint64 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 return ((1 << (57 + idx)) | bit)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 // CapRightsInit returns a pointer to an initialised CapRights structure filled with rights.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 // See man cap_rights_init(3) and rights(4).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 func CapRightsInit(rights []uint64) (*CapRights, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 var r CapRights
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 r.Rights[1] = capright(1, 0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 err := CapRightsSet(&r, rights)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 return &r, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 // CapRightsLimit reduces the operations permitted on fd to at most those contained in rights.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 // The capability rights on fd can never be increased by CapRightsLimit.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 // See man cap_rights_limit(2) and rights(4).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 func CapRightsLimit(fd uintptr, rights *CapRights) error {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 return capRightsLimit(int(fd), rights)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 // CapRightsGet returns a CapRights structure containing the operations permitted on fd.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 // See man cap_rights_get(3) and rights(4).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 func CapRightsGet(fd uintptr) (*CapRights, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 r, err := CapRightsInit(nil)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 err = capRightsGet(capRightsGoVersion, int(fd), r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 return r, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 }