Branch
Hash :
26fd3545
Author :
Date :
2025-09-16T23:08:01
stringeq: prefer streq to strcmp in other modules * lib/acl-internal.c, lib/argmatch.c, lib/argp-help.c: * lib/argp-parse.c, lib/bcp47.c, lib/c32_get_mapping.c: * lib/c32_get_type_test.c, lib/concat-filename.c: * lib/cpu-supports.h, lib/dfa.c, lib/duplocale.c, lib/exclude.c: * lib/findprog-in.c, lib/findprog.c, lib/fopen.c, lib/freopen.c: * lib/fts.c, lib/gen-uni-tables.c, lib/getfilecon.c: * lib/getlogin.c, lib/getugroups.c, lib/hard-locale.c: * lib/hashcode-named-file.c, lib/hashkey-string.c: * lib/iconv_open.c, lib/idcache.c, lib/lc-charset-unicode.c: * lib/localcharset.c, lib/localename-environ.c: * lib/localename-unsafe.c, lib/mbs_endswith.c, lib/mountlist.c: * lib/newlocale.c, lib/nl_langinfo.c, lib/nproc.c, lib/open.c: * lib/os2-spawn.c, lib/parse-datetime.y, lib/popen.c: * lib/progreloc.c, lib/propername.c, lib/pt_chown.c, lib/putenv.c: * lib/qcopy-acl.c, lib/readutmp.c, lib/rpmatch.c: * lib/setlocale-fixes.c, lib/setlocale.c, lib/sig2str.c: * lib/spawni.c, lib/stat.c, lib/str_endswith.c, lib/streq.h: * lib/striconveha.c, lib/struniq.h, lib/supersede.c: * lib/time_rz.c, lib/unicodeio.c, lib/vasnprintf.c: * lib/vc-mtime.c, lib/wctrans-impl.h, lib/wctype-impl.h: Prefer streq to strcmp when either will do. Do not make this change to files shared with glibc. Do not make the change to test files, at least not for now. * lib/gen-uni-tables.c (streq): New static function, in same style. * modules/acl-permissions, modules/argp, modules/c32_get_mapping: * modules/c32_get_type_test, modules/concat-filename: * modules/cpu-supports, modules/dfa, modules/duplocale: * modules/exclude, modules/findprog, modules/findprog-in: * modules/fopen, modules/fopen-gnu, modules/freopen, modules/fts: * modules/getlocalename_l-simple, modules/getlocalename_l-unsafe: * modules/getlogin, modules/getugroups, modules/hard-locale: * modules/hashcode-named-file, modules/hashkey-string: * modules/iconv_open, modules/idcache, modules/localcharset: * modules/localename, modules/localename-unsafe: * modules/mbs_endswith, modules/mountlist, modules/newlocale: * modules/nl_langinfo, modules/nproc, modules/open: * modules/parse-datetime, modules/popen: * modules/posix_spawn-internal, modules/propername: * modules/pt_chown, modules/putenv-gnu, modules/qcopy-acl: * modules/rpmatch, modules/selinux-h, modules/setenv: * modules/setlocale, modules/setlocale-fixes, modules/sig2str: * modules/spawn-pipe, modules/stat, modules/str_endswith: * modules/streq, modules/striconveha, modules/supersede: * modules/time_rz, modules/uchar-h, modules/unicodeio: * modules/uniconv/base, modules/wctrans, modules/wctype: (Depends-on): Add stringeq.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
/* pt_chown - helper program for 'grantpt'.
Copyright (C) 1998-1999, 2009-2025 Free Software Foundation, Inc.
Contributed by C. Scott Ananian <cananian@alumni.princeton.edu>, 1998.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#include <config.h>
#include <errno.h>
#include <grp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include "root-uid.h"
#include "pty-private.h"
/* For security reasons, we try to minimize the dependencies on libraries
outside libc. This means, in particular:
- No use of gettext(), since it's usually implemented in libintl.
- No use of error() or argp, since they rely on gettext by default. */
static int
do_pt_chown (void)
{
char *pty;
struct stat st;
struct group *p;
gid_t gid;
/* Check that PTY_FILENO is a valid master pseudo terminal. */
pty = ptsname (PTY_FILENO);
if (pty == NULL)
return errno == EBADF ? FAIL_EBADF : FAIL_EINVAL;
/* Check that the returned slave pseudo terminal is a
character device. */
if (stat (pty, &st) < 0 || !S_ISCHR (st.st_mode))
return FAIL_EINVAL;
/* Get the group ID of the special 'tty' group. */
p = getgrnam (TTY_GROUP);
gid = p ? p->gr_gid : getgid ();
/* Set the owner to the real user ID, and the group to that special
group ID. */
if (st.st_gid != gid && chown (pty, getuid (), gid) < 0)
return FAIL_EACCES;
/* Set the permission mode to readable and writable by the owner,
and writable by the group. */
if ((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != (S_IRUSR|S_IWUSR|S_IWGRP)
&& chmod (pty, S_IRUSR|S_IWUSR|S_IWGRP) < 0)
return FAIL_EACCES;
return 0;
}
int
main (int argc, char *argv[])
{
uid_t euid = geteuid ();
if (argc == 1 && euid == ROOT_UID)
{
/* Normal invocation of this program is with no arguments and
with privileges. */
return do_pt_chown ();
}
/* It would be possible to drop setuid/setgid privileges here. But it is not
really needed, since the code below only calls streq and [f]printf. */
{
int do_help = 0;
int do_version = 0;
int remaining;
for (remaining = 1; remaining < argc; remaining++)
{
const char *arg = argv[remaining];
if (arg[0] == '-')
{
if (streq (arg, "--"))
{
remaining++;
break;
}
else if (streq (arg, "--help"))
do_help = 1;
else if (streq (arg, "--version"))
do_version = 1;
else
{
fprintf (stderr, "pt_chown: invalid option: %s\n", arg);
return EXIT_FAILURE;
}
}
else
break;
}
if (remaining < argc)
{
fprintf (stderr, "pt_chown: too many arguments\n");
return EXIT_FAILURE;
}
if (do_help)
{
printf ("Usage: pt_chown [OPTION...]\n");
printf ("Set the owner, group and access permission of the slave pseudo terminal\n"
"corresponding to the master pseudo terminal passed on file descriptor %d.\n"
"This is the helper program for the 'grantpt' function. It is not intended\n"
"to be run directly from the command line.\n",
PTY_FILENO);
printf ("\n");
printf (" --help Give this help list\n");
printf (" --version Print program version\n");
printf ("\n");
printf ("The owner is set to the current user, the group is set to '%s', and the\n"
"access permission is set to '%o'.\n",
TTY_GROUP, S_IRUSR|S_IWUSR|S_IWGRP);
printf ("Please report bugs to <bug-gnulib@gnu.org>.\n");
return EXIT_SUCCESS;
}
if (do_version)
{
printf ("pt_chown (GNU %s) %s\n", "libc", "2.11");
printf ("Copyright (C) %s Free Software Foundation, Inc.\n"
"This is free software; see the source for copying conditions. There is NO\n"
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
"1999");
return EXIT_SUCCESS;
}
}
/* Check if we are properly installed. */
if (euid != ROOT_UID)
{
fprintf (stderr, "pt_chown: needs to be installed setuid 'root'\n");
return FAIL_EXEC;
}
return EXIT_SUCCESS;
}