summaryrefslogtreecommitdiffstats
path: root/contrib/cvs/src/root.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/cvs/src/root.c')
-rw-r--r--contrib/cvs/src/root.c80
1 files changed, 45 insertions, 35 deletions
diff --git a/contrib/cvs/src/root.c b/contrib/cvs/src/root.c
index bf5c89e..050e168 100644
--- a/contrib/cvs/src/root.c
+++ b/contrib/cvs/src/root.c
@@ -2,7 +2,7 @@
* Copyright (c) 1992, Mark D. Baushke
*
* You may distribute under the terms of the GNU General Public License as
- * specified in the README file that comes with the CVS 1.4 kit.
+ * specified in the README file that comes with the CVS source distribution.
*
* Name of Root
*
@@ -18,15 +18,15 @@
Watch out if the enum is changed in cvs.h! */
char *method_names[] = {
- "local", "server (rsh)", "pserver", "kserver", "ext"
+ "local", "server (rsh)", "pserver", "kserver", "gserver", "ext"
};
#ifndef DEBUG
char *
-Name_Root(dir, update_dir)
- char *dir;
- char *update_dir;
+Name_Root (dir, update_dir)
+ char *dir;
+ char *update_dir;
{
FILE *fpin;
char *ret, *xupdate_dir;
@@ -133,41 +133,14 @@ Name_Root(dir, update_dir)
}
/*
- * Returns non-zero if the two directories have the same stat values
- * which indicates that they are really the same directories.
- */
-int
-same_directories (dir1, dir2)
- char *dir1;
- char *dir2;
-{
- struct stat sb1;
- struct stat sb2;
- int ret;
-
- if ( CVS_STAT (dir1, &sb1) < 0)
- return (0);
- if ( CVS_STAT (dir2, &sb2) < 0)
- return (0);
-
- ret = 0;
- if ( (memcmp( &sb1.st_dev, &sb2.st_dev, sizeof(dev_t) ) == 0) &&
- (memcmp( &sb1.st_ino, &sb2.st_ino, sizeof(ino_t) ) == 0))
- ret = 1;
-
- return (ret);
-}
-
-
-/*
* Write the CVS/Root file so that the environment variable CVSROOT
* and/or the -d option to cvs will be validated or not necessary for
* future work.
*/
void
Create_Root (dir, rootdir)
- char *dir;
- char *rootdir;
+ char *dir;
+ char *rootdir;
{
FILE *fout;
char *tmp;
@@ -272,6 +245,23 @@ root_allow_ok (arg)
char *arg;
{
unsigned int i;
+
+ if (root_allow_count == 0)
+ {
+ /* Probably someone upgraded from CVS before 1.9.10 to 1.9.10
+ or later without reading the documentation about
+ --allow-root. Printing an error here doesn't disclose any
+ particularly useful information to an attacker because a
+ CVS server configured in this way won't let *anyone* in. */
+
+ /* Note that we are called from a context where we can spit
+ back "error" rather than waiting for the next request which
+ expects responses. */
+ printf ("\
+error 0 Server configuration missing --allow-root in inetd.conf\n");
+ error_exit ();
+ }
+
for (i = 0; i < root_allow_count; ++i)
if (strcmp (root_allow_vector[i], arg) == 0)
return 1;
@@ -327,6 +317,7 @@ parse_cvsroot (CVSroot)
{
static int cvsroot_parsed = 0;
char *cvsroot_copy, *p;
+ int check_hostname;
/* Don't go through the trouble twice. */
if (cvsroot_parsed)
@@ -366,6 +357,8 @@ parse_cvsroot (CVSroot)
CVSroot_method = pserver_method;
else if (strcmp (method, "kserver") == 0)
CVSroot_method = kserver_method;
+ else if (strcmp (method, "gserver") == 0)
+ CVSroot_method = gserver_method;
else if (strcmp (method, "server") == 0)
CVSroot_method = server_method;
else if (strcmp (method, "ext") == 0)
@@ -445,6 +438,7 @@ parse_cvsroot (CVSroot)
return 1;
}
+ check_hostname = 0;
switch (CVSroot_method)
{
case local_method:
@@ -471,15 +465,31 @@ parse_cvsroot (CVSroot)
error (0, 0, "(%s)", CVSroot);
return 1;
#endif
+ check_hostname = 1;
+ break;
+ case gserver_method:
+#ifndef HAVE_GSSAPI
+ error (0, 0, "Your CVSROOT is set for a GSSAPI access method");
+ error (0, 0, "but your CVS executable doesn't support it");
+ error (0, 0, "(%s)", CVSroot);
+ return 1;
+#endif
+ check_hostname = 1;
+ break;
case server_method:
case ext_method:
case pserver_method:
+ check_hostname = 1;
+ break;
+ }
+
+ if (check_hostname)
+ {
if (! CVSroot_hostname)
{
error (0, 0, "didn't specify hostname in CVSROOT: %s", CVSroot);
return 1;
}
- break;
}
if (*CVSroot_directory == '\0')
OpenPOWER on IntegriCloud