X Strike Force SVN commit: rev 530 - branches/4.3.0/sid/debian/patches
Author: branden
Date: 2003-09-15 15:06:51 -0500 (Mon, 15 Sep 2003)
New Revision: 530
Removed:
branches/4.3.0/sid/debian/patches/821_gnu-freebsd_xdm.diff
Modified:
branches/4.3.0/sid/debian/patches/002_xdm_fixes.diff
Log:
Resync xdm patches with trunk. Bring in a lot of fixes from post 4.2.1-4,
including the latest fix from 4.2.1-10. Merge in GNU/FreeBSD changes and
resync with upstream.
Modified: branches/4.3.0/sid/debian/patches/002_xdm_fixes.diff
===================================================================
--- branches/4.3.0/sid/debian/patches/002_xdm_fixes.diff 2003-09-15 08:42:56 UTC (rev 529)
+++ branches/4.3.0/sid/debian/patches/002_xdm_fixes.diff 2003-09-15 20:06:51 UTC (rev 530)
@@ -1,108 +1,421 @@
-Various fixes for xdm; forward-ported from 4.2.1 (patch originally by Branden
-Robinson).
+$Id$
-The second part of this patch fixes a few /dev/mem issues, described below.
+This patch by Branden Robinson, Matthieu Herrb, and Richard Braakman.
-Historically, if HASXDMAUTH was defined but neither ARC4_RANDOM nor
-DEV_RANDOM were defined, xdm provided a function called sumFile() that
-would read straight from /dev/mem and use that as an entropy source.
-However, that's a bad idea because A) it's not very entropic and B) some
-OSes have hardware registers mapped into /dev/mem, and even just reading
-from them can cause machine checks. It's a Bad Thing to do.
+These patches do a number of things:
-* Remove no longer needed "FRAGILE_DEV_MEM" define.
-* Revert meaning of DEV_RANDOM define to a simple on/off. DEF_RANDOM_FILE
- is already used in resource.c for the same purpose that the old
- (NetBSD-based?) code was using it.
-* Have NetBSD use /dev/urandcom as its DEF_RANDOM_FILE.
-* Define DEV_RANDOM for Linux and the Hurd. They both use /dev/random for
- their DEF_RANDOM_FILE.
-* Rewrite genauth.c to drop the sumFile() function and throw a cpp #error
- if HASXDMAUTH is defined but neither ARC4_RANDOM nor DEV_RANDOM are.
-* Whitespace and stylistic cleanups to genauth.c
-* Have genauth.c log an error, using _SysErrorMsg(), if it cannot open the
- specified randomFile.
-* Change semantics of randomFile resource to refer to the device to be
- opened for platforms that use DEV_RANDOM, instead of the device to be
- checksummed with the now-nonexistent sumFile() function.
-* Update manpage to reflect above change in meaning of randomFile resource,
- and document when it's not used.
-* Cleaned up whitespace and indented pre-processor conditionals in
- resource.c.
-
Not submitted upstream yet.
-diff -urN xc.orig/programs/xdm/Imakefile xc/programs/xdm/Imakefile
---- xc.orig/programs/xdm/Imakefile Wed Oct 9 05:26:16 2002
-+++ xc/programs/xdm/Imakefile Fri Dec 6 15:27:31 2002
-@@ -127,14 +127,14 @@
- SOCK_DEFINES = -DBSD44SOCKETS
+* Imakefile:
+ Use /dev/random as the default random number generator on
+ Linux, Hurd, and GNU/FreeBSD.
+* auth.c:
+ - Add a couple of comments to assuage some of the fears of security
+ auditors, and people who follow up on the GNU linker's ritual
+ complaints about mktemp().
+ - Protect against race-based symlink attacks in
+ SaveServerAuthorizations().
+ - Change openFiles() to avoid race-based symlink attacks.
+ - Change openFiles() to accept NULL for its third argument, and check
+ for a NULL value before fopen()ing the first argument.
+ - In SetUserAuthorization(), when falling back to /tmp for creation of
+ the authorization file, pass openFiles() NULL as arg 3, and set "old"
+ to NULL, since the we know the temp file just created to contain auth
+ credentials will be empty and have no authorization records in it.
+ - Richard Braakman observes the following about the above changes: "I
+ can think of only one case where the new behaviour could be a
+ problem: if a user already has a file ".Xauthority-n" in $HOME and
+ the user's home directory is not writable for self (so the unlink
+ fails) and the .Xauthority-n file _is_ writable then the old fopen
+ would have succeeded (and truncated the file), while the new code
+ would fail. Well, tough titties." Since "-n" files are cleaned
+ shortly after they are created, the existence of any such file would
+ be an anomaly (the result of an xdm or xinit process getting killed
+ at an inopportune moment). This doesn't seem like an important
+ concession.
+ - Also note that xdm is only susceptible to the aforementioned
+ race-condition-based symlink attacks if:
+ 1) the administrator configures the authDir or authFile resources to
+ be in publicly-writable directories; or
+ 2) the user's home directory is unwritable (NFS failure, over quota,
+ etc.)
+ - Change LogError() invocations to use _SysErrorMsg() where errno might
+ be set (and not clobbered by intermediate calls). Also make
+ LogError() the first thing we do after an error condition in those
+ cases.
+ - Make several LogError() and Debug() messages more informative.
+ - Fix typo in debug message.
+* choose.c:
+ Use xdm's _SysErrorMsg() function instead of strerror().
+* config/Imakefile:
+ - Handle GNUMachArchitecture the same as LinuxArchitecture.
+* config/Xres.cpp:
+ - Use fonts for the greeter that look good (or, at least, less
+ horrible). I experimented with this quite a bit to get something
+ that looks good when the ordinary bitmap fonts aren't scaled.
+ - Move some XPM-extension stuff inside the XPM #ifdef.
+ - Don't use a bitmap in the greeter if the root window is small.
+* daemon.c:
+ - Use xdm's _SysErrorMsg() function instead of strerror or merely
+ printing the raw error number.
+ - Stop manipulating the standard file descriptiors, since this can
+ interfere with logging.
+ - Log error if daemon() call fails.
+* dm.c:
+ - Matthieu Herrb rewrote the StorePid() function based on my changes;
+ he made it more careful with the size of Pid_t, and treats an
+ existing pid file as a failure. I then made some more changes: use
+ _SysErrorMsg() instead of strerror(), catch errors from the daemon()
+ function, do not close standard file descriptiors on daemonization,
+ add a comment explaining why, and don't assume that the process id we
+ write to the pidFile is 5 digits.
+ - Miscellaenous fixes: Add indentation to (heavily-used) preprocessor
+ statements. Initialize the log file sooner. Update log messages to
+ indicate when an immediate exit is taking place. Add log messages
+ for xdm startup, shutdown, and normal exit. Add a debugging message
+ when xdm enters its main loop. Fix a typo in a log message. Move a
+ "default" case in a switch() to be the final case evaluated, as is
+ customary in C code. Made brace usage a little more internally
+ consistent. Change a LogError() to a LogInfo() when we expect a
+ child X server process to become a zombie. Use the PID file as most
+ other Unix daemons do. Use _SysErrorMsg() instead of strerror().
+ Wrap some code at 80 columns.
+* dm_auth.h:
+ - Add function prototypes for exposed interfaces in xdmauth.c.
+ - Copy declarations from Xdmcp library's Wrap.h header.
+* dm_error.h:
+ Remove protoype for unused Panic() function.
+* error.c:
+ - Add timestamping to logging functions, except for LogOutOfMem().
+ - Remove unused Panic() function.
+ - Append to the log file if it already exists.
+ - Style fix: put function names flush left when they're being defined.
+* genauth.c:
+ - Include <fcntl.h> for definitions of O_ flags to open().
+ - Remove partial set of delcarations from Xdmcp library's Wrap.h
+ header; now in dm_auth.h instead.
+* greeter/verify.c:
+ Use _SysErrorMsg() instead of strerror().
+* session.c:
+ Indent pre-processor statements. Use _SysErrorMsg() instead of
+ strerror(). Recognize that GNU LibC-based systems as well as Linux
+ systems in general have the endpwent() function. Recognize that GNU
+ LibC-based systems as well as CSRG_BASED ones have the getpwnam() and
+ crypt() functions. Style fix: put function names flush left when
+ they're being defined.
+socket.c:
+ Use _SysErrorMsg() instead of strerror().
+util.c:
+ The setpgrp define wouldn't be necessary if GlibC's setpgrp was
+ equivalent to setpgid as described in the GlibC (info, of course)
+ documentation. -- Robert Millan <rmh@debian.org>
+xdm.man:
+ Use dot macros instead of backslash roff sequences to mark up literals
+ that use __projectroot__, because cpp won't recognize them otherwise.
+xdmauth.c:
+ - Declare functions used only internally as static.
+ - Delcare function prototypes for internal functions.
+ - Move from K&R to ANSI style function headers.
+xdmcp.c:
+ When terminating an active session, report this fact with LogInfo()
+ rather than Debug().
+xdmshell.c:
+ #include <string.h> for strerror() prototype. (xdmshell can't use
+ _SysErrorMsg because it is a standalone program that doesn't include
+ server.c.)
+
+--- xc/programs/xdm/Imakefile~ 2003-09-15 14:31:57.000000000 -0500
++++ xc/programs/xdm/Imakefile 2003-09-15 14:34:28.000000000 -0500
+@@ -137,6 +137,10 @@
+ RANDOM_DEFINES = -DDEV_RANDOM=\"/dev/urandom\"
#endif
--#if defined(i386Architecture) || defined(AmigaArchitecture)
--FRAGILE_DEFINES = -DFRAGILE_DEV_MEM
--#endif
--
- #if defined(NetBSDArchitecture) && \
- ((OSMajorVersion > 1) || \
- (OSMajorVersion == 1 && OSMinorVersion > 3))
--RANDOM_DEFINES = -DDEV_RANDOM=\"/dev/urandom\"
-+RANDOM_DEFINES = -DDEV_RANDOM -DDEF_RANDOM_FILE="\"/dev/urandom\""
++#if defined(LinuxArchitecture) || defined(GNUMachArchitecture) || defined(GNUFreeBSDArchitecture)
++ RANDOM_DEFINES = -DDEV_RANDOM -DDEF_RANDOM_FILE="\"/dev/random\""
+#endif
+
-+#if defined(LinuxArchitecture) || defined(GNUMachArchitecture)
-+RANDOM_DEFINES = -DDEV_RANDOM -DDEF_RANDOM_FILE="\"/dev/random\""
+ #ifdef OpenBSDArchitecture
+ RANDOM_DEFINES = -DARC4_RANDOM
#endif
+diff -urN xc/programs/xdm~/auth.c xc/programs/xdm/auth.c
+--- xc/programs/xdm~/auth.c 2003-08-19 01:01:30.000000000 -0500
++++ xc/programs/xdm/auth.c 2003-08-19 01:04:55.000000000 -0500
+@@ -46,6 +46,7 @@
+ #include "dm_error.h"
- #ifdef OpenBSDArchitecture
-@@ -230,7 +230,7 @@
- $(SIGNAL_DEFINES) $(CRYPT_DEFINES) $(BSDAUTH_DEFINES) \
- $(XDMAUTH_DEFINES) $(RPC_DEFINES) $(KRB5_DEFINES) \
- $(PWD_DEFINES) $(PAM_DEFINES) $(CONN_DEFINES) \
-- $(GREET_DEFINES) $(FRAGILE_DEFINES) $(RANDOM_DEFINES) \
-+ $(GREET_DEFINES) $(RANDOM_DEFINES) \
- -DOSMAJORVERSION=$(OSMAJORVERSION) \
- -DOSMINORVERSION=$(OSMINORVERSION) \
- $(XKB_CLIENT_DEFINES) $(USER_CONTEXT_DEFINES) \
-@@ -256,9 +256,9 @@
- '-DDEF_SYSTEM_SHELL="$(BOURNE_SHELL)"' \
- '-DDEF_FAILSAFE_CLIENT="$(BINDIR)/xterm"' \
- '-DDEF_XDM_CONFIG="$(XDMDIR)/xdm-config"' \
-- '-DDEF_CHOOSER="$(XDMDIR)/chooser"' \
-- '-DDEF_AUTH_DIR="$(XDMDIR)"' \
-- '-DDEF_GREETER_LIB="$(XDMDIR)/libXdmGreet.so"'
-+ '-DDEF_CHOOSER="$(BINDIR)/chooser"' \
-+ '-DDEF_AUTH_DIR="$(XDMVARDIR)"' \
-+ '-DDEF_GREETER_LIB="$(USRLIBDIR)/libXdmGreet.so"'
+ #include <errno.h>
++#include <fcntl.h>
- ComplexProgramTarget_1(xdm,$(LOCAL_LIBRARIES),NullParameter)
- LinkConfDirectory(xdm,.,xdm,.)
-@@ -277,7 +277,7 @@
- #if BuildChooser
- SpecialCObjectRule(chooser, $(ICONFIGFILES), $(SOCK_DEFINES))
- NormalProgramTarget(chooser,$(OBJS3),$(DEPLIBS3),$(LIBS3),NullParameter)
--InstallProgram(chooser,$(XDMDIR))
-+InstallProgram(chooser,$(BINDIR))
- InstallAppDefaults(Chooser)
- #endif
- #if BuildBoth
---- xc/programs/xdm/config/Imakefile.orig Sun Dec 29 17:16:42 2002
-+++ xc/programs/xdm/config/Imakefile Sun Dec 29 17:20:57 2002
-@@ -22,8 +22,13 @@
- # define XdmbwPixmap XFree86bw.xpm
- #endif
+ #include <sys/ioctl.h>
-+#if LinuxDistribution && (LinuxDistribution == LinuxDebian)
-+XPM_DEFINES=-DXPM -DBITMAPDIR=$(XDMDIR)/pixmaps -DXDM_PIXMAP=debian.xpm\ @@\
-+ -DXDM_BWPIXMAP=debianbw.xpm
-+#else
- XPM_DEFINES=-DXPM -DBITMAPDIR=$(XDMDIR)/pixmaps -DXDM_PIXMAP=XdmPixmap\ @@\
- -DXDM_BWPIXMAP=XdmbwPixmap
-+#endif
+@@ -319,8 +320,16 @@
+ d->authFile = NULL;
+ return FALSE;
+ }
+- sprintf (d->authFile, "%s/%s/%s/A%s-XXXXXX",
++ sprintf (d->authFile, "%s/%s/%s/A%s-XXXXXX",
+ authDir, authdir1, authdir2, cleanname);
++ /*
++ * Security auditors should note that mktemp() is not used unsafely
++ * here. The authFile is created in authDir, which defaults to
++ * a non-user-writeable location (see xdm.man). Only root, the
++ * owner of xdm's configuration files, or someone with permission
++ * to execute xdm (which is not installed setuid or setgid by
++ * default) can change the authDir or authFile resources.
++ */
+ (void) mktemp (d->authFile);
+ }
+ return TRUE;
+@@ -336,42 +345,50 @@
+ int mask;
+ int ret;
+ int i;
++ int fd;
- XDMLOGDIR = $(LOGDIRECTORY)
- #ifdef VarRunDirectory
-@@ -39,7 +44,11 @@
+ mask = umask (0077);
+ if (!d->authFile && !MakeServerAuthFile (d))
+ return FALSE;
+ (void) unlink (d->authFile);
+- auth_file = fopen (d->authFile, "w");
+- umask (mask);
+- if (!auth_file) {
+- Debug ("Can't creat auth file %s\n", d->authFile);
+- LogError ("Cannot open server authorization file %s\n", d->authFile);
++ fd = open (d->authFile, O_WRONLY | O_CREAT | O_EXCL, 0600);
++ if (fd >= 0)
++ auth_file = fdopen (fd, "w");
++ else
++ {
++ LogError ("cannot create server authorization file %s: %s\n",
++ d->authFile, _SysErrorMsg (errno));
++ Debug ("can't create auth file %s\n", d->authFile);
++ }
++ (void) umask (mask);
++ if (!auth_file)
++ {
+ free (d->authFile);
+ d->authFile = NULL;
+ ret = FALSE;
+ }
+ else
+ {
+- Debug ("File: %s auth: %p\n", d->authFile, auths);
++ Debug ("file: %s auth: %p\n", d->authFile, auths);
+ ret = TRUE;
+ for (i = 0; i < count; i++)
+ {
+ /*
+- * User-based auths may not have data until
+- * a user logs in. In which case don't write
+- * to the auth file so xrdb and setup programs don't fail.
++ * User-based auths may not have data until a user logs in, in
++ * which case don't write to the auth file so xrdb and setup
++ * programs don't fail.
+ */
+ if (auths[i]->data_length > 0)
+ if (!XauWriteAuth (auth_file, auths[i]) ||
+ fflush (auth_file) == EOF)
+ {
+- LogError ("Cannot write server authorization file %s\n",
++ LogError ("cannot write to server authorization file %s\n",
+ d->authFile);
+ ret = FALSE;
+ free (d->authFile);
+ d->authFile = NULL;
+ }
+- }
++ }
+ fclose (auth_file);
+ }
+ return ret;
+@@ -458,19 +475,36 @@
+ openFiles (char *name, char *new_name, FILE **oldp, FILE **newp)
+ {
+ int mask;
++ int newfd;
+
+ strcpy (new_name, name);
+ strcat (new_name, "-n");
+ mask = umask (0077);
+ (void) unlink (new_name);
+- *newp = fopen (new_name, "w");
++ newfd = open (new_name, O_WRONLY | O_CREAT | O_EXCL, 0600);
++ if (newfd >= 0)
++ *newp = fdopen (newfd, "w");
++ else
++ {
++ LogError ("cannot create file %s: %s\n", new_name,
++ _SysErrorMsg (errno));
++ Debug ("can't create file %s\n", new_name);
++ *newp = NULL;
++ }
+ (void) umask (mask);
+- if (!*newp) {
+- Debug ("can't open new file %s\n", new_name);
+- return 0;
++ if (!*newp)
++ {
++ Debug ("can't open new file %s\n", new_name);
++ return 0;
++ }
++ else
++ Debug ("open succeeded: %s\n", new_name);
++ if (oldp)
++ {
++ *oldp = fopen (name, "r");
++ if (*oldp)
++ Debug ("open succeeded: %s\n", name);
+ }
+- *oldp = fopen (name, "r");
+- Debug ("opens succeeded %s %s\n", name, new_name);
+ return 1;
+ }
+
+@@ -804,10 +838,11 @@
+ struct in_ifaddr ifaddr;
+ struct strioctl str;
+ unsigned char *addr;
+- int len, ipfd;
++ int len, ipfd;
+
+ if ((ipfd = open ("/dev/ip", O_RDWR, 0 )) < 0)
+- LogError ("Getting interface configuration");
++ LogError ("cannot get interface configuration; cannot open /dev/ip: "
++ "%s\n", _SysErrorMsg (errno));
+
+ /* Indicate that we want to start at the begining */
+ ifnet.ib_next = (struct ipb *) 1;
+@@ -821,8 +856,9 @@
+
+ if (ioctl (ipfd, (int) I_STR, (char *) &str) < 0)
+ {
++ LogError ("cannot get interface configuration; ioctl failed: %s\n",
++ _SysErrorMsg (errno));
+ close (ipfd);
+- LogError ("Getting interface configuration");
+ }
+
+ ifaddr.ia_next = (struct in_ifaddr *) ifnet.if_addrlist;
+@@ -833,8 +869,9 @@
+
+ if (ioctl (ipfd, (int) I_STR, (char *) &str) < 0)
+ {
++ LogError ("cannot get interface configuration; ioctl failed: %s\n",
++ _SysErrorMsg (errno));
+ close (ipfd);
+- LogError ("Getting interface configuration");
+ }
+
+ /*
+@@ -874,11 +911,11 @@
+ char *addr;
+ int family;
+ register struct ifreq *ifr;
+-
++
+ ifc.ifc_len = sizeof (buf);
+ ifc.ifc_buf = buf;
+ if (ifioctl (fd, SIOCGIFCONF, (char *) &ifc) < 0)
+- LogError ("Trouble getting network interface configuration");
++ LogError ("trouble getting network interface configuration");
+
+ #ifdef ISC
+ #define IFC_IFC_REQ (struct ifreq *) ifc.ifc_buf
+@@ -1096,28 +1133,47 @@
+ Debug ("openFiles failed\n");
+ XauUnlockAuth (home_name);
+ lockStatus = LOCK_ERROR;
+- }
++ }
+ }
+ }
+ if (lockStatus != LOCK_SUCCESS) {
++ /* log the fact that we're having trouble with authorization */
++ if (home) {
++ LogInfo ("unable to lock authority file in %s for display %s\n",
++ home, d->name);
++ } else {
++ LogInfo ("unable to determine home directory for authority "
++ "file locking on display %s\n", d->name);
++ }
+ snprintf (backup_name, sizeof(backup_name), "%s/.XauthXXXXXX", d->userAuthDir);
++ /*
++ * Security auditors should note that mktemp() is not used
++ * unsafely here. XauLockAuth() is very careful about opening
++ * the authority file, using O_CREAT and O_EXCL.
++ *
++ * However, note that the file backup_name will likely never be
++ * unlinked, since the user's home directory was unwritable and we
++ * will have to use backup_name as the authority file for the entire
++ * session.
++ */
+ (void) mktemp (backup_name);
+ lockStatus = XauLockAuth (backup_name, 1, 2, 10);
+ Debug ("backup lock is %d\n", lockStatus);
+ if (lockStatus == LOCK_SUCCESS) {
+- if (openFiles (backup_name, new_name, &old, &new)) {
++ if (openFiles (backup_name, new_name, NULL, &new)) {
++ old = NULL;
+ name = backup_name;
+ setenv = 1;
+ } else {
+ XauUnlockAuth (backup_name);
+ lockStatus = LOCK_ERROR;
+- }
++ }
+ }
+ }
+ if (lockStatus != LOCK_SUCCESS) {
+ Debug ("can't lock auth file %s or backup %s\n",
+ home_name, backup_name);
+- LogError ("can't lock authorization file %s or backup %s\n",
++ LogError ("cannot lock authorization file %s or backup %s\n",
+ home_name, backup_name);
+ return;
+ }
+@@ -1186,8 +1242,9 @@
+ Debug ("unlink %s failed\n", name);
+ envname = name;
+ if (link (new_name, name) == -1) {
++ LogError ("cannot move authorization file into place: %s\n",
++ _SysErrorMsg (errno));
+ Debug ("link failed %s %s\n", new_name, name);
+- LogError ("Can't move authorization into place\n");
+ setenv = 1;
+ envname = new_name;
+ } else {
+@@ -1263,12 +1320,14 @@
+ if (unlink (name) == -1)
+ Debug ("unlink %s failed\n", name);
+ if (link (new_name, name) == -1) {
++ LogError ("cannot move authorization file into place: %s\n",
++ _SysErrorMsg (errno));
+ Debug ("link failed %s %s\n", new_name, name);
+- LogError ("Can't move authorization into place\n");
+ } else {
+ Debug ("new is in place, go for it!\n");
+ unlink (new_name);
+ }
+ }
+ XauUnlockAuth (name);
++ Debug ("done RemoveUserAuthorization\n");
+ }
+diff -urN xc/programs/xdm~/choose.c xc/programs/xdm/choose.c
+--- xc/programs/xdm~/choose.c 2001-12-14 15:01:20.000000000 -0500
++++ xc/programs/xdm/choose.c 2003-02-23 17:04:20.000000000 -0500
+@@ -480,7 +480,7 @@
+ }
+ else
+ {
+- LogError ("Choice response read error: %s\n", strerror(errno));
++ LogError ("Choice response read error: %s\n", _SysErrorMsg (errno));
+ }
+
+ #if defined(STREAMSCONN)
+diff -urN xc/programs/xdm~/config/Imakefile xc/programs/xdm/config/Imakefile
+--- xc/programs/xdm~/config/Imakefile 2003-02-23 17:03:35.000000000 -0500
++++ xc/programs/xdm/config/Imakefile 2003-02-23 17:04:20.000000000 -0500
+@@ -39,7 +39,11 @@
#endif
CppFileTarget(Xservers.ws,Xserv.ws.cpp,-DBINDIR=$(BINDIR) -DDEFAULTVT=$(DEFAULTVT),NullParameter)
@@ -110,12 +423,12 @@
+CppFileTarget(xdm-config,xdm-conf.cpp,-DXDMDIR=$(XDMDIR) -DXDMLOGDIR=$(XDMLOGDIR) -DXDMPIDDIR=$(XDMPIDDIR) -DXDMVARDIR=$(XDMVARDIR) -DSU=$(SU),NullParameter)
+#else
CppFileTarget(xdm-config,xdm-conf.cpp,-DXDMDIR=$(XDMDIR) -DXDMLOGDIR=$(XDMLOGDIR) -DXDMPIDDIR=$(XDMPIDDIR) -DSU=$(SU),NullParameter)
-+#endif /* (LinuxArchitecture || GNUMachArchitecture) */
++#endif /* LinuxArchitecture || GNUMachArchitecture */
CppFileTarget(Xresources,Xres.cpp,$(XPM_DEFINES),NullParameter)
LinkFile(Xservers,Xservers.$(SERVERSTYPE))
---- xc/programs/xdm/config/Xres.cpp.orig Sun Dec 29 17:21:08 2002
-+++ xc/programs/xdm/config/Xres.cpp Sun Dec 29 17:28:23 2002
+--- xc/programs/xdm~/config/Xres.cpp 2003-09-15 14:17:05.000000000 -0500
++++ xc/programs/xdm/config/Xres.cpp 2003-09-15 14:23:34.000000000 -0500
@@ -28,22 +28,25 @@
#endif /* XPM */
xlogin*fail: Login incorrect
@@ -126,22 +439,22 @@
-xlogin*promptFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1
-xlogin*failFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1
+/**/#if WIDTH >= 1024
-+xlogin*greetFont: -adobe-helvetica-bold-o-normal--25-180-75-75-p-138-iso8859-1
-+xlogin*font: -adobe-helvetica-medium-r-normal--20-140-75-75-p-98-iso8859-1
-+xlogin*promptFont: -adobe-helvetica-bold-r-normal--20-140-75-75-p-103-iso8859-1
-+xlogin*failFont: -adobe-helvetica-bold-r-normal--20-140-75-75-p-103-iso8859-1
++xlogin*greetFont: -adobe-helvetica-bold-o-normal--25-180-100-100-p-138-iso8859-1
++xlogin*font: -adobe-helvetica-medium-r-normal--20-140-100-100-p-100-iso8859-1
++xlogin*promptFont: -adobe-helvetica-bold-r-normal--20-140-100-100-p-105-iso8859-1
++xlogin*failFont: -adobe-helvetica-bold-r-normal--20-140-100-100-p-105-iso8859-1
+/**/#if PLANES >= 8
+xlogin*logoFileName: BITMAPDIR/**//XDM_PIXMAP
++/**/#else
++xlogin*logoFileName: BITMAPDIR/**//XDM_BWPIXMAP
++/**/#endif
/**/#else
-xlogin*greetFont: -adobe-helvetica-bold-o-normal--17-120-100-100-p-92-iso8859-1
-+xlogin*logoFileName: BITMAPDIR/**//XDM_BWPIXMAP
-+/**/#endif
-+/**/#else
-+xlogin*greetFont: -adobe-helvetica-bold-o-normal--14-140-100-100-p-92-iso8859-1
++xlogin*greetFont: -adobe-helvetica-bold-o-normal--14-140-75-75-p-82-iso8859-1
xlogin*font: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1
xlogin*promptFont: -adobe-helvetica-bold-r-normal--12-120-75-75-p-70-iso8859-1
-xlogin*failFont: -adobe-helvetica-bold-o-normal--14-140-75-75-p-82-iso8859-1
-+xlogin*failFont: -adobe-helvetica-bold-o-normal--12-120-75-75-p-82-iso8859-1
++xlogin*failFont: -adobe-helvetica-bold-r-normal--12-120-75-75-p-70-iso8859-1
/**/#endif
#endif /* XPM */
/**/#ifdef COLOR
@@ -173,57 +486,193 @@
xlogin*useShape: true
xlogin*logoPadding: 10
#endif /* XPM */
---- xc/programs/xdm/config/xdm-conf.cpp.orig Sun Dec 29 17:28:54 2002
-+++ xc/programs/xdm/config/xdm-conf.cpp Sun Dec 29 17:32:40 2002
-@@ -10,19 +10,21 @@
- DisplayManager.keyFile: XDMDIR/xdm-keys
- DisplayManager.servers: XDMDIR/Xservers
- DisplayManager.accessFile: XDMDIR/Xaccess
-+DisplayManager.authDir: XDMVARDIR
- DisplayManager.willing: SU nobody -c XDMDIR/Xwilling
- ! All displays should use authorization, but we cannot be sure
- ! X terminals may not be configured that way, so they will require
- ! individual resource settings.
- DisplayManager*authorize: true
--! The following three resources set up display :0 as the console.
--DisplayManager._0.setup: XDMDIR/Xsetup_0
--DisplayManager._0.startup: XDMDIR/GiveConsole
--DisplayManager._0.reset: XDMDIR/TakeConsole
--!
-+DisplayManager*setup: XDMDIR/Xsetup
-+DisplayManager*startup: XDMDIR/Xstartup
-+DisplayManager*reset: XDMDIR/Xreset
- DisplayManager*resources: XDMDIR/Xresources
- DisplayManager*session: XDMDIR/Xsession
- DisplayManager*authComplain: true
-+!
-+DisplayManager*userPath: /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
-+DisplayManager*systemPath: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
- #ifdef XPM
- DisplayManager*loginmoveInterval: 10
- #endif /* XPM */
---- xc/programs/xdm/dm.c.orig Sun Dec 29 17:35:59 2002
-+++ xc/programs/xdm/dm.c Sun Dec 29 17:41:22 2002
-@@ -40,6 +40,7 @@
- # include "dm_error.h"
+--- xc/programs/xdm~/daemon.c 2002-12-04 11:53:39.000000000 -0500
++++ xc/programs/xdm/daemon.c 2003-09-15 14:28:21.000000000 -0500
+@@ -87,7 +87,7 @@
+ break;
+ case -1:
+ /* error */
+- LogError ("daemon fork failed, errno = %d\n", errno);
++ LogError ("daemon fork failed: %s\n", _SysErrorMsg (errno));
+ break;
- # include <stdio.h>
-+# include <string.h>
+ default: {
+@@ -107,7 +107,7 @@
+ #endif
+ if (stat != 0)
+ LogError ("setting process group for daemon failed: %s\n",
+- strerror(errno));
++ _SysErrorMsg (errno));
+ #endif /* ! (CSRG_BASED || SYSV || SVR4 || __QNXNTO__ || __GLIBC__) */
+ }
+ exit (0);
+@@ -118,28 +118,29 @@
+ BecomeDaemon (void)
+ {
+ /*
+- * Close standard file descriptors and get rid of controlling tty
++ * Get rid of controlling tty. We would close standard file
++ * descriptors as well, but that interferes with our logging.
+ */
+
+ /* If our C library has the daemon() function, just use it. */
+ #if defined(__GLIBC__) || defined(CSRG_BASED)
+- daemon (0, 0);
++ if ((daemon (0, 1)) == -1) {
++ if (errno) {
++ LogError ("unable to daemonize: %s\n", _SysErrorMsg (errno));
++ } else {
++ LogError ("unable to daemonize\n");
++ }
++ }
+ #else
+- int i;
+-
+ # if defined(SYSV) || defined(SVR4) || defined(__QNXNTO__)
+ setpgrp ();
+ # else
+ setpgrp (0, getpid ());
+ # endif
+
+- close (0);
+- close (1);
+- close (2);
+-
+ # if !defined(__UNIXOS2__) && !defined(__CYGWIN__)
+ # if !((defined(SYSV) || defined(SVR4)) && defined(i386))
+- if ((i = open ("/dev/tty", O_RDWR)) >= 0) { /* did open succeed? */
++ if ((int i = open ("/dev/tty", O_RDWR)) >= 0) { /* did open succeed? */
+ # if defined(USG) && defined(TCCLRCTTY)
+ int zero = 0;
+ (void) ioctl (i, TCCLRCTTY, &zero);
+@@ -148,19 +149,12 @@
+ int zero = 0;
+ (void) ioctl (i, TIOCTTY, &zero);
+ # else
+- (void) ioctl (i, TIOCNOTTY, (char *) 0); /* detach, BSD style */
++ (void) ioctl (i, TIOCNOTTY, (char *) 0); /* detach, BSD style */
+ # endif
+ # endif
+ (void) close (i);
+ }
+ # endif /* !((SYSV || SVR4) && i386) */
+ # endif /* !__UNIXOS2__ && !__CYGWIN__*/
+-
+- /*
+- * Set up the standard file descriptors.
+- */
+- (void) open ("/", O_RDONLY); /* root inode already in core */
+- (void) dup2 (0, 1);
+- (void) dup2 (0, 2);
+ #endif
+ }
+diff -urN xc/programs/xdm~/dm.c xc/programs/xdm/dm.c
+--- xc/programs/xdm~/dm.c 2003-02-23 17:03:35.000000000 -0500
++++ xc/programs/xdm/dm.c 2003-02-23 17:04:25.000000000 -0500
+@@ -35,41 +35,42 @@
+ * display manager
+ */
+
+-# include "dm.h"
+-# include "dm_auth.h"
+-# include "dm_error.h"
++#include "dm.h"
++#include "dm_auth.h"
++#include "dm_error.h"
+
+-# include <stdio.h>
++#include <stdio.h>
++#include <string.h>
#ifdef X_POSIX_C_SOURCE
- #define _POSIX_C_SOURCE X_POSIX_C_SOURCE
- #include <signal.h>
+-#define _POSIX_C_SOURCE X_POSIX_C_SOURCE
+-#include <signal.h>
+-#undef _POSIX_C_SOURCE
+-#else
+-#if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE)
+-#include <signal.h>
+-#else
+-#define _POSIX_SOURCE
+-#include <signal.h>
+-#undef _POSIX_SOURCE
+-#endif
++# define _POSIX_C_SOURCE X_POSIX_C_SOURCE
++# include <signal.h>
++# undef _POSIX_C_SOURCE
++#else
++# if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE)
++# include <signal.h>
++# else
++# define _POSIX_SOURCE
++# include <signal.h>
++# undef _POSIX_SOURCE
++# endif
+ #endif
+ #ifdef __NetBSD__
+-#include <sys/param.h>
++# include <sys/param.h>
+ #endif
+
+ #ifndef sigmask
+-#define sigmask(m) (1 << ((m - 1)))
++# define sigmask(m) (1 << ((m - 1)))
+ #endif
+
+-# include <sys/stat.h>
+-# include <errno.h>
+-# include <X11/Xfuncproto.h>
+-# include <stdarg.h>
++#include <sys/stat.h>
++#include <errno.h>
++#include <X11/Xfuncproto.h>
++#include <stdarg.h>
+
+ #ifndef F_TLOCK
+-#ifndef X_NOT_POSIX
++# ifndef X_NOT_POSIX
+ # include <unistd.h>
+-#endif
++# endif
+ #endif
+
+
@@ -100,7 +101,9 @@
static SIGVAL ChildNotify (int n);
#endif
-static int StorePid (void);
-+static int pidFd;
-+static FILE *pidFilePtr;
-+static int StorePid (void);
++static int pidFd;
++static FILE *pidFilePtr;
++static long StorePid (void);
static int parent_pid = -1; /* PID of parent xdm process */
-@@ -138,7 +141,6 @@
+@@ -124,34 +127,42 @@
+ InitResources (argc, argv);
+ SetConfigFileTime ();
+ LoadDMResources ();
++ if (debugLevel == 0)
++ {
++ if (getuid() != 0)
++ {
+ /*
+- * Only allow root to run in non-debug mode to avoid problems
++ * only allow root to run in non-debug mode to avoid problems
+ */
+- if (debugLevel == 0 && getuid() != 0)
+- {
+- fprintf (stderr, "Only root wants to run %s\n", argv[0]);
++ LogError ("only root run can run %s in non-debug mode; exiting\n",
++ argv[0]);
+ exit (1);
+ }
++ /*
++ * if not debugging, send messages to the log file
++ */
++ InitErrorLog ();
++ }
+ if (debugLevel == 0 && daemonMode)
+ BecomeOrphan ();
+ if (debugLevel >= 10)
nofork_session = 1;
if (debugLevel == 0 && daemonMode)
BecomeDaemon ();
@@ -231,27 +680,317 @@
if ((oldpid = StorePid ()))
{
if (oldpid == -1)
-@@ -761,9 +763,6 @@
+- LogError ("Can't create/lock pid file %s\n", pidFile);
++ LogError ("error opening process-id file %s; exiting\n", pidFile);
+ else
+- LogError ("Can't lock pid file %s, another xdm is running (pid %d)\n",
+- pidFile, oldpid);
++ LogError ("process-id file %s indicates another xdm is "
++ "running (pid %d); exiting\n", pidFile, oldpid);
+ exit (1);
+ }
+- if (debugLevel == 0)
+- InitErrorLog ();
+
+- if (nofork_session == 0) {
++ LogInfo ("starting\n");
++
++ if (nofork_session == 0)
++ {
+ /* Clean up any old Authorization files */
+ /* AUD: all good? */
+ snprintf(cmdbuf, sizeof(cmdbuf), "/bin/rm -f %s/authdir/authfiles/A*", authDir);
+@@ -184,6 +195,7 @@
+ #ifndef UNRELIABLE_SIGNALS
+ (void) Signal (SIGCHLD, ChildNotify);
+ #endif
++ Debug ("startup successful; entering main loop\n");
+ while (
+ #ifdef XDMCP
+ AnyWellKnownSockets() ||
+@@ -202,7 +214,8 @@
+ #endif
+ }
+ Debug ("Nothing left to do, exiting\n");
+- exit(0);
++ LogInfo ("exiting\n");
++ exit (0);
+ /*NOTREACHED*/
+ }
+
+@@ -363,13 +376,14 @@
+ *
+ * See defect XWSog08655 for more information.
+ */
+- Debug ("Child xdm caught SIGTERM before it remove that signal.\n");
++ Debug ("Child xdm caught SIGTERM before it removed that signal.\n");
+ (void) Signal (n, SIG_DFL);
+ TerminateProcess (getpid(), SIGTERM);
+ errno = olderrno;
+ return;
+ }
+ Debug ("Shutting down entire manager\n");
++ LogInfo ("shutting down\n");
+ #ifdef XDMCP
+ DestroyWellKnownSockets ();
+ #endif
+@@ -420,43 +434,45 @@
+ /* XXX classic System V signal race condition here with RescanNotify */
+ if ((pid = wait (&status)) != -1)
+ #else
+-#ifndef X_NOT_POSIX
++# ifndef X_NOT_POSIX
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGCHLD);
+ sigaddset(&mask, SIGHUP);
+ sigprocmask(SIG_BLOCK, &mask, &omask);
+ Debug ("signals blocked\n");
+-#else
++# else
+ omask = sigblock (sigmask (SIGCHLD) | sigmask (SIGHUP));
+ Debug ("signals blocked, mask was 0x%x\n", omask);
+-#endif
++# endif
+ if (!ChildReady && !Rescan)
+-#ifndef X_NOT_POSIX
++# ifndef X_NOT_POSIX
+ sigsuspend(&omask);
+-#else
++# else
+ sigpause (omask);
+-#endif
++# endif
+ ChildReady = 0;
+-#ifndef X_NOT_POSIX
++# ifndef X_NOT_POSIX
+ sigprocmask(SIG_SETMASK, &omask, (sigset_t *)NULL);
+-#else
++# else
+ sigsetmask (omask);
+-#endif
+-#ifndef X_NOT_POSIX
++# endif
++# ifndef X_NOT_POSIX
+ while ((pid = waitpid (-1, &status, WNOHANG)) > 0)
+-#else
++# else
+ while ((pid = wait3 (&status, WNOHANG, (struct rusage *) 0)) > 0)
+-#endif
+-#endif
++# endif
++#endif /* UNRELIABLE_SIGNALS */
+ {
+ Debug ("Manager wait returns pid: %d sig %d core %d code %d\n",
+ pid, waitSig(status), waitCore(status), waitCode(status));
+ if (autoRescan)
+ RescanIfMod ();
+ /* SUPPRESS 560 */
+- if ((d = FindDisplayByPid (pid))) {
++ if ((d = FindDisplayByPid (pid)))
++ {
+ d->pid = -1;
+- switch (waitVal (status)) {
++ switch (waitVal (status))
++ {
+ case UNMANAGE_DISPLAY:
+ Debug ("Display exited with UNMANAGE_DISPLAY\n");
+ StopDisplay (d);
+@@ -470,12 +486,6 @@
+ else
+ RestartDisplay (d, FALSE);
+ break;
+- default:
+- Debug ("Display exited with unknown status %d\n", waitVal(status));
+- LogError ("Unknown session exit code %d from process %d\n",
+- waitVal (status), pid);
+- StopDisplay (d);
+- break;
+ case OPENFAILED_DISPLAY:
+ Debug ("Display exited with OPENFAILED_DISPLAY, try %d of %d\n",
+ d->startTries, d->startAttempts);
+@@ -492,7 +502,7 @@
+ d->status == zombie ||
+ ++d->startTries >= d->startAttempts)
+ {
+- LogError ("Display %s is being disabled\n", d->name);
++ LogError ("display %s is being disabled\n", d->name);
+ StopDisplay (d);
+ }
+ else
+@@ -512,13 +522,15 @@
+ time(&Time);
+ Debug("time %i %i\n",Time,d->lastCrash);
+ if (d->lastCrash &&
+- ((Time - d->lastCrash) < XDM_BROKEN_INTERVAL)) {
++ ((Time - d->lastCrash) < XDM_BROKEN_INTERVAL))
++ {
+ Debug("Server crash frequency too high:"
+ " removing display %s\n",d->name);
+ LogError("Server crash rate too high:"
+ " removing display %s\n",d->name);
+ RemoveDisplay (d);
+- } else
++ }
++ else
+ d->lastCrash = Time;
+ }
+ break;
+@@ -527,10 +539,20 @@
+ d->startTries, d->startAttempts);
+ if (d->displayType.origin == FromXDMCP ||
+ d->status == zombie ||
+- ++d->startTries >= d->startAttempts) {
+- LogError ("Display %s is being disabled\n", d->name);
++ ++d->startTries >= d->startAttempts)
++ {
++ /*
++ * During normal xdm shutdown, killed local X servers
++ * can be zombies; this is not an error.
++ */
++ if (d->status == zombie &&
++ (d->startTries < d->startAttempts))
++ LogInfo ("display %s is being disabled\n", d->name);
++ else
++ LogError ("display %s is being disabled\n", d->name);
+ StopDisplay(d);
+- } else
++ }
++ else
+ RestartDisplay (d, TRUE);
+ break;
+ case REMANAGE_DISPLAY:
+@@ -545,6 +567,13 @@
+ else
+ RestartDisplay (d, FALSE);
+ break;
++ default:
++ Debug ("Display %s exited with unknown status %d\n",
++ d->name, waitVal(status));
++ LogError ("display %s (pid %ld) exited with unexpected status "
++ "%d\n", d->name, waitVal (status), (long) pid);
++ StopDisplay (d);
++ break;
+ }
+ }
+ /* SUPPRESS 560 */
+@@ -558,12 +587,15 @@
+ RemoveDisplay (d);
+ break;
+ case phoenix:
+- Debug ("Phoenix server arises, restarting display %s\n", d->name);
++ Debug ("Phoenix server arises, restarting display %s\n",
++ d->name);
+ d->status = notRunning;
+ break;
+ case running:
+- Debug ("Server for display %s terminated unexpectedly, status %d %d\n", d->name, waitVal (status), status);
+- LogError ("Server for display %s terminated unexpectedly: %d\n", d->name, waitVal (status));
++ Debug ("Server for display %s terminated unexpectedly, "
++ "status %d %d\n", d->name, waitVal (status), status);
++ LogError ("Server for display %s terminated unexpectedly: %d\n",
++ d->name, waitVal (status));
+ if (d->pid != -1)
+ {
+ Debug ("Terminating session pid %d\n", d->pid);
+@@ -571,7 +603,8 @@
+ }
+ break;
+ case notRunning:
+- Debug ("Server exited for notRunning session on display %s\n", d->name);
++ Debug ("Server exited for notRunning session on display %s\n",
++ d->name);
+ break;
+ }
+ }
+@@ -588,7 +621,8 @@
+ {
+ if (d->displayType.origin == FromFile)
+ {
+- switch (d->state) {
++ switch (d->state)
++ {
+ case MissingEntry:
+ StopDisplay (d);
+ break;
+@@ -614,10 +648,12 @@
+ int pid;
+
+ Debug ("StartDisplay %s\n", d->name);
++ LogInfo ("starting X server on %s\n", d->name);
+ LoadServerResources (d);
+ if (d->displayType.location == Local)
+ {
+- /* don't bother pinging local displays; we'll
++ /*
++ * don't bother pinging local displays; we'll
+ * certainly notice when they exit
+ */
+ d->pingInterval = 0;
+@@ -637,7 +673,8 @@
+ }
+ if (d->serverPid == -1 && !StartServer (d))
+ {
+- LogError ("Server for display %s can't be started, session disabled\n", d->name);
++ LogError ("Server for display %s can't be started, session "
++ "disabled\n", d->name);
+ RemoveDisplay (d);
+ return;
+ }
+@@ -655,7 +692,8 @@
+ switch (pid)
+ {
+ case 0:
+- if (!nofork_session) {
++ if (!nofork_session)
++ {
+ CleanUpChild ();
+ (void) Signal (SIGPIPE, SIG_IGN);
+ }
+@@ -739,7 +777,8 @@
+ ClearCloseOnFork (int fd)
+ {
+ FD_CLR (fd, &CloseMask);
+- if (fd == max) {
++ if (fd == max)
++ {
+ while (--fd >= 0)
+ if (FD_ISSET (fd, &CloseMask))
+ break;
+@@ -761,100 +800,68 @@
max = 0;
}
-static int pidFd;
-static FILE *pidFilePtr;
-
- static int
+-static int
++static long
StorePid (void)
{
-@@ -779,77 +778,24 @@
- pidFile);
- return -1;
- }
+- int oldpid;
++ long oldpid;
++ char pidstr[11]; /* enough space for a 32-bit pid plus \0 */
++ size_t pidstrlen;
+
+- if (pidFile[0] != '\0') {
+- pidFd = open (pidFile, O_RDWR);
+- if (pidFd == -1 && errno == ENOENT)
+- pidFd = open (pidFile, O_RDWR|O_CREAT, 0666);
+- if (pidFd == -1 || !(pidFilePtr = fdopen (pidFd, "r+")))
++ if (pidFile[0] != '\0')
++ {
++ pidFd = open (pidFile, O_WRONLY|O_CREAT|O_EXCL, 0666);
++ if (pidFd == -1)
+ {
+- LogError ("process-id file %s cannot be opened\n",
+- pidFile);
+- return -1;
+- }
- if (fscanf (pidFilePtr, "%d\n", &oldpid) != 1)
-+ if (fscanf(pidFilePtr, "%d\n", &oldpid) != 1)
- oldpid = -1;
+- oldpid = -1;
- fseek (pidFilePtr, 0l, 0);
- if (lockPidFile)
-+ if (fseek(pidFilePtr, 0L, SEEK_SET) == -1)
- {
+- {
-#ifdef F_SETLK
-#ifndef SEEK_SET
-#define SEEK_SET 0
@@ -261,48 +1000,73 @@
- lock_data.l_whence = SEEK_SET;
- lock_data.l_start = lock_data.l_len = 0;
- if (fcntl(pidFd, F_SETLK, &lock_data) == -1)
-- {
++ if (errno == EEXIST)
+ {
- if (errno == EAGAIN)
- return oldpid;
- else
-- return -1;
-- }
++ /* pidFile already exists; see if we can open it */
++ pidFilePtr = fopen (pidFile, "r");
++ if (pidFilePtr == NULL)
++ {
++ LogError ("cannot open process-id file %s for reading: "
++ "%s\n", pidFile, _SysErrorMsg (errno));
+ return -1;
++ }
++ if (fscanf (pidFilePtr, "%ld\n", &oldpid) != 1)
++ {
++ LogError ("existing process-id file %s empty or contains "
++ "garbage\n", pidFile);
++ oldpid = -1;
++ }
++ fclose (pidFilePtr);
++ return oldpid;
+ }
-#else
-#ifdef LOCK_EX
- if (flock (pidFd, LOCK_EX|LOCK_NB) == -1)
- {
- if (errno == EWOULDBLOCK)
- return oldpid;
-- else
+ else
- return -1;
- }
-#else
- if (lockf (pidFd, F_TLOCK, 0) == -1)
-- {
+ {
- if (errno == EACCES)
- return oldpid;
- else
- return -1;
-- }
++ LogError ("cannot fdopen process-id file %s for writing: "
++ "%s\n", pidFile, _SysErrorMsg (errno));
++ return -1;
+ }
-#endif
-#endif
-+ LogError("cannot seek PID file %s: %s\n", pidFile,
-+ strerror(errno));
-+ return -1;
-+ }
-+ if (fprintf(pidFilePtr, "%5ld\n", (long)getpid()) != 6) {
-+ LogError("cannot write to PID file %s: %s\n", pidFile,
-+ strerror(errno));
-+ return -1;
}
- fprintf (pidFilePtr, "%5ld\n", (long)getpid ());
++ if ((pidFilePtr = fdopen (pidFd, "w")) == NULL)
++ {
++ LogError ("cannot open process-id file %s for writing: %s\n",
++ pidFile, _SysErrorMsg (errno));
++ return -1;
++ }
++ (void) snprintf (pidstr, 11, "%ld", (long) getpid ());
++ pidstrlen = strlen (pidstr);
++ if (fprintf (pidFilePtr, "%s\n", pidstr) != ( pidstrlen + 1))
++ {
++ LogError ("cannot write to process-id file %s: %s\n", pidFile,
++ _SysErrorMsg (errno));
++ return -1;
++ }
(void) fflush (pidFilePtr);
- RegisterCloseOnFork (pidFd);
+ (void) fclose (pidFilePtr);
}
return 0;
}
--
+
-#if 0
-void
-UnlockPidFile (void)
@@ -327,336 +1091,865 @@
- fclose (pidFilePtr);
-}
-#endif
-
+-
#ifndef HAS_SETPROCTITLE
void SetTitle (char *name, ...)
-
---- xc/programs/xdm~/genauth.c 2002-11-06 00:03:23.000000000 -0500
-+++ xc/programs/xdm/genauth.c 2002-11-06 00:06:42.000000000 -0500
-@@ -66,52 +66,27 @@
+ {
+-#ifndef NOXDMTITLE
++# ifndef NOXDMTITLE
+ char *p = Title;
+ int left = TitleLen;
+ char *s;
+@@ -879,6 +886,6 @@
+ --left;
+ }
+ va_end(args);
+-#endif
++# endif /* NOXDMTITLE */
+ }
+-#endif
++#endif /* HAS_SETPROCTITLE */
+diff -urN xc/programs/xdm~/dm_auth.h xc/programs/xdm/dm_auth.h
+--- xc/programs/xdm~/dm_auth.h 2000-05-31 02:15:11.000000000 -0500
++++ xc/programs/xdm/dm_auth.h 2003-02-23 17:04:25.000000000 -0500
+@@ -42,18 +42,40 @@
+ extern void MitInitAuth (unsigned short name_len, char *name);
+ extern Xauth *MitGetAuth (unsigned short namelen, char *name);
- #endif
++/* xdmauth.c */
+ #ifdef HASXDMAUTH
+ extern void XdmInitAuth (unsigned short name_len, char *name);
+ extern Xauth *XdmGetAuth (unsigned short namelen, char *name);
+-#ifdef XDMCP
++# ifdef XDMCP
+ extern void XdmGetXdmcpAuth (
+ struct protoDisplay *pdpy,
+ unsigned short authorizationNameLen,
+ char *authorizationName);
+-#else
+-#define XdmGetXdmcpAuth NULL
+-#endif
+-#endif
++
++extern int XdmCheckAuthentication (
++ struct protoDisplay *pdpy,
++ ARRAY8Ptr displayID,
++ ARRAY8Ptr authenticationName,
++ ARRAY8Ptr authenticationData);
++
++typedef unsigned char auth_cblock[8]; /* block size */
++
++typedef struct auth_ks_struct { auth_cblock _; } auth_wrapper_schedule[16];
++
++extern void _XdmcpAuthSetup (auth_cblock key,
++ auth_wrapper_schedule schedule);
++
++extern void _XdmcpAuthDoIt (auth_cblock input,
++ auth_cblock output,
++ auth_wrapper_schedule schedule,
++ int edflag);
++
++extern void _XdmcpWrapperToOddParity (unsigned char *in,
++ unsigned char *out);
++# else
++# define XdmGetXdmcpAuth NULL
++# endif
++#endif /* HASXDMAUTH */
--# define FILE_LIMIT 1024 /* no more than this many buffers */
-+#define FILE_LIMIT 1024 /* no more than this many buffers */
+ #ifdef SECURE_RPC
+ extern void SecureRPCInitAuth (unsigned short name_len, char *name);
+@@ -68,15 +90,12 @@
+ /* auth.c */
+ extern int ValidAuthorization (unsigned short name_length, char *name);
--#if !defined(ARC4_RANDOM) && !defined(DEV_RANDOM)
--static int
--sumFile (char *name, long sum[2])
--{
-- long buf[1024*2];
-- int cnt;
-- int fd;
-- int loops;
-- int reads;
-- int i;
-- int ret_status = 0;
-
-- fd = open (name, O_RDONLY);
-- if (fd < 0) {
-- LogError("Cannot open randomFile \"%s\", errno = %d\n", name, errno);
-- return 0;
-- }
--#ifdef FRAGILE_DEV_MEM
-- if (strcmp(name, "/dev/mem") == 0) lseek (fd, (off_t) 0x100000, SEEK_SET);
--#endif
-- reads = FILE_LIMIT;
-- sum[0] = 0;
-- sum[1] = 0;
-- while ((cnt = read (fd, (char *) buf, sizeof (buf))) > 0 && --reads > 0) {
-- loops = cnt / (2 * sizeof (long));
-- for (i = 0; i < loops; i+= 2) {
-- sum[0] += buf[i];
-- sum[1] += buf[i+1];
-- ret_status = 1;
-- }
-- }
-- if (cnt < 0)
-- LogError("Cannot read randomFile \"%s\", errno = %d\n", name, errno);
-- close (fd);
-- return ret_status;
--}
-+/*
-+ * Historically, if HASXDMAUTH was defined but neither ARC4_RANDOM nor
-+ * DEV_RANDOM were defined, xdm provided a function called sumFile() that
-+ * would read straight from /dev/mem and use that as an entropy source.
-+ * However, that's a bad idea because A) it's not very entropic and B) some
-+ * OSes have hardware registers mapped into /dev/mem, and even just reading
-+ * from them can cause machine checks. It's a Bad Thing to do.
-+ */
-+#ifdef HASXDMAUTH
-+# if !defined(ARC4_RANDOM) && !defined(DEV_RANDOM)
-+# error neither ARC4_RANDOM nor DEV_RANDOM defined; no entropy collection mechanism available
-+# endif
- #endif
+ #ifdef XDMCP
+-
+ extern void
+ SetProtoDisplayAuthorization (
+ struct protoDisplay *pdpy,
+ unsigned short authorizationNameLen,
+ char *authorizationName);
+-
+ #endif /* XDMCP */
- #ifdef HASXDMAUTH
- static void
- InitXdmcpWrapper (void)
+ extern int SaveServerAuthorizations (struct display *d, Xauth **auths, int count);
+diff -urN xc/programs/xdm~/dm_error.h xc/programs/xdm/dm_error.h
+--- xc/programs/xdm~/dm_error.h 1998-10-10 10:25:33.000000000 -0500
++++ xc/programs/xdm/dm_error.h 2003-02-23 17:04:25.000000000 -0500
+@@ -50,7 +50,6 @@
+ extern void LogInfo (char * fmt, ...) GCC_PRINTFLIKE(1,2);
+ extern void LogOutOfMem (char * fmt, ...) GCC_PRINTFLIKE(1,2);
+ extern void LogPanic (char * fmt, ...) GCC_PRINTFLIKE(1,2);
+-extern void Panic (char * mesg);
+
+
+ #endif /* _DM_ERROR_H_ */
+diff -urN xc/programs/xdm~/error.c xc/programs/xdm/error.c
+--- xc/programs/xdm~/error.c 2003-02-23 17:03:35.000000000 -0500
++++ xc/programs/xdm/error.c 2003-02-23 17:41:04.000000000 -0500
+@@ -34,23 +34,41 @@
+ *
+ * error.c
+ *
+- * Log display manager errors to a file as
+- * we generally do not have a terminal to talk to
++ * Log display manager errors to a file as we generally do not have a
++ * terminal to talk to.
++ *
++ * Because we have child processes, and chatty things like X servers, we do
++ * not use syslog().
+ */
+
+-# include <stdio.h>
+-# include <stdarg.h>
++#include <errno.h>
++#include <stdio.h>
++#include <stdarg.h>
++#include <time.h>
+
+-# include "dm.h"
+-# include "dm_error.h"
++#include "dm.h"
++#include "dm_error.h"
+
+ #define WRITES(fd, buf) write(fd, buf, strlen(buf))
+
+-void LogInfo(char * fmt, ...)
++void
++LogInfo(char * fmt, ...)
{
--
--#ifdef ARC4_RANDOM
-+# ifdef ARC4_RANDOM
- u_int32_t sum[2];
+ char buf[1024];
- sum[0] = arc4random();
-@@ -119,42 +95,30 @@
- *(u_char *)sum = 0;
+- snprintf(buf, sizeof buf, "xdm info (pid %ld): ", (long)getpid());
++ time_t seconds;
++ struct tm *timestamp = NULL;
++ char timebuf[256];
++
++ if (time(&seconds) > (time_t) -1)
++ timestamp = localtime(&seconds);
++
++ strcpy(timebuf, "(time unavailable)");
++
++ if (timestamp != NULL)
++ strftime(timebuf, 255, "%c", timestamp);
++
++ snprintf(buf, sizeof buf, "%s xdm info (pid %ld): ", timebuf, (long)getpid());
+ WRITES(STDERR_FILENO, buf);
+ {
+ va_list args;
+@@ -61,11 +79,24 @@
+ WRITES(STDERR_FILENO, buf);
+ }
- _XdmcpWrapperToOddParity(sum, key);
--
--#elif defined(DEV_RANDOM)
-+# elif defined(DEV_RANDOM)
- int fd;
- unsigned char tmpkey[8];
--
-- if ((fd = open(DEV_RANDOM, O_RDONLY)) >= 0) {
+-void LogError (char * fmt, ...)
++void
++LogError (char * fmt, ...)
+ {
+ char buf[1024];
+
+- snprintf (buf, sizeof buf, "xdm error (pid %ld): ", (long)getpid());
++ time_t seconds;
++ struct tm *timestamp = NULL;
++ char timebuf[256];
+
-+ if ((fd = open(randomFile, O_RDONLY)) >= 0) {
- if (read(fd, tmpkey, 8) == 8) {
- tmpkey[0] = 0;
- _XdmcpWrapperToOddParity(tmpkey, key);
- close(fd);
-- return;
-+ return;
- } else {
- close(fd);
- }
-+ } else {
-+ LogError("cannot open random device \"%s\": %s\n", randomFile,
-+ _SysErrorMsg (errno));
- }
--#else
-- long sum[2];
-- unsigned char tmpkey[8];
--
-- if (!sumFile (randomFile, sum)) {
-- sum[0] = time ((Time_t *) 0);
-- sum[1] = time ((Time_t *) 0);
-- }
-- longtochars (sum[0], tmpkey+0);
-- longtochars (sum[1], tmpkey+4);
-- tmpkey[0] = 0;
-- _XdmcpWrapperToOddParity (tmpkey, key);
--#endif
-+# endif /* ARC4_RANDOM, DEV_RANDOM */
++ if (time(&seconds) > (time_t) -1)
++ timestamp = localtime(&seconds);
++
++ strcpy(timebuf, "(time unavailable)");
++
++ if (timestamp != NULL)
++ strftime(timebuf, 255, "%c", timestamp);
++
++ snprintf (buf, sizeof buf, "%s xdm error (pid %ld): ", timebuf, (long)getpid());
+ WRITES(STDERR_FILENO, buf);
+ {
+ va_list args;
+@@ -76,11 +107,24 @@
+ WRITES(STDERR_FILENO, buf);
}
+
+-void LogPanic (char * fmt, ...)
++void
++LogPanic (char * fmt, ...)
+ {
+ char buf[1024];
+
+- snprintf (buf, sizeof buf, "xdm panic (pid %ld): ", (long)getpid());
++ time_t seconds;
++ struct tm *timestamp = NULL;
++ char timebuf[256];
++
++ if (time(&seconds) > (time_t) -1)
++ timestamp = localtime(&seconds);
++
++ strcpy(timebuf, "(time unavailable)");
++
++ if (timestamp != NULL)
++ strftime(timebuf, 255, "%c", timestamp);
++
++ snprintf (buf, sizeof buf, "%s xdm panic (pid %ld): ", timebuf, (long)getpid());
+ WRITES(STDERR_FILENO, buf);
+ {
+ va_list args;
+@@ -92,8 +136,14 @@
+ _exit (1);
+ }
+
+-void LogOutOfMem (char * fmt, ...)
++void
++LogOutOfMem (char * fmt, ...)
+ {
++ /*
++ * No point messing with allocation of timeval structs and static
++ * buffers for the timestamp string if we're already out of memory...
++ */
++
+ fprintf (stderr, "xdm: out of memory in routine ");
+ {
+ va_list args;
+@@ -104,23 +154,12 @@
+ fflush (stderr);
+ }
+
+-void Panic (char *mesg)
+-{
+- int i;
-
--#endif
+- i = creat ("/dev/console", 0666);
+- write (i, "panic: ", 7);
+- write (i, mesg, strlen (mesg));
+- exit (1);
+-}
-
--#ifndef HASXDMAUTH
--/* A random number generator that is more unpredictable
-- than that shipped with some systems.
-- This code is taken from the C standard. */
-+#else
-+/*
-+ * This is a random number generator that is more unpredictable than that
-+ * shipped with some systems. This code is taken from the C standard.
-+ */
+-
+-void Debug (char * fmt, ...)
++void
++Debug (char * fmt, ...)
+ {
+ char buf[1024];
- static unsigned long int next = 1;
+- if (debugLevel > 0)
+- {
++ if (debugLevel > 0) {
+ va_list args;
+ va_start(args, fmt);
+ vsnprintf (buf, sizeof buf, fmt, args);
+@@ -129,17 +168,26 @@
+ }
+ }
-@@ -170,12 +134,12 @@
+-void InitErrorLog (void)
++void
++InitErrorLog (void)
{
- next = seed;
+- int i;
+- if (errorLogFile[0]) {
+- i = creat (errorLogFile, 0666);
+- if (i != -1) {
+- if (i != 2) {
+- dup2 (i, 2);
+- close (i);
+- }
+- } else
+- LogError ("Cannot open errorLogFile %s\n", errorLogFile);
+- }
++ int fd;
++
++ if (errorLogFile[0]) {
++ /* create the log file if it doesn't already exist */
++ fd = open (errorLogFile, O_WRONLY|O_CREAT|O_EXCL, 0666);
++ if (fd == -1)
++ if (errno == EEXIST)
++ /* log file already exists; append to it */
++ fd = open (errorLogFile, O_WRONLY|O_APPEND);
++ if (fd != -1) {
++ /* redirect stderr to the log file */
++ if (fd != 2) {
++ dup2 (fd, 2);
++ close (fd);
++ }
++ } else
++ fprintf (stderr, "cannot open log file %s: %s\n", errorLogFile,
++ _SysErrorMsg (errno));
++ }
}
--#endif /* no HASXDMAUTH */
-+#endif /* HASXDMAUTH */
+diff -urN xc/programs/xdm~/genauth.c xc/programs/xdm/genauth.c
+--- xc/programs/xdm~/genauth.c 2003-02-23 17:03:31.000000000 -0500
++++ xc/programs/xdm/genauth.c 2003-02-23 17:04:25.000000000 -0500
+@@ -41,6 +41,7 @@
+ # include "dm_error.h"
- void
- GenerateAuthData (char *auth, int len)
+ #include <errno.h>
++#include <fcntl.h>
+
+ #include <time.h>
+ #define Time_t time_t
+@@ -49,12 +50,6 @@
+
+ #ifdef HASXDMAUTH
+
+-typedef unsigned char auth_cblock[8]; /* block size */
+-
+-typedef struct auth_ks_struct { auth_cblock _; } auth_wrapper_schedule[16];
+-
+-extern void _XdmcpWrapperToOddParity();
+-
+ static void
+ longtochars (long l, unsigned char *c)
{
-- long ldata[2];
-+ long ldata[2];
+diff -urN xc/programs/xdm~/greeter/verify.c xc/programs/xdm/greeter/verify.c
+--- xc/programs/xdm~/greeter/verify.c 2003-02-23 17:03:35.000000000 -0500
++++ xc/programs/xdm/greeter/verify.c 2003-02-23 17:04:25.000000000 -0500
+@@ -367,7 +367,7 @@
+ errno = 0;
+ sp = getspnam(greet->name);
+ if (sp == NULL) {
+- Debug ("getspnam() failed, errno=%d. Are you root?\n", errno);
++ Debug ("getspnam() failed: %s", _SysErrorMsg (errno));
+ } else {
+ user_pass = sp->sp_pwdp;
+ }
+diff -urN xc/programs/xdm~/session.c xc/programs/xdm/session.c
+--- xc/programs/xdm~/session.c 2001-12-14 15:01:23.000000000 -0500
++++ xc/programs/xdm/session.c 2003-02-23 17:04:25.000000000 -0500
+@@ -60,17 +60,17 @@
+ #endif
- #ifdef ITIMER_REAL
- {
-@@ -187,53 +151,53 @@
- }
- #else
- {
--#ifndef __UNIXOS2__
-- long time ();
+ #ifndef GREET_USER_STATIC
+-#include <dlfcn.h>
+-#ifndef RTLD_NOW
+-#define RTLD_NOW 1
-#endif
-+# ifndef __UNIXOS2__
-+ long time ();
++# include <dlfcn.h>
++# ifndef RTLD_NOW
++# define RTLD_NOW 1
+# endif
+ #endif
- ldata[0] = time ((long *) 0);
- ldata[1] = getpid ();
- }
+ static int runAndWait (char **args, char **environ);
+
+-#if defined(CSRG_BASED) || defined(__osf__) || defined(__DARWIN__) || defined(__QNXNTO__)
+-#include <sys/types.h>
+-#include <grp.h>
++#if defined(CSRG_BASED) || defined(__osf__) || defined(__DARWIN__) || defined(__QNXNTO__) || defined(__GLIBC__)
++# include <sys/types.h>
++# include <grp.h>
+ #else
+ /* should be in <grp.h> */
+ extern void setgrent(void);
+@@ -82,28 +82,34 @@
+ extern struct spwd *getspnam(GETSPNAM_ARGS);
+ extern void endspent(void);
+ #endif
+-#if defined(CSRG_BASED)
+-#include <pwd.h>
+-#include <unistd.h>
++
++#if defined(CSRG_BASED) || defined(__GLIBC__)
++# include <pwd.h>
++# include <unistd.h>
+ #else
+ extern struct passwd *getpwnam(GETPWNAM_ARGS);
+-#ifdef linux
++# ifdef linux
+ extern void endpwent(void);
-#endif
-+#endif /* ITIMER_REAL */
++# endif
++# ifndef __GLIBC__
+ extern char *crypt(CRYPT_ARGS);
++# endif
+ #endif
+
- #ifdef HASXDMAUTH
- {
-- int bit;
-- int i;
-- auth_wrapper_schedule schedule;
-- unsigned char data[8];
-- static int xdmcpAuthInited;
--
-+ int bit;
-+ int i;
-+ auth_wrapper_schedule schedule;
-+ unsigned char data[8];
-+ static int xdmcpAuthInited;
-+
- longtochars (ldata[0], data+0);
- longtochars (ldata[1], data+4);
-- if (!xdmcpAuthInited)
+ #ifdef USE_PAM
+-pam_handle_t **thepamhp()
++pam_handle_t **
++thepamhp ()
+ {
+ static pam_handle_t *pamh = NULL;
+ return &pamh;
+ }
+
+-pam_handle_t *thepamh()
++pam_handle_t *
++thepamh ()
+ {
+ pam_handle_t **pamhp;
+
+- pamhp = thepamhp();
++ pamhp = thepamhp ();
+ if (pamhp)
+ return *pamhp;
+ else
+@@ -136,12 +142,12 @@
+ endgrent,
+ #ifdef USESHADOW
+ getspnam,
+-#ifndef QNX4
++# ifndef QNX4
+ endspent,
+-#endif /* QNX4 doesn't use endspent */
++# endif /* QNX4 doesn't use endspent */
+ #endif
+ getpwnam,
+-#ifdef linux
++#if defined(linux) || defined(__GLIBC__)
+ endpwent,
+ #endif
+ crypt,
+@@ -189,7 +195,7 @@
+ }
+
+ #if defined(_POSIX_SOURCE) || defined(SYSV) || defined(SVR4)
+-#define killpg(pgrp, sig) kill(-(pgrp), sig)
++# define killpg(pgrp, sig) kill(-(pgrp), sig)
+ #endif
+
+ static void
+@@ -577,35 +583,33 @@
+
+ #ifndef AIXV3
+ #ifndef HAS_SETUSERCONTEXT
+- if (setgid(verify->gid) < 0)
- {
-+ if (!xdmcpAuthInited) {
- InitXdmcpWrapper ();
- xdmcpAuthInited = 1;
+- LogError("setgid %d (user \"%s\") failed, errno=%d\n",
+- verify->gid, name, errno);
++ if (setgid (verify->gid) < 0) {
++ LogError ("setgid %d (user \"%s\") failed: %s\n",
++ verify->gid, name, _SysErrorMsg (errno));
+ return (0);
}
- _XdmcpAuthSetup (key, schedule);
-- for (i = 0; i < len; i++) {
-+ for (i = 0; i < len; i++) {
- auth[i] = 0;
- for (bit = 1; bit < 256; bit <<= 1) {
- _XdmcpAuthDoIt (data, data, schedule, 1);
- if ((data[0] + data[1]) & 0x4)
- auth[i] |= bit;
+ #if defined(BSD) && (BSD >= 199103)
+- if (setlogin(name) < 0)
+- {
+- LogError("setlogin for \"%s\" failed, errno=%d", name, errno);
+- return(0);
++ if (setlogin (name) < 0) {
++ LogError ("setlogin for \"%s\" failed: %s\n", name,
++ _SysErrorMsg (errno));
++ return (0);
+ }
+ #endif
+ #ifndef QNX4
+- if (initgroups(name, verify->gid) < 0)
+- {
+- LogError("initgroups for \"%s\" failed, errno=%d\n", name, errno);
++ if (initgroups (name, verify->gid) < 0) {
++ LogError ("initgroups for \"%s\" failed: %s\n", name,
++ _SysErrorMsg (errno));
+ return (0);
+ }
+ #endif /* QNX4 doesn't support multi-groups, no initgroups() */
+ #ifdef USE_PAM
+- if (thepamh()) {
+- pam_setcred(thepamh(), PAM_ESTABLISH_CRED);
++ if (thepamh ()) {
++ pam_setcred (thepamh (), PAM_ESTABLISH_CRED);
+ }
+ #endif
+- if (setuid(verify->uid) < 0)
+- {
+- LogError("setuid %d (user \"%s\") failed, errno=%d\n",
+- verify->uid, name, errno);
++ if (setuid (verify->uid) < 0) {
++ LogError ("setuid %d (user \"%s\") failed: %s\n",
++ verify->uid, name, _SysErrorMsg (errno));
+ return (0);
+ }
+ #else /* HAS_SETUSERCONTEXT */
+@@ -613,20 +617,17 @@
+ * Set the user's credentials: uid, gid, groups,
+ * environment variables, resource limits, and umask.
+ */
+- pwd = getpwnam(name);
+- if (pwd)
+- {
+- if (setusercontext(NULL, pwd, pwd->pw_uid, LOGIN_SETALL) < 0)
+- {
+- LogError("setusercontext for \"%s\" failed, errno=%d\n", name,
+- errno);
++ pwd = getpwnam (name);
++ if (pwd) {
++ if (setusercontext (NULL, pwd, pwd->pw_uid, LOGIN_SETALL) < 0) {
++ LogError ("setusercontext for \"%s\" failed: %s\n", name,
++ _SysErrorMsg (errno));
+ return (0);
}
-- }
-+ }
+- endpwent();
+- }
+- else
+- {
+- LogError("getpwnam for \"%s\" failed, errno=%d\n", name, errno);
++ endpwent ();
++ } else {
++ LogError ("getpwnam for \"%s\" failed: %s\n", name,
++ _SysErrorMsg (errno));
+ return (0);
+ }
+ #endif /* HAS_SETUSERCONTEXT */
+@@ -635,9 +636,9 @@
+ * Set the user's credentials: uid, gid, groups,
+ * audit classes, user limits, and umask.
+ */
+- if (setpcred(name, NULL) == -1)
+- {
+- LogError("setpcred for \"%s\" failed, errno=%d\n", name, errno);
++ if (setpcred (name, NULL) == -1) {
++ LogError ("setpcred for \"%s\" failed: %s\n", name,
++ _SysErrorMsg (errno));
+ return (0);
+ }
+ #endif /* AIXV3 */
+@@ -751,13 +752,13 @@
+ execute (failsafeArgv, verify->userEnviron);
+ exit (1);
+ case -1:
+- bzero(passwd, strlen(passwd));
++ bzero (passwd, strlen (passwd));
+ Debug ("StartSession, fork failed\n");
+- LogError ("can't start session on \"%s\", fork failed, errno=%d\n",
+- d->name, errno);
++ LogError ("can't start session on \"%s\", fork failed: %s\n",
++ d->name, _SysErrorMsg (errno));
+ return 0;
+ default:
+- bzero(passwd, strlen(passwd));
++ bzero (passwd, strlen (passwd));
+ Debug ("StartSession, fork succeeded %d\n", pid);
+ *pidp = pid;
+ return 1;
+@@ -924,9 +925,10 @@
+ return env;
+ }
+
+-#if (defined(Lynx) && !defined(HAS_CRYPT)) || defined(SCO) && !defined(SCO_USA) && !defined(_SCO_DS)
+-char *crypt(char *s1, char *s2)
++#if (defined(Lynx) && !defined(HAS_CRYPT)) || (defined(SCO) && !defined(SCO_USA) && !defined(_SCO_DS))
++char *
++crypt (char *s1, char *s2)
+ {
+- return(s2);
++ return (s2);
+ }
+ #endif
+diff -urN xc/programs/xdm~/socket.c xc/programs/xdm/socket.c
+--- xc/programs/xdm~/socket.c 2001-12-14 15:01:24.000000000 -0500
++++ xc/programs/xdm/socket.c 2003-02-23 17:04:25.000000000 -0500
+@@ -71,7 +71,7 @@
+ Debug ("creating socket %d\n", request_port);
+ xdmcpFd = socket (AF_INET, SOCK_DGRAM, 0);
+ if (xdmcpFd == -1) {
+- LogError ("XDMCP socket creation failed, errno %d\n", errno);
++ LogError ("XDMCP socket creation failed: %s\n", _SysErrorMsg (errno));
+ return;
}
- #else
+ name = localHostname ();
+@@ -87,7 +87,8 @@
+ sock_addr.sin_addr.s_addr = htonl (INADDR_ANY);
+ if (bind (xdmcpFd, (struct sockaddr *)&sock_addr, sizeof (sock_addr)) == -1)
{
-- int seed;
-- int value;
-- int i;
-+ int seed;
-+ int value;
-+ int i;
- static long localkey[2] = {0,0};
--
+- LogError ("error %d binding socket address %d\n", errno, request_port);
++ LogError ("error binding socket address %d: %s\n", request_port,
++ _SysErrorMsg (errno));
+ close (xdmcpFd);
+ xdmcpFd = -1;
+ return;
+@@ -99,7 +100,7 @@
+ Debug ("Created chooser socket %d\n", chooserFd);
+ if (chooserFd == -1)
+ {
+- LogError ("chooser socket creation failed, errno %d\n", errno);
++ LogError ("chooser socket creation failed: %s\n", _SysErrorMsg (errno));
+ return;
+ }
+ listen (chooserFd, 5);
+diff -Nur xc/programs/xdm.old/util.c xc/programs/xdm/util.c
+--- xc/programs/xdm.old/util.c 2002-05-31 20:46:10.000000000 +0200
++++ xc/programs/xdm/util.c 2003-05-31 15:05:02.000000000 +0200
+@@ -55,7 +55,7 @@
+ #undef _POSIX_SOURCE
+ #endif
+ #endif
+-#if defined(__osf__) || defined(linux) || defined(__QNXNTO__) || defined(__GNU__)
++#if defined(__osf__) || defined(linux) || defined(__QNXNTO__) || defined(__GNU__) || defined(__GLIBC__)
+ #define setpgrp setpgid
+ #endif
+
+--- xc/programs/xdm/xdm.man~ 2003-02-23 18:01:10.000000000 -0500
++++ xc/programs/xdm/xdm.man 2003-02-23 18:03:47.000000000 -0500
+@@ -144,8 +144,9 @@
+ At the end of the session, the \fIXreset\fP script is run to clean up,
+ the X server is reset, and the cycle starts over.
+ .PP
+-The file \fI__projectroot__/lib/X11/xdm/xdm-errors\fP will contain error
+-messages from
++The file
++.I __projectroot__/lib/X11/xdm/xdm-errors
++will contain error messages from
+ .I xdm
+ and anything output to stderr by \fIXsetup, Xstartup, Xsession\fP
+ or \fIXreset\fP.
+@@ -305,7 +306,8 @@
+ This names a directory under which
+ .I xdm
+ stores authorization files while initializing the session. The
+-default value is \fI__projectroot__/lib/X11/xdm.\fP
++default value is
++.IR __projectroot__/lib/X11/xdm .
+ Can be overridden for specific displays by
+ DisplayManager.\fIDISPLAY\fP.authFile.
+ .IP \fBDisplayManager.autoRescan\fP
+@@ -352,7 +354,7 @@
+ .IP \fBDisplayManager.greeterLib\fP
+ On systems that support a dynamically-loadable greeter library, the
+ name of the library. The default is
+-\fI__projectroot__/lib/X11/xdm/libXdmGreet.so\fP.
++.IR __projectroot__/lib/X11/xdm/libXdmGreet.so .
+ .IP \fBDisplayManager.choiceTimeout\fP
+ Number of seconds to wait for display to respond after user has
+ selected a host from the chooser. If the display sends an XDMCP
+@@ -384,17 +386,19 @@
+ which describes the various
+ resources that are appropriate to place in this file.
+ There is no default value for this resource, but
+-\fI__projectroot__/lib/X11/xdm/Xresources\fP
++.I __projectroot__/lib/X11/xdm/Xresources
+ is the conventional name.
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.chooser\fP"
+ Specifies the program run to offer a host menu for Indirect queries
+ redirected to the special host name CHOOSER.
+-\fI__projectroot__/lib/X11/xdm/chooser\fP is the default.
+-See the sections \fBXDMCP Access Control\fP and \fBChooser\fP.
++.I __projectroot__/lib/X11/xdm/chooser
++is the default. See the sections \fBXDMCP Access Control\fP and
++\fBChooser\fP.
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.xrdb\fP"
+ Specifies the program used to load the resources. By default,
+ .I xdm
+-uses \fI__projectroot__/bin/xrdb\fP.
++uses
++.IR __projectroot__/bin/xrdb .
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.cpp\fP"
+ This specifies the name of the C preprocessor which is used by \fIxrdb\fP.
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.setup\fP"
+@@ -412,8 +416,9 @@
+ See the section \fBStartup Program.\fP
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.session\fP"
+ This specifies the session to be executed (not running as root).
+-By default, \fI__projectroot__/bin/xterm\fP is
+-run. The conventional name is \fIXsession\fP.
++By default,
++.I __projectroot__/bin/xterm
++is run. The conventional name is \fIXsession\fP.
+ See the section
+ .B "Session Program."
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.reset\fP"
+@@ -498,7 +503,9 @@
+ will fall back to this program. This program is executed with no
+ arguments, but executes using the same environment variables as
+ the session would have had (see the section \fBSession Program\fP).
+-By default, \fI__projectroot__/bin/xterm\fP is used.
++By default,
++.I __projectroot__/bin/xterm
++is used.
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabServer\fP"
+ .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabTimeout\fP"
+ To improve security,
+@@ -577,8 +584,9 @@
+ First, the
+ .I xdm
+ configuration file should be set up.
+-Make a directory (usually \fI__projectroot__/lib/X11/xdm\fP) to contain all
+-of the relevant files.
++Make a directory (usually
++.IR __projectroot__/lib/X11/xdm )
++to contain all of the relevant files.
+ .LP
+ Here is a reasonable configuration file, which could be
+ named \fIxdm-config\fP:
+diff -urN xc/programs/xdm~/xdmauth.c xc/programs/xdm/xdmauth.c
+--- xc/programs/xdm~/xdmauth.c 2001-12-14 15:01:25.000000000 -0500
++++ xc/programs/xdm/xdmauth.c 2003-02-23 17:04:25.000000000 -0500
+@@ -45,11 +45,20 @@
+ static char auth_name[256];
+ static int auth_name_len;
+
+-void
+-XdmPrintDataHex (s, a, l)
+- char *s;
+- char *a;
+- int l;
++static void XdmPrintDataHex (char *s, char *a, int l);
++# ifdef XDMCP
++static void XdmPrintArray8Hex (char *s, ARRAY8Ptr a);
++# endif
++static Xauth *XdmGetAuthHelper (unsigned short namelen,
++ char *name,
++ int includeRho);
++# ifdef XDMCP
++static int HexToBinary (char *key);
++static int XdmGetKey (struct protoDisplay *pdpy, ARRAY8Ptr displayID);
++# endif
+
- if ( (localkey[0] == 0) && (localkey[1] == 0) ) {
--#ifdef ARC4_RANDOM
-+# ifdef ARC4_RANDOM
- localkey[0] = arc4random();
- localkey[1] = arc4random();
--#elif defined(DEV_RANDOM)
-+# elif defined(DEV_RANDOM)
- int fd;
--
-+
- if ((fd = open(DEV_RANDOM, O_RDONLY)) >= 0) {
- if (read(fd, (char *)localkey, 8) != 8) {
- localkey[0] = 1;
-@@ -242,24 +206,19 @@
- } else {
- localkey[0] = 1;
- }
--#else
-- if (!sumFile (randomFile, localkey)) {
-- localkey[0] = 1; /* To keep from continually calling sumFile() */
-- }
--#endif
-+# endif /* ARC4_RANDOM, DEV_RANDOM */
- }
++static void
++XdmPrintDataHex (char *s, char *a, int l)
+ {
+ int i;
-- seed = (ldata[0]+localkey[0]) + ((ldata[1]+localkey[1]) << 16);
-- xdm_srand (seed);
-- for (i = 0; i < len; i++)
-- {
-+ seed = (ldata[0]+localkey[0]) + ((ldata[1]+localkey[1]) << 16);
-+ xdm_srand (seed);
-+ for (i = 0; i < len; i++) {
- value = xdm_rand ();
- auth[i] = (value & 0xff00) >> 8;
-- }
-+ }
- value = len;
- if (value > sizeof (key))
- value = sizeof (key);
-- memmove( (char *) key, auth, value);
-+ memmove( (char *) key, auth, value);
- }
--#endif
-+#endif /* HASXDMAUTH */
+@@ -59,7 +68,7 @@
+ Debug ("\n");
}
-diff -urN xc/programs/xdm~/resource.c xc/programs/xdm/resource.c
---- xc/programs/xdm~/resource.c 2002-11-02 13:03:25.000000000 -0500
-+++ xc/programs/xdm/resource.c 2002-11-02 13:19:52.000000000 -0500
-@@ -35,11 +35,11 @@
- * resource.c
- */
--# include "dm.h"
--# include "dm_error.h"
-+#include "dm.h"
-+#include "dm_error.h"
+-#ifdef notdef /* not used */
++#if 0 /* not used */
+ void
+ XdmPrintKey (s, k)
+ char *s;
+@@ -69,20 +78,16 @@
+ }
+ #endif
--# include <X11/Intrinsic.h>
--# include <X11/Xmu/CharSet.h>
-+#include <X11/Intrinsic.h>
-+#include <X11/Xmu/CharSet.h>
+-#ifdef XDMCP
+-void
+-XdmPrintArray8Hex (s, a)
+- char *s;
+- ARRAY8Ptr a;
++# ifdef XDMCP
++static void
++XdmPrintArray8Hex (char *s, ARRAY8Ptr a)
+ {
+ XdmPrintDataHex (s, (char *) a->data, a->length);
+ }
+-#endif
++# endif
- char *config;
+ void
+-XdmInitAuth (name_len, name)
+- unsigned short name_len;
+- char *name;
++XdmInitAuth (unsigned short name_len, char *name)
+ {
+ if (name_len > 256)
+ name_len = 256;
+@@ -91,7 +96,7 @@
+ }
-@@ -62,10 +62,10 @@
- char *willing;
- int choiceTimeout; /* chooser choice timeout */
+ /*
+- * Generate authorization for XDM-AUTHORIZATION-1
++ * Generate authorization for XDM-AUTHORIZATION-1
+ *
+ * When being used with XDMCP, 8 bytes are generated for the session key
+ * (sigma), as the random number (rho) is already shared between xdm and
+@@ -99,11 +104,8 @@
+ * between xdm and the server (16 bytes total)
+ */
--# define DM_STRING 0
--# define DM_INT 1
--# define DM_BOOL 2
--# define DM_ARGV 3
-+#define DM_STRING 0
-+#define DM_INT 1
-+#define DM_BOOL 2
-+#define DM_ARGV 3
+-Xauth *
+-XdmGetAuthHelper (namelen, name, includeRho)
+- unsigned short namelen;
+- char *name;
+- int includeRho;
++static Xauth *
++XdmGetAuthHelper (unsigned short namelen, char *name, int includeRho)
+ {
+ Xauth *new;
+ new = (Xauth *) malloc (sizeof (Xauth));
+@@ -146,20 +148,17 @@
+ }
- /*
- * the following constants are supposed to be set in the makefile from
-@@ -175,9 +176,9 @@
- ""} ,
- };
+ Xauth *
+-XdmGetAuth (namelen, name)
+- unsigned short namelen;
+- char *name;
++XdmGetAuth (unsigned short namelen, char *name)
+ {
+ return XdmGetAuthHelper (namelen, name, TRUE);
+ }
--# define NUM_DM_RESOURCES (sizeof DmResources / sizeof DmResources[0])
-+#define NUM_DM_RESOURCES (sizeof DmResources / sizeof DmResources[0])
+-#ifdef XDMCP
++# ifdef XDMCP
--# define boffset(f) XtOffsetOf(struct display, f)
-+#define boffset(f) XtOffsetOf(struct display, f)
+ void
+-XdmGetXdmcpAuth (pdpy,authorizationNameLen, authorizationName)
+- struct protoDisplay *pdpy;
+- unsigned short authorizationNameLen;
+- char *authorizationName;
++XdmGetXdmcpAuth (struct protoDisplay *pdpy,
++ unsigned short authorizationNameLen,
++ char *authorizationName)
+ {
+ Xauth *fileauth, *xdmcpauth;
- struct displayResource {
- char *name, *class;
-@@ -225,7 +226,7 @@
- "" },
- };
+@@ -200,7 +199,9 @@
+ XdmPrintDataHex ("Accept packet auth", xdmcpauth->data, xdmcpauth->data_length);
+ XdmPrintDataHex ("Auth file auth", fileauth->data, fileauth->data_length);
+ /* encrypt the session key for its trip back to the server */
+- XdmcpWrap (xdmcpauth->data, (unsigned char *)&pdpy->key, xdmcpauth->data, 8);
++ XdmcpWrap ((unsigned char *)&xdmcpauth->data,
++ (unsigned char *)&pdpy->key,
++ (unsigned char *)&xdmcpauth->data, 8);
+ pdpy->fileAuthorization = fileauth;
+ pdpy->xdmcpAuthorization = xdmcpauth;
+ }
+@@ -210,8 +211,7 @@
+ 'A' <= c && c <= 'F' ? c - 'A' + 10 : -1)
--# define NUM_SERVER_RESOURCES (sizeof serverResources/\
-+#define NUM_SERVER_RESOURCES (sizeof serverResources/\
- sizeof serverResources[0])
+ static int
+-HexToBinary (key)
+- char *key;
++HexToBinary (char *key)
+ {
+ char *out, *in;
+ int top, bottom;
+@@ -240,10 +240,8 @@
+ * routine accepts either plain ascii strings for keys, or hex-encoded numbers
+ */
- /* resources which control the session behaviour */
-@@ -257,7 +258,7 @@
- DEF_CHOOSER },
- };
+-int
+-XdmGetKey (pdpy, displayID)
+- struct protoDisplay *pdpy;
+- ARRAY8Ptr displayID;
++static int
++XdmGetKey (struct protoDisplay *pdpy, ARRAY8Ptr displayID)
+ {
+ FILE *keys;
+ char line[1024], id[1024], key[1024];
+@@ -305,5 +303,5 @@
+ return TRUE;
+ }
--# define NUM_SESSION_RESOURCES (sizeof sessionResources/\
-+#define NUM_SESSION_RESOURCES (sizeof sessionResources / \
- sizeof sessionResources[0])
+-#endif /* XDMCP */
++# endif /* XDMCP */
+ #endif /* HASXDMAUTH (covering the entire file) */
+diff -urN xc/programs/xdm~/xdmcp.c xc/programs/xdm/xdmcp.c
+--- xc/programs/xdm~/xdmcp.c 2003-02-23 17:03:35.000000000 -0500
++++ xc/programs/xdm/xdmcp.c 2003-02-23 17:04:25.000000000 -0500
+@@ -966,7 +966,7 @@
+ d = FindDisplayByName (name);
+ if (d)
+ {
+- Debug ("Terminating active session for %s\n", d->name);
++ LogInfo ("Terminating active session for %s\n", d->name);
+ StopDisplay (d);
+ }
+ class = malloc (displayClass.length + 1);
+diff -urN xc/programs/xdm~/xdmshell.c xc/programs/xdm/xdmshell.c
+--- xc/programs/xdm~/xdmshell.c 2001-12-14 15:01:26.000000000 -0500
++++ xc/programs/xdm/xdmshell.c 2003-02-23 17:04:25.000000000 -0500
+@@ -41,6 +41,7 @@
+ #include <stdio.h>
+ #include "dm.h"
+ #include <errno.h>
++#include <string.h>
- XrmDatabase DmResourceDB;
-diff -urN xc/programs/xdm~/xdm.man xc/programs/xdm/xdm.man
---- xc/programs/xdm~/xdm.man 2002-11-02 13:03:25.000000000 -0500
-+++ xc/programs/xdm/xdm.man 2002-11-02 13:03:51.000000000 -0500
-@@ -346,9 +346,11 @@
- to pass on to the \fIXsetup\fP,
- \fIXstartup\fP, \fIXsession\fP, and \fIXreset\fP programs.
- .IP \fBDisplayManager.randomFile\fP
--A file to checksum to generate the seed of authorization keys.
--This should be a file that changes frequently.
--The default is \fI/dev/mem\fP.
-+A file from which to gather entropy for the generation of authorization
-+keys. This resource is only used if
-+.B xdm
-+was compiled with support for the XDM-AUTHORIZATION-1 protocol and the
-+\(oqrandom\(cq device. The default is \fI/dev/random\fP.
- .IP \fBDisplayManager.greeterLib\fP
- On systems that support a dynamically-loadable greeter library, the
- name of the library. The default is
+ #ifdef macII
+ #define ON_CONSOLE_ONLY
+@@ -193,7 +194,7 @@
+ args[4] = NULL;
+ if (exec_args (cmdbuf, args) == -1) {
+ fprintf (stderr, "%s: unable to execute %s (error %d, %s)\r\n",
+- ProgramName, cmdbuf, errno, strerror(errno));
++ ProgramName, cmdbuf, errno, strerror (errno));
+ exit (1);
+ }
+
Property changes on: branches/4.3.0/sid/debian/patches/002_xdm_fixes.diff
___________________________________________________________________
Name: svn:keywords
+ Id
Deleted: branches/4.3.0/sid/debian/patches/821_gnu-freebsd_xdm.diff
===================================================================
--- branches/4.3.0/sid/debian/patches/821_gnu-freebsd_xdm.diff 2003-09-15 08:42:56 UTC (rev 529)
+++ branches/4.3.0/sid/debian/patches/821_gnu-freebsd_xdm.diff 2003-09-15 20:06:51 UTC (rev 530)
@@ -1,29 +0,0 @@
-
- the setpgrp define shouldn't be necessary if Glibc's setpgrp was
- equivalent to setpgid as described in the Glibc (info, of course)
- documentation. --Robert Millan <rmh@debian.org>
-
-diff -Nur xc/programs/xdm.old/Imakefile xc/programs/xdm/Imakefile
---- xc/programs/xdm.old/Imakefile 2003-05-31 14:55:26.000000000 +0200
-+++ xc/programs/xdm/Imakefile 2003-05-31 15:05:02.000000000 +0200
-@@ -133,7 +133,7 @@
- RANDOM_DEFINES = -DDEV_RANDOM -DDEF_RANDOM_FILE="\"/dev/urandom\""
- #endif
-
--#if defined(LinuxArchitecture) || defined(GNUMachArchitecture)
-+#if defined(LinuxArchitecture) || defined(GNUMachArchitecture) || defined(GNUFreeBSDArchitecture)
- RANDOM_DEFINES = -DDEV_RANDOM -DDEF_RANDOM_FILE="\"/dev/random\""
- #endif
-
-diff -Nur xc/programs/xdm.old/util.c xc/programs/xdm/util.c
---- xc/programs/xdm.old/util.c 2002-05-31 20:46:10.000000000 +0200
-+++ xc/programs/xdm/util.c 2003-05-31 15:05:02.000000000 +0200
-@@ -55,7 +55,7 @@
- #undef _POSIX_SOURCE
- #endif
- #endif
--#if defined(__osf__) || defined(linux) || defined(__QNXNTO__) || defined(__GNU__)
-+#if defined(__osf__) || defined(linux) || defined(__QNXNTO__) || defined(__GNU__) || defined(__GLIBC__)
- #define setpgrp setpgid
- #endif
-
Reply to: