Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/id.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* id -- print real and effective UIDs and GIDs | - | ||||||||||||||||||||||||
2 | Copyright (C) 1989-2018 Free Software Foundation, Inc. | - | ||||||||||||||||||||||||
3 | - | |||||||||||||||||||||||||
4 | This program is free software: you can redistribute it and/or modify | - | ||||||||||||||||||||||||
5 | it under the terms of the GNU General Public License as published by | - | ||||||||||||||||||||||||
6 | the Free Software Foundation, either version 3 of the License, or | - | ||||||||||||||||||||||||
7 | (at your option) any later version. | - | ||||||||||||||||||||||||
8 | - | |||||||||||||||||||||||||
9 | This program is distributed in the hope that it will be useful, | - | ||||||||||||||||||||||||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||||||||||||||||||||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||||||||||||||||||||
12 | GNU General Public License for more details. | - | ||||||||||||||||||||||||
13 | - | |||||||||||||||||||||||||
14 | You should have received a copy of the GNU General Public License | - | ||||||||||||||||||||||||
15 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ | - | ||||||||||||||||||||||||
16 | - | |||||||||||||||||||||||||
17 | /* Written by Arnold Robbins. | - | ||||||||||||||||||||||||
18 | Major rewrite by David MacKenzie, djm@gnu.ai.mit.edu. */ | - | ||||||||||||||||||||||||
19 | - | |||||||||||||||||||||||||
20 | #include <config.h> | - | ||||||||||||||||||||||||
21 | #include <stdio.h> | - | ||||||||||||||||||||||||
22 | #include <sys/types.h> | - | ||||||||||||||||||||||||
23 | #include <pwd.h> | - | ||||||||||||||||||||||||
24 | #include <grp.h> | - | ||||||||||||||||||||||||
25 | #include <getopt.h> | - | ||||||||||||||||||||||||
26 | #include <selinux/selinux.h> | - | ||||||||||||||||||||||||
27 | - | |||||||||||||||||||||||||
28 | #include "system.h" | - | ||||||||||||||||||||||||
29 | #include "die.h" | - | ||||||||||||||||||||||||
30 | #include "error.h" | - | ||||||||||||||||||||||||
31 | #include "mgetgroups.h" | - | ||||||||||||||||||||||||
32 | #include "quote.h" | - | ||||||||||||||||||||||||
33 | #include "group-list.h" | - | ||||||||||||||||||||||||
34 | #include "smack.h" | - | ||||||||||||||||||||||||
35 | #include "userspec.h" | - | ||||||||||||||||||||||||
36 | - | |||||||||||||||||||||||||
37 | /* The official name of this program (e.g., no 'g' prefix). */ | - | ||||||||||||||||||||||||
38 | #define PROGRAM_NAME "id" | - | ||||||||||||||||||||||||
39 | - | |||||||||||||||||||||||||
40 | #define AUTHORS \ | - | ||||||||||||||||||||||||
41 | proper_name ("Arnold Robbins"), \ | - | ||||||||||||||||||||||||
42 | proper_name ("David MacKenzie") | - | ||||||||||||||||||||||||
43 | - | |||||||||||||||||||||||||
44 | /* If nonzero, output only the SELinux context. */ | - | ||||||||||||||||||||||||
45 | static bool just_context = 0; | - | ||||||||||||||||||||||||
46 | - | |||||||||||||||||||||||||
47 | static void print_user (uid_t uid); | - | ||||||||||||||||||||||||
48 | static void print_full_info (const char *username); | - | ||||||||||||||||||||||||
49 | - | |||||||||||||||||||||||||
50 | /* If true, output user/group name instead of ID number. -n */ | - | ||||||||||||||||||||||||
51 | static bool use_name = false; | - | ||||||||||||||||||||||||
52 | - | |||||||||||||||||||||||||
53 | /* The real and effective IDs of the user to print. */ | - | ||||||||||||||||||||||||
54 | static uid_t ruid, euid; | - | ||||||||||||||||||||||||
55 | static gid_t rgid, egid; | - | ||||||||||||||||||||||||
56 | - | |||||||||||||||||||||||||
57 | /* True unless errors have been encountered. */ | - | ||||||||||||||||||||||||
58 | static bool ok = true; | - | ||||||||||||||||||||||||
59 | - | |||||||||||||||||||||||||
60 | /* The SELinux context. Start with a known invalid value so print_full_info | - | ||||||||||||||||||||||||
61 | knows when 'context' has not been set to a meaningful value. */ | - | ||||||||||||||||||||||||
62 | static char *context = NULL; | - | ||||||||||||||||||||||||
63 | - | |||||||||||||||||||||||||
64 | static struct option const longopts[] = | - | ||||||||||||||||||||||||
65 | { | - | ||||||||||||||||||||||||
66 | {"context", no_argument, NULL, 'Z'}, | - | ||||||||||||||||||||||||
67 | {"group", no_argument, NULL, 'g'}, | - | ||||||||||||||||||||||||
68 | {"groups", no_argument, NULL, 'G'}, | - | ||||||||||||||||||||||||
69 | {"name", no_argument, NULL, 'n'}, | - | ||||||||||||||||||||||||
70 | {"real", no_argument, NULL, 'r'}, | - | ||||||||||||||||||||||||
71 | {"user", no_argument, NULL, 'u'}, | - | ||||||||||||||||||||||||
72 | {"zero", no_argument, NULL, 'z'}, | - | ||||||||||||||||||||||||
73 | {GETOPT_HELP_OPTION_DECL}, | - | ||||||||||||||||||||||||
74 | {GETOPT_VERSION_OPTION_DECL}, | - | ||||||||||||||||||||||||
75 | {NULL, 0, NULL, 0} | - | ||||||||||||||||||||||||
76 | }; | - | ||||||||||||||||||||||||
77 | - | |||||||||||||||||||||||||
78 | void | - | ||||||||||||||||||||||||
79 | usage (int status) | - | ||||||||||||||||||||||||
80 | { | - | ||||||||||||||||||||||||
81 | if (status != EXIT_SUCCESS)
| 3-16 | ||||||||||||||||||||||||
82 | emit_try_help (); executed 3 times by 1 test: end of block Executed by:
| 3 | ||||||||||||||||||||||||
83 | else | - | ||||||||||||||||||||||||
84 | { | - | ||||||||||||||||||||||||
85 | printf (_("Usage: %s [OPTION]... [USER]\n"), program_name); | - | ||||||||||||||||||||||||
86 | fputs (_("\ | - | ||||||||||||||||||||||||
87 | Print user and group information for the specified USER,\n\ | - | ||||||||||||||||||||||||
88 | or (when USER omitted) for the current user.\n\ | - | ||||||||||||||||||||||||
89 | \n"), | - | ||||||||||||||||||||||||
90 | stdout); | - | ||||||||||||||||||||||||
91 | fputs (_("\ | - | ||||||||||||||||||||||||
92 | -a ignore, for compatibility with other versions\n\ | - | ||||||||||||||||||||||||
93 | -Z, --context print only the security context of the process\n\ | - | ||||||||||||||||||||||||
94 | -g, --group print only the effective group ID\n\ | - | ||||||||||||||||||||||||
95 | -G, --groups print all group IDs\n\ | - | ||||||||||||||||||||||||
96 | -n, --name print a name instead of a number, for -ugG\n\ | - | ||||||||||||||||||||||||
97 | -r, --real print the real ID instead of the effective ID, with -ugG\n\ | - | ||||||||||||||||||||||||
98 | -u, --user print only the effective user ID\n\ | - | ||||||||||||||||||||||||
99 | -z, --zero delimit entries with NUL characters, not whitespace;\n\ | - | ||||||||||||||||||||||||
100 | not permitted in default format\n\ | - | ||||||||||||||||||||||||
101 | "), stdout); | - | ||||||||||||||||||||||||
102 | fputs (HELP_OPTION_DESCRIPTION, stdout); | - | ||||||||||||||||||||||||
103 | fputs (VERSION_OPTION_DESCRIPTION, stdout); | - | ||||||||||||||||||||||||
104 | fputs (_("\ | - | ||||||||||||||||||||||||
105 | \n\ | - | ||||||||||||||||||||||||
106 | Without any OPTION, print some useful set of identified information.\n\ | - | ||||||||||||||||||||||||
107 | "), stdout); | - | ||||||||||||||||||||||||
108 | emit_ancillary_info (PROGRAM_NAME); | - | ||||||||||||||||||||||||
109 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||||||||||||||
110 | exit (status); executed 19 times by 1 test: exit (status); Executed by:
| 19 | ||||||||||||||||||||||||
111 | } | - | ||||||||||||||||||||||||
112 | - | |||||||||||||||||||||||||
113 | int | - | ||||||||||||||||||||||||
114 | main (int argc, char **argv) | - | ||||||||||||||||||||||||
115 | { | - | ||||||||||||||||||||||||
116 | int optc; | - | ||||||||||||||||||||||||
117 | int selinux_enabled = (is_selinux_enabled () > 0); | - | ||||||||||||||||||||||||
118 | bool smack_enabled = is_smack_enabled (); | - | ||||||||||||||||||||||||
119 | bool opt_zero = false; | - | ||||||||||||||||||||||||
120 | char *pw_name = NULL; | - | ||||||||||||||||||||||||
121 | - | |||||||||||||||||||||||||
122 | /* If true, output the list of all group IDs. -G */ | - | ||||||||||||||||||||||||
123 | bool just_group_list = false; | - | ||||||||||||||||||||||||
124 | /* If true, output only the group ID(s). -g */ | - | ||||||||||||||||||||||||
125 | bool just_group = false; | - | ||||||||||||||||||||||||
126 | /* If true, output real UID/GID instead of default effective UID/GID. -r */ | - | ||||||||||||||||||||||||
127 | bool use_real = false; | - | ||||||||||||||||||||||||
128 | /* If true, output only the user ID(s). -u */ | - | ||||||||||||||||||||||||
129 | bool just_user = false; | - | ||||||||||||||||||||||||
130 | - | |||||||||||||||||||||||||
131 | initialize_main (&argc, &argv); | - | ||||||||||||||||||||||||
132 | set_program_name (argv[0]); | - | ||||||||||||||||||||||||
133 | setlocale (LC_ALL, ""); | - | ||||||||||||||||||||||||
134 | bindtextdomain (PACKAGE, LOCALEDIR); | - | ||||||||||||||||||||||||
135 | textdomain (PACKAGE); | - | ||||||||||||||||||||||||
136 | - | |||||||||||||||||||||||||
137 | atexit (close_stdout); | - | ||||||||||||||||||||||||
138 | - | |||||||||||||||||||||||||
139 | while ((optc = getopt_long (argc, argv, "agnruzGZ", longopts, NULL)) != -1)
| 233-454 | ||||||||||||||||||||||||
140 | { | - | ||||||||||||||||||||||||
141 | switch (optc) | - | ||||||||||||||||||||||||
142 | { | - | ||||||||||||||||||||||||
143 | case 'a': executed 1 time by 1 test: case 'a': Executed by:
| 1 | ||||||||||||||||||||||||
144 | /* Ignore -a, for compatibility with SVR4. */ | - | ||||||||||||||||||||||||
145 | break; executed 1 time by 1 test: break; Executed by:
| 1 | ||||||||||||||||||||||||
146 | - | |||||||||||||||||||||||||
147 | case 'Z': executed 3 times by 1 test: case 'Z': Executed by:
| 3 | ||||||||||||||||||||||||
148 | /* politely decline if we're not on a SELinux/SMACK-enabled kernel. */ | - | ||||||||||||||||||||||||
149 | #ifdef HAVE_SMACK | - | ||||||||||||||||||||||||
150 | if (!selinux_enabled && !smack_enabled) | - | ||||||||||||||||||||||||
151 | die (EXIT_FAILURE, 0, | - | ||||||||||||||||||||||||
152 | _("--context (-Z) works only on " | - | ||||||||||||||||||||||||
153 | "an SELinux/SMACK-enabled kernel")); | - | ||||||||||||||||||||||||
154 | #else | - | ||||||||||||||||||||||||
155 | if (!selinux_enabled)
| 0-3 | ||||||||||||||||||||||||
156 | die (EXIT_FAILURE, 0, executed 3 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"--context (-Z) works only on an SELinux-enabled kernel\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0),...works only on an SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "--context (-Z) works only on an SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; Executed by:
| 3 | ||||||||||||||||||||||||
157 | _("--context (-Z) works only on an SELinux-enabled kernel")); executed 3 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"--context (-Z) works only on an SELinux-enabled kernel\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0),...works only on an SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "--context (-Z) works only on an SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; Executed by:
| 3 | ||||||||||||||||||||||||
158 | #endif | - | ||||||||||||||||||||||||
159 | just_context = true; | - | ||||||||||||||||||||||||
160 | break; never executed: break; | 0 | ||||||||||||||||||||||||
161 | - | |||||||||||||||||||||||||
162 | case 'g': executed 50 times by 1 test: case 'g': Executed by:
| 50 | ||||||||||||||||||||||||
163 | just_group = true; | - | ||||||||||||||||||||||||
164 | break; executed 50 times by 1 test: break; Executed by:
| 50 | ||||||||||||||||||||||||
165 | case 'n': executed 66 times by 1 test: case 'n': Executed by:
| 66 | ||||||||||||||||||||||||
166 | use_name = true; | - | ||||||||||||||||||||||||
167 | break; executed 66 times by 1 test: break; Executed by:
| 66 | ||||||||||||||||||||||||
168 | case 'r': executed 64 times by 1 test: case 'r': Executed by:
| 64 | ||||||||||||||||||||||||
169 | use_real = true; | - | ||||||||||||||||||||||||
170 | break; executed 64 times by 1 test: break; Executed by:
| 64 | ||||||||||||||||||||||||
171 | case 'u': executed 125 times by 1 test: case 'u': Executed by:
| 125 | ||||||||||||||||||||||||
172 | just_user = true; | - | ||||||||||||||||||||||||
173 | break; executed 125 times by 1 test: break; Executed by:
| 125 | ||||||||||||||||||||||||
174 | case 'z': executed 63 times by 1 test: case 'z': Executed by:
| 63 | ||||||||||||||||||||||||
175 | opt_zero = true; | - | ||||||||||||||||||||||||
176 | break; executed 63 times by 1 test: break; Executed by:
| 63 | ||||||||||||||||||||||||
177 | case 'G': executed 52 times by 1 test: case 'G': Executed by:
| 52 | ||||||||||||||||||||||||
178 | just_group_list = true; | - | ||||||||||||||||||||||||
179 | break; executed 52 times by 1 test: break; Executed by:
| 52 | ||||||||||||||||||||||||
180 | case_GETOPT_HELP_CHAR; never executed: break; executed 16 times by 1 test: case GETOPT_HELP_CHAR: Executed by:
| 0-16 | ||||||||||||||||||||||||
181 | case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); executed 11 times by 1 test: exit ( 0 ); Executed by:
never executed: break; executed 11 times by 1 test: case GETOPT_VERSION_CHAR: Executed by:
| 0-11 | ||||||||||||||||||||||||
182 | default: executed 3 times by 1 test: default: Executed by:
| 3 | ||||||||||||||||||||||||
183 | usage (EXIT_FAILURE); | - | ||||||||||||||||||||||||
184 | } never executed: end of block | 0 | ||||||||||||||||||||||||
185 | } | - | ||||||||||||||||||||||||
186 | - | |||||||||||||||||||||||||
187 | size_t n_ids = argc - optind; | - | ||||||||||||||||||||||||
188 | if (1 < n_ids)
| 0-233 | ||||||||||||||||||||||||
189 | { | - | ||||||||||||||||||||||||
190 | error (0, 0, _("extra operand %s"), quote (argv[optind + 1])); | - | ||||||||||||||||||||||||
191 | usage (EXIT_FAILURE); | - | ||||||||||||||||||||||||
192 | } never executed: end of block | 0 | ||||||||||||||||||||||||
193 | - | |||||||||||||||||||||||||
194 | if (n_ids && just_context)
| 0-119 | ||||||||||||||||||||||||
195 | die (EXIT_FAILURE, 0, never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot print security context when user specified\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "cannot print security context when user specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot print security context when user specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; | 0 | ||||||||||||||||||||||||
196 | _("cannot print security context when user specified")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot print security context when user specified\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "cannot print security context when user specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot print security context when user specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; | 0 | ||||||||||||||||||||||||
197 | - | |||||||||||||||||||||||||
198 | if (just_user + just_group + just_group_list + just_context > 1)
| 0-233 | ||||||||||||||||||||||||
199 | die (EXIT_FAILURE, 0, _("cannot print \"only\" of more than one choice")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot print \\\"only\\\" of more than one choice\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "cannot print \"only\" of more than one choice" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot print \"only\" of more than one choice" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))); | 0 | ||||||||||||||||||||||||
200 | - | |||||||||||||||||||||||||
201 | bool default_format = ! (just_user
| 110-123 | ||||||||||||||||||||||||
202 | || just_group
| 48-62 | ||||||||||||||||||||||||
203 | || just_group_list
| 12-50 | ||||||||||||||||||||||||
204 | || just_context);
| 0-12 | ||||||||||||||||||||||||
205 | - | |||||||||||||||||||||||||
206 | if (default_format && (use_real || use_name))
| 0-221 | ||||||||||||||||||||||||
207 | die (EXIT_FAILURE, 0, never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot print only names or real IDs in default format\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), ...only names or real IDs in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot print only names or real IDs in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; | 0 | ||||||||||||||||||||||||
208 | _("cannot print only names or real IDs in default format")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot print only names or real IDs in default format\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), ...only names or real IDs in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot print only names or real IDs in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; | 0 | ||||||||||||||||||||||||
209 | - | |||||||||||||||||||||||||
210 | if (default_format && opt_zero)
| 1-221 | ||||||||||||||||||||||||
211 | die (EXIT_FAILURE, 0, executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"option --zero not permitted in default format\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "option --zero not permitted in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "option --zero not permitted in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; Executed by:
| 1 | ||||||||||||||||||||||||
212 | _("option --zero not permitted in default format")); executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"option --zero not permitted in default format\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "option --zero not permitted in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "option --zero not permitted in default format" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ; Executed by:
| 1 | ||||||||||||||||||||||||
213 | - | |||||||||||||||||||||||||
214 | /* If we are on a SELinux/SMACK-enabled kernel, no user is specified, and | - | ||||||||||||||||||||||||
215 | either --context is specified or none of (-u,-g,-G) is specified, | - | ||||||||||||||||||||||||
216 | and we're not in POSIXLY_CORRECT mode, get our context. Otherwise, | - | ||||||||||||||||||||||||
217 | leave the context variable alone - it has been initialized to an | - | ||||||||||||||||||||||||
218 | invalid value that will be not displayed in print_full_info(). */ | - | ||||||||||||||||||||||||
219 | if (n_ids == 0
| 114-118 | ||||||||||||||||||||||||
220 | && (just_context
| 0-118 | ||||||||||||||||||||||||
221 | || (default_format && ! getenv ("POSIXLY_CORRECT"))))
| 0-117 | ||||||||||||||||||||||||
222 | { | - | ||||||||||||||||||||||||
223 | /* Report failure only if --context (-Z) was explicitly requested. */ | - | ||||||||||||||||||||||||
224 | if ((selinux_enabled && getcon (&context) && just_context)
| 0-1 | ||||||||||||||||||||||||
225 | || (smack_enabled
| 0-1 | ||||||||||||||||||||||||
226 | && smack_new_label_from_self (&context) < 0
| 0 | ||||||||||||||||||||||||
227 | && just_context))
| 0 | ||||||||||||||||||||||||
228 | die (EXIT_FAILURE, 0, _("can't get process context")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"can't get process context\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "can't get process context" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "can't get process context" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))); | 0 | ||||||||||||||||||||||||
229 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||||||||||||||
230 | - | |||||||||||||||||||||||||
231 | if (n_ids == 1)
| 114-118 | ||||||||||||||||||||||||
232 | { | - | ||||||||||||||||||||||||
233 | struct passwd *pwd = NULL; | - | ||||||||||||||||||||||||
234 | const char *spec = argv[optind]; | - | ||||||||||||||||||||||||
235 | /* Disallow an empty spec here as parse_user_spec() doesn't | - | ||||||||||||||||||||||||
236 | give an error for that as it seems it's a valid way to | - | ||||||||||||||||||||||||
237 | specify a noop or "reset special bits" depending on the system. */ | - | ||||||||||||||||||||||||
238 | if (*spec)
| 1-113 | ||||||||||||||||||||||||
239 | { | - | ||||||||||||||||||||||||
240 | if (parse_user_spec (spec, &euid, NULL, NULL, NULL) == NULL)
| 2-111 | ||||||||||||||||||||||||
241 | { | - | ||||||||||||||||||||||||
242 | /* parse_user_spec will only extract a numeric spec, | - | ||||||||||||||||||||||||
243 | so we lookup that here to verify and also retrieve | - | ||||||||||||||||||||||||
244 | the PW_NAME used subsequently in group lookup. */ | - | ||||||||||||||||||||||||
245 | pwd = getpwuid (euid); | - | ||||||||||||||||||||||||
246 | } executed 111 times by 1 test: end of block Executed by:
| 111 | ||||||||||||||||||||||||
247 | } executed 113 times by 1 test: end of block Executed by:
| 113 | ||||||||||||||||||||||||
248 | if (pwd == NULL)
| 3-111 | ||||||||||||||||||||||||
249 | die (EXIT_FAILURE, 0, _("%s: no such user"), quote (spec)); executed 3 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"%s: no such user\", 5), quote (spec)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "%s: no such user" , 5) , quote (spec)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "%s: no such user" , 5) , quote (spec)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))); Executed by:
| 3 | ||||||||||||||||||||||||
250 | pw_name = xstrdup (pwd->pw_name); | - | ||||||||||||||||||||||||
251 | ruid = euid = pwd->pw_uid; | - | ||||||||||||||||||||||||
252 | rgid = egid = pwd->pw_gid; | - | ||||||||||||||||||||||||
253 | } executed 111 times by 1 test: end of block Executed by:
| 111 | ||||||||||||||||||||||||
254 | else | - | ||||||||||||||||||||||||
255 | { | - | ||||||||||||||||||||||||
256 | /* POSIX says identification functions (getuid, getgid, and | - | ||||||||||||||||||||||||
257 | others) cannot fail, but they can fail under GNU/Hurd and a | - | ||||||||||||||||||||||||
258 | few other systems. Test for failure by checking errno. */ | - | ||||||||||||||||||||||||
259 | uid_t NO_UID = -1; | - | ||||||||||||||||||||||||
260 | gid_t NO_GID = -1; | - | ||||||||||||||||||||||||
261 | - | |||||||||||||||||||||||||
262 | if (just_user ? !use_real
| 29-89 | ||||||||||||||||||||||||
263 | : !just_group && !just_group_list && !just_context)
| 0-85 | ||||||||||||||||||||||||
264 | { | - | ||||||||||||||||||||||||
265 | errno = 0; | - | ||||||||||||||||||||||||
266 | euid = geteuid (); | - | ||||||||||||||||||||||||
267 | if (euid == NO_UID && errno)
| 0-85 | ||||||||||||||||||||||||
268 | die (EXIT_FAILURE, errno, _("cannot get effective UID")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"cannot get effective UID\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get effective UID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get effective UID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))); | 0 | ||||||||||||||||||||||||
269 | } executed 85 times by 1 test: end of block Executed by:
| 85 | ||||||||||||||||||||||||
270 | - | |||||||||||||||||||||||||
271 | if (just_user ? use_real
| 21-97 | ||||||||||||||||||||||||
272 | : !just_group && (just_group_list || !just_context))
| 0-97 | ||||||||||||||||||||||||
273 | { | - | ||||||||||||||||||||||||
274 | errno = 0; | - | ||||||||||||||||||||||||
275 | ruid = getuid (); | - | ||||||||||||||||||||||||
276 | if (ruid == NO_UID && errno)
| 0-21 | ||||||||||||||||||||||||
277 | die (EXIT_FAILURE, errno, _("cannot get real UID")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"cannot get real UID\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get real UID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get real UID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))); | 0 | ||||||||||||||||||||||||
278 | } executed 21 times by 1 test: end of block Executed by:
| 21 | ||||||||||||||||||||||||
279 | - | |||||||||||||||||||||||||
280 | if (!just_user && (just_group || just_group_list || !just_context))
| 0-89 | ||||||||||||||||||||||||
281 | { | - | ||||||||||||||||||||||||
282 | errno = 0; | - | ||||||||||||||||||||||||
283 | egid = getegid (); | - | ||||||||||||||||||||||||
284 | if (egid == NO_GID && errno)
| 0-29 | ||||||||||||||||||||||||
285 | die (EXIT_FAILURE, errno, _("cannot get effective GID")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"cannot get effective GID\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get effective GID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get effective GID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))); | 0 | ||||||||||||||||||||||||
286 | - | |||||||||||||||||||||||||
287 | errno = 0; | - | ||||||||||||||||||||||||
288 | rgid = getgid (); | - | ||||||||||||||||||||||||
289 | if (rgid == NO_GID && errno)
| 0-29 | ||||||||||||||||||||||||
290 | die (EXIT_FAILURE, errno, _("cannot get real GID")); never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"cannot get real GID\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get real GID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "cannot get real GID" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))); | 0 | ||||||||||||||||||||||||
291 | } executed 29 times by 1 test: end of block Executed by:
| 29 | ||||||||||||||||||||||||
292 | } executed 118 times by 1 test: end of block Executed by:
| 118 | ||||||||||||||||||||||||
293 | - | |||||||||||||||||||||||||
294 | if (just_user)
| 106-123 | ||||||||||||||||||||||||
295 | { | - | ||||||||||||||||||||||||
296 | print_user (use_real ? ruid : euid); | - | ||||||||||||||||||||||||
297 | } executed 123 times by 1 test: end of block Executed by:
| 123 | ||||||||||||||||||||||||
298 | else if (just_group)
| 48-58 | ||||||||||||||||||||||||
299 | { | - | ||||||||||||||||||||||||
300 | if (!print_group (use_real ? rgid : egid, use_name))
| 0-48 | ||||||||||||||||||||||||
301 | ok = false; never executed: ok = 0 ; | 0 | ||||||||||||||||||||||||
302 | } executed 48 times by 1 test: end of block Executed by:
| 48 | ||||||||||||||||||||||||
303 | else if (just_group_list)
| 8-50 | ||||||||||||||||||||||||
304 | { | - | ||||||||||||||||||||||||
305 | if (!print_group_list (pw_name, ruid, rgid, egid, use_name,
| 0-50 | ||||||||||||||||||||||||
306 | opt_zero ? '\0' : ' '))
| 0-50 | ||||||||||||||||||||||||
307 | ok = false; never executed: ok = 0 ; | 0 | ||||||||||||||||||||||||
308 | } executed 50 times by 1 test: end of block Executed by:
| 50 | ||||||||||||||||||||||||
309 | else if (just_context)
| 0-8 | ||||||||||||||||||||||||
310 | { | - | ||||||||||||||||||||||||
311 | fputs (context, stdout); | - | ||||||||||||||||||||||||
312 | } never executed: end of block | 0 | ||||||||||||||||||||||||
313 | else | - | ||||||||||||||||||||||||
314 | { | - | ||||||||||||||||||||||||
315 | print_full_info (pw_name); | - | ||||||||||||||||||||||||
316 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||||||||
317 | putchar (opt_zero ? '\0' : '\n'); | - | ||||||||||||||||||||||||
318 | - | |||||||||||||||||||||||||
319 | IF_LINT (free (pw_name)); | - | ||||||||||||||||||||||||
320 | return ok ? EXIT_SUCCESS : EXIT_FAILURE; executed 229 times by 1 test: return ok ? 0 : 1 ; Executed by:
| 229 | ||||||||||||||||||||||||
321 | } | - | ||||||||||||||||||||||||
322 | - | |||||||||||||||||||||||||
323 | /* Convert a gid_t to string. Do not use this function directly. | - | ||||||||||||||||||||||||
324 | Instead, use it via the gidtostr macro. | - | ||||||||||||||||||||||||
325 | Beware that it returns a pointer to static storage. */ | - | ||||||||||||||||||||||||
326 | static char * | - | ||||||||||||||||||||||||
327 | gidtostr_ptr (gid_t const *gid) | - | ||||||||||||||||||||||||
328 | { | - | ||||||||||||||||||||||||
329 | static char buf[INT_BUFSIZE_BOUND (uintmax_t)]; | - | ||||||||||||||||||||||||
330 | return umaxtostr (*gid, buf); executed 66 times by 1 test: return umaxtostr (*gid, buf); Executed by:
| 66 | ||||||||||||||||||||||||
331 | } | - | ||||||||||||||||||||||||
332 | #define gidtostr(g) gidtostr_ptr (&(g)) | - | ||||||||||||||||||||||||
333 | - | |||||||||||||||||||||||||
334 | /* Convert a uid_t to string. Do not use this function directly. | - | ||||||||||||||||||||||||
335 | Instead, use it via the uidtostr macro. | - | ||||||||||||||||||||||||
336 | Beware that it returns a pointer to static storage. */ | - | ||||||||||||||||||||||||
337 | static char * | - | ||||||||||||||||||||||||
338 | uidtostr_ptr (uid_t const *uid) | - | ||||||||||||||||||||||||
339 | { | - | ||||||||||||||||||||||||
340 | static char buf[INT_BUFSIZE_BOUND (uintmax_t)]; | - | ||||||||||||||||||||||||
341 | return umaxtostr (*uid, buf); executed 108 times by 1 test: return umaxtostr (*uid, buf); Executed by:
| 108 | ||||||||||||||||||||||||
342 | } | - | ||||||||||||||||||||||||
343 | #define uidtostr(u) uidtostr_ptr (&(u)) | - | ||||||||||||||||||||||||
344 | - | |||||||||||||||||||||||||
345 | /* Print the name or value of user ID UID. */ | - | ||||||||||||||||||||||||
346 | - | |||||||||||||||||||||||||
347 | static void | - | ||||||||||||||||||||||||
348 | print_user (uid_t uid) | - | ||||||||||||||||||||||||
349 | { | - | ||||||||||||||||||||||||
350 | struct passwd *pwd = NULL; | - | ||||||||||||||||||||||||
351 | - | |||||||||||||||||||||||||
352 | if (use_name)
| 23-100 | ||||||||||||||||||||||||
353 | { | - | ||||||||||||||||||||||||
354 | pwd = getpwuid (uid); | - | ||||||||||||||||||||||||
355 | if (pwd == NULL)
| 0-23 | ||||||||||||||||||||||||
356 | { | - | ||||||||||||||||||||||||
357 | error (0, 0, _("cannot find name for user ID %s"), | - | ||||||||||||||||||||||||
358 | uidtostr (uid)); | - | ||||||||||||||||||||||||
359 | ok = false; | - | ||||||||||||||||||||||||
360 | } never executed: end of block | 0 | ||||||||||||||||||||||||
361 | } executed 23 times by 1 test: end of block Executed by:
| 23 | ||||||||||||||||||||||||
362 | - | |||||||||||||||||||||||||
363 | char *s = pwd ? pwd->pw_name : uidtostr (uid);
| 23-100 | ||||||||||||||||||||||||
364 | fputs (s, stdout); | - | ||||||||||||||||||||||||
365 | } executed 123 times by 1 test: end of block Executed by:
| 123 | ||||||||||||||||||||||||
366 | - | |||||||||||||||||||||||||
367 | /* Print all of the info about the user's user and group IDs. */ | - | ||||||||||||||||||||||||
368 | - | |||||||||||||||||||||||||
369 | static void | - | ||||||||||||||||||||||||
370 | print_full_info (const char *username) | - | ||||||||||||||||||||||||
371 | { | - | ||||||||||||||||||||||||
372 | struct passwd *pwd; | - | ||||||||||||||||||||||||
373 | struct group *grp; | - | ||||||||||||||||||||||||
374 | - | |||||||||||||||||||||||||
375 | printf (_("uid=%s"), uidtostr (ruid)); | - | ||||||||||||||||||||||||
376 | pwd = getpwuid (ruid); | - | ||||||||||||||||||||||||
377 | if (pwd)
| 0-8 | ||||||||||||||||||||||||
378 | printf ("(%s)", pwd->pw_name); executed 8 times by 1 test: printf ("(%s)", pwd->pw_name); Executed by:
| 8 | ||||||||||||||||||||||||
379 | - | |||||||||||||||||||||||||
380 | printf (_(" gid=%s"), gidtostr (rgid)); | - | ||||||||||||||||||||||||
381 | grp = getgrgid (rgid); | - | ||||||||||||||||||||||||
382 | if (grp)
| 0-8 | ||||||||||||||||||||||||
383 | printf ("(%s)", grp->gr_name); executed 8 times by 1 test: printf ("(%s)", grp->gr_name); Executed by:
| 8 | ||||||||||||||||||||||||
384 | - | |||||||||||||||||||||||||
385 | if (euid != ruid)
| 0-8 | ||||||||||||||||||||||||
386 | { | - | ||||||||||||||||||||||||
387 | printf (_(" euid=%s"), uidtostr (euid)); | - | ||||||||||||||||||||||||
388 | pwd = getpwuid (euid); | - | ||||||||||||||||||||||||
389 | if (pwd)
| 0 | ||||||||||||||||||||||||
390 | printf ("(%s)", pwd->pw_name); never executed: printf ("(%s)", pwd->pw_name); | 0 | ||||||||||||||||||||||||
391 | } never executed: end of block | 0 | ||||||||||||||||||||||||
392 | - | |||||||||||||||||||||||||
393 | if (egid != rgid)
| 0-8 | ||||||||||||||||||||||||
394 | { | - | ||||||||||||||||||||||||
395 | printf (_(" egid=%s"), gidtostr (egid)); | - | ||||||||||||||||||||||||
396 | grp = getgrgid (egid); | - | ||||||||||||||||||||||||
397 | if (grp)
| 0 | ||||||||||||||||||||||||
398 | printf ("(%s)", grp->gr_name); never executed: printf ("(%s)", grp->gr_name); | 0 | ||||||||||||||||||||||||
399 | } never executed: end of block | 0 | ||||||||||||||||||||||||
400 | - | |||||||||||||||||||||||||
401 | { | - | ||||||||||||||||||||||||
402 | gid_t *groups; | - | ||||||||||||||||||||||||
403 | - | |||||||||||||||||||||||||
404 | gid_t primary_group; | - | ||||||||||||||||||||||||
405 | if (username)
| 1-7 | ||||||||||||||||||||||||
406 | primary_group = pwd ? pwd->pw_gid : -1; executed 7 times by 1 test: primary_group = pwd ? pwd->pw_gid : -1; Executed by:
| 0-7 | ||||||||||||||||||||||||
407 | else | - | ||||||||||||||||||||||||
408 | primary_group = egid; executed 1 time by 1 test: primary_group = egid; Executed by:
| 1 | ||||||||||||||||||||||||
409 | - | |||||||||||||||||||||||||
410 | int n_groups = xgetgroups (username, primary_group, &groups); | - | ||||||||||||||||||||||||
411 | if (n_groups < 0)
| 0-8 | ||||||||||||||||||||||||
412 | { | - | ||||||||||||||||||||||||
413 | if (username)
| 0 | ||||||||||||||||||||||||
414 | error (0, errno, _("failed to get groups for user %s"), never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to get groups for user %s" , 5) , quote (username)); | 0 | ||||||||||||||||||||||||
415 | quote (username)); never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to get groups for user %s" , 5) , quote (username)); | 0 | ||||||||||||||||||||||||
416 | else | - | ||||||||||||||||||||||||
417 | error (0, errno, _("failed to get groups for the current process")); never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to get groups for the current process" , 5) ); | 0 | ||||||||||||||||||||||||
418 | ok = false; | - | ||||||||||||||||||||||||
419 | return; never executed: return; | 0 | ||||||||||||||||||||||||
420 | } | - | ||||||||||||||||||||||||
421 | - | |||||||||||||||||||||||||
422 | if (n_groups > 0)
| 0-8 | ||||||||||||||||||||||||
423 | fputs (_(" groups="), stdout); executed 8 times by 1 test: fputs_unlocked ( dcgettext (((void *)0), " groups=" , 5) , stdout ); Executed by:
| 8 | ||||||||||||||||||||||||
424 | for (int i = 0; i < n_groups; i++)
| 8-58 | ||||||||||||||||||||||||
425 | { | - | ||||||||||||||||||||||||
426 | if (i > 0)
| 8-50 | ||||||||||||||||||||||||
427 | putchar (','); executed 50 times by 1 test: putchar_unlocked (','); Executed by:
| 50 | ||||||||||||||||||||||||
428 | fputs (gidtostr (groups[i]), stdout); | - | ||||||||||||||||||||||||
429 | grp = getgrgid (groups[i]); | - | ||||||||||||||||||||||||
430 | if (grp)
| 0-58 | ||||||||||||||||||||||||
431 | printf ("(%s)", grp->gr_name); executed 58 times by 1 test: printf ("(%s)", grp->gr_name); Executed by:
| 58 | ||||||||||||||||||||||||
432 | } executed 58 times by 1 test: end of block Executed by:
| 58 | ||||||||||||||||||||||||
433 | free (groups); | - | ||||||||||||||||||||||||
434 | } | - | ||||||||||||||||||||||||
435 | - | |||||||||||||||||||||||||
436 | /* POSIX mandates the precise output format, and that it not include | - | ||||||||||||||||||||||||
437 | any context=... part, so skip that if POSIXLY_CORRECT is set. */ | - | ||||||||||||||||||||||||
438 | if (context)
| 0-8 | ||||||||||||||||||||||||
439 | printf (_(" context=%s"), context); never executed: printf ( dcgettext (((void *)0), " context=%s" , 5) , context); | 0 | ||||||||||||||||||||||||
440 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||||||||
Source code | Switch to Preprocessed file |