|
|
1.1 root 1: /* uudir.c
2: Create a directory owned by uucp. This is Unix specific.
3:
4: Copyright (C) 1992 Ian Lance Taylor
5:
6: This file is part of the Taylor UUCP package.
7:
8: This program is free software; you can redistribute it and/or
9: modify it under the terms of the GNU General Public License as
10: published by the Free Software Foundation; either version 2 of the
11: License, or (at your option) any later version.
12:
13: This program is distributed in the hope that it will be useful, but
14: WITHOUT ANY WARRANTY; without even the implied warranty of
15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16: General Public License for more details.
17:
18: You should have received a copy of the GNU General Public License
19: along with this program; if not, write to the Free Software
20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21:
22: The author of the program may be contacted at [email protected] or
23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
24: */
25:
26: #if USE_RCS_ID
27: const char uudir_rcsid[] = "$Id: uudir.c,v 1.1 93/07/30 07:59:03 bin Exp Locker: bin $";
28: #endif
29:
30: #include "sysdep.h"
31:
32: #include <pwd.h>
33:
34: /* External functions. */
35: #if GETPWNAM_DECLARATION_OK
36: #ifndef getpwnam
37: extern struct passwd *getpwnam ();
38: #endif
39: #endif
40:
41: /* This is a simple program which sets its real uid to uucp and then
42: invokes /bin/mkdir. It is only used if the system does not support
43: the mkdir system call. It must be installed suid to root.
44:
45: This program is needed because the UUCP programs will be run suid
46: to uucp. On a system without the mkdir system call, /bin/mkdir is
47: a suid root program. This means that /bin/mkdir always creates
48: directories using the real uid, rather than the effective uid.
49: This is wrong, since the UUCP programs always want to create
50: directories that are owned by uucp. Therefore, this simple suid
51: root program is used to force /bin/mkdir into making a directory
52: owned by uucp.
53:
54: If we made the program publically executable, this would mean that
55: anybody could create a directory owned by uucp. This is probably
56: not a good thing, but since the program must be owned by root we
57: can't simply make it executable only by uucp. Therefore, the
58: Makefile hides the program away in /usr/lib/uucp/util, and makes
59: that directory searchable only by uucp. This should prevent
60: anybody else from getting to the program.
61:
62: This is not a perfect solution, since any suid root program is by
63: definition a potential security hole. I really can't see any way
64: to avoid this, though. */
65:
66: int
67: main (argc, argv)
68: int argc;
69: char **argv;
70: {
71: struct passwd *q;
72: const char *zprog, *zname;
73:
74: /* We don't print any error messages, since this program should
75: never be run directly by a user. */
76:
77: if (argc != 2)
78: exit (EXIT_FAILURE);
79:
80: /* OWNER is passed in from the Makefile. It will normally be
81: "uucp". */
82: q = getpwnam (OWNER);
83: if (q == NULL)
84: exit (EXIT_FAILURE);
85:
86: if (setuid (q->pw_uid) < 0)
87: exit (EXIT_FAILURE);
88:
89: zprog = MKDIR_PROGRAM;
90: zname = strrchr (zprog, '/');
91: if (zname == NULL)
92: zname = zprog;
93: else
94: ++zname;
95:
96: (void) execl (zprog, zname, argv[1], (char *) NULL);
97: exit (EXIT_FAILURE);
98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.