1 /* Test for processing of invalid passwd entries. [BZ #18724]
2 Copyright (C) 2015-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
29 check (struct passwd p
, const char *expected
)
33 FILE *f
= open_memstream (&buf
, &buf_size
);
37 printf ("open_memstream: %m\n");
42 int ret
= putpwent (&p
, f
);
50 printf ("putpwent: unexpected error code: %m\n");
56 printf ("putpwent: unexpected success (\"%s\")\n", p
.pw_name
);
63 size_t expected_length
= strlen (expected
);
66 long written
= ftell (f
);
68 if (written
<= 0 || fflush (f
) < 0)
70 printf ("stream error: %m\n");
73 else if (buf
[written
- 1] != '\n')
75 printf ("FAILED: \"%s\" without newline\n", expected
);
78 else if (strncmp (buf
, expected
, written
- 1) != 0
79 || written
- 1 != expected_length
)
81 printf ("FAILED: \"%s\" (%ld), expected \"%s\" (%zu)\n",
82 buf
, written
- 1, expected
, expected_length
);
88 printf ("FAILED: putpwent (expected \"%s\"): %m\n", expected
);
100 check ((struct passwd
) {
101 .pw_name
= (char *) "root",
104 check ((struct passwd
) {
105 .pw_name
= (char *) "root",
106 .pw_passwd
= (char *) "password",
108 "root:password:0:0:::");
109 check ((struct passwd
) {
110 .pw_name
= (char *) "root",
111 .pw_passwd
= (char *) "password",
114 .pw_gecos
= (char *) "gecos",
115 .pw_dir
= (char *) "home",
116 .pw_shell
= (char *) "shell",
118 "root:password:12:34:gecos:home:shell");
119 check ((struct passwd
) {
120 .pw_name
= (char *) "root",
121 .pw_passwd
= (char *) "password",
124 .pw_gecos
= (char *) ":ge\n:cos\n",
125 .pw_dir
= (char *) "home",
126 .pw_shell
= (char *) "shell",
128 "root:password:12:34: ge cos :home:shell");
132 static const char *const bad_strings
[] = {
144 for (const char *const *bad
= bad_strings
; *bad
!= NULL
; ++bad
)
146 check ((struct passwd
) {
147 .pw_name
= (char *) *bad
,
149 check ((struct passwd
) {
150 .pw_name
= (char *) "root",
151 .pw_passwd
= (char *) *bad
,
153 check ((struct passwd
) {
154 .pw_name
= (char *) "root",
155 .pw_dir
= (char *) *bad
,
157 check ((struct passwd
) {
158 .pw_name
= (char *) "root",
159 .pw_shell
= (char *) *bad
,
167 #define TEST_FUNCTION do_test ()
168 #include "../test-skeleton.c"