If pt_chown calls ptsname(), then it must pull in gnulib; but then we must decide whether libtool is in use (libgnu.a vs. libgnu.la). Simpler is just shifting the burden to the sole caller. Even though this breaks compatibility with glibc pt_chown, we already document that our helper app is only conditionally built; and since it lives in pkglibexecdir, no one else should be calling it, anyways.
* lib/pt_chown.c (main, do_pt_chown): Require pty name as argument. * lib/grantpt.c (grantpt): Update caller. * modules/grantpt (Makefile.am): Simplify LDADD accordingly. * NEWS: Document the call convention change. Signed-off-by: Eric Blake <[email protected]> --- ChangeLog | 8 ++++++++ NEWS | 3 ++- lib/grantpt.c | 7 ++++++- lib/pt_chown.c | 26 +++++++++++--------------- modules/grantpt | 1 - 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 611ff0f..bcb9a75 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-10-19 Eric Blake <[email protected]> + pt_chown: break gnulib link dependency + * lib/pt_chown.c (main, do_pt_chown): Require pty name as argument. + * lib/grantpt.c (grantpt): Update caller. + * modules/grantpt (Makefile.am): Simplify LDADD accordingly. + * NEWS: Document the call convention change. + grantpt: only build pt_chown when needed * modules/pt_chown: Delete, merging into... * modules/grantpt: ...its sole user. Make building of pt_chown diff --git a/NEWS b/NEWS index 493a25b..0bff6a7 100644 --- a/NEWS +++ b/NEWS @@ -15,7 +15,8 @@ Date Modules Changes 2011-10-19 pt_chown This module no longer exists. The helper application pt_chown is now only built if needed for the 'grantpt' module, since it has no use - as a stand-alone application. + as a stand-alone application; also, it + intentionally differs from glibc's pt_chown. 2011-10-03 poll The link requirements of this module are changed from empty to $(LIB_POLL). diff --git a/lib/grantpt.c b/lib/grantpt.c index 985e31d..1398026 100644 --- a/lib/grantpt.c +++ b/lib/grantpt.c @@ -55,6 +55,10 @@ grantpt (int fd) else if (pid == 0) { /* This is executed in the child process. */ + char *pty; + pty = ptsname (PTY_FILENO); + if (pty == NULL) + _exit (errno == EBADF ? FAIL_EBADF : FAIL_EINVAL); #if HAVE_SETRLIMIT && defined RLIMIT_CORE /* Disable core dumps. */ @@ -71,7 +75,8 @@ grantpt (int fd) CLOSE_ALL_FDS (); #endif - execle (_PATH_PT_CHOWN, strrchr (_PATH_PT_CHOWN, '/') + 1, NULL, NULL); + execle (_PATH_PT_CHOWN, strrchr (_PATH_PT_CHOWN, '/') + 1, pty, NULL, + NULL); _exit (FAIL_EXEC); } else diff --git a/lib/pt_chown.c b/lib/pt_chown.c index ccc04fd..f654b2d 100644 --- a/lib/pt_chown.c +++ b/lib/pt_chown.c @@ -30,22 +30,18 @@ /* 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. */ + - No use of error() or argp, since they rely on gettext by default. + - No use of ptsname(), since this implementation is only compiled + by gnulib, which implies ptsname is also implemented by gnulib. */ static int -do_pt_chown (void) +do_pt_chown (char *pty) { - 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)) @@ -75,11 +71,11 @@ main (int argc, char *argv[]) { uid_t euid = geteuid (); - if (argc == 1 && euid == 0) + if (argc == 2 && argv[1][0] != '-' && euid == 0) { /* Normal invocation of this program is with no arguments and with privileges. */ - return do_pt_chown (); + return do_pt_chown (argv[1]); } /* It would be possible to drop setuid/setgid privileges here. But it is not @@ -123,11 +119,11 @@ main (int argc, char *argv[]) if (do_help) { - printf ("Usage: pt_chown [OPTION...]\n"); + printf ("Usage: pt_chown [OPTION...] PTSNAME\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", + "PTSNAME corresponding to the master pseudo terminal passed on file\n" + "descriptor %d. This is the helper program for the 'grantpt' function.\n" + "It is not intended to be run directly from the command line.\n", PTY_FILENO); printf ("\n"); printf (" --help Give this help list\n"); @@ -146,7 +142,7 @@ main (int argc, char *argv[]) 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"); + "2011"); return EXIT_SUCCESS; } } diff --git a/modules/grantpt b/modules/grantpt index c8b41ac..3dec876 100644 --- a/modules/grantpt +++ b/modules/grantpt @@ -27,7 +27,6 @@ Makefile.am: if GL_GENERATE_PT_CHOWN # TODO: Add rules for installing as setuid root (chown root, chmod a=rx,u+s). pkglibexec_PROGRAMS = pt_chown -pt_chown_LDADD = libgnu.a else EXTRA_DIST += pt_chown.c endif -- 1.7.4.4
