We use the stock versions of these files.

This commit is contained in:
obrien 2008-03-19 15:11:46 +00:00
parent 134c02a9d4
commit 4f8541364a
4 changed files with 109 additions and 31 deletions

View File

@ -164,14 +164,21 @@ import (argc, argv)
* Could abstract this to valid_module_path, but I don't think we'll need
* to call it from anywhere else.
*/
if ((cp = strstr(argv[0], "CVS")) && /* path contains "CVS" AND ... */
((cp == argv[0]) || ISDIRSEP(*(cp-1))) && /* /^CVS/ OR m#/CVS# AND ... */
((*(cp+3) == '\0') || ISDIRSEP(*(cp+3))) /* /CVS$/ OR m#CVS/# */
)
/* for each "CVS" in path... */
cp = argv[0];
while ((cp = strstr(cp, "CVS")) != NULL)
{
error (0, 0,
"The word `CVS' is reserved by CVS and may not be used");
error (1, 0, "as a directory in a path or as a file name.");
if ( /* /^CVS/ OR m#/CVS#... */
(cp == argv[0] || ISDIRSEP(*(cp-1)))
/* ...AND /CVS$/ OR m#CVS/# */
&& (*(cp+3) == '\0' || ISDIRSEP(*(cp+3)))
)
{
error (0, 0,
"The word `CVS' is reserved by CVS and may not be used");
error (1, 0, "as a directory in a path or as a file name.");
}
cp += 3;
}
for (i = 1; i < argc; i++) /* check the tags for validity */
@ -1603,8 +1610,8 @@ import_descend_dir (message, dir, vtag, targc, targv)
if ( CVS_CHDIR (dir) < 0)
{
ierrno = errno;
fperrmsg (logfp, 0, ierrno, "ERROR: cannot chdir to %s", repository);
error (0, ierrno, "ERROR: cannot chdir to %s", repository);
fperrmsg (logfp, 0, ierrno, "ERROR: cannot chdir to %s", dir);
error (0, ierrno, "ERROR: cannot chdir to %s", dir);
err = 1;
goto out;
}

View File

@ -117,20 +117,20 @@ password_entry_parseline (cvsroot_canonical, warn, linenumber, linebuf)
{
/* Yes: slurp '^/\d+\D' and parse the rest of the line according to version number */
char *q;
unsigned long int entry_version;
unsigned long int entry_version = 0;
if (isspace(*(linebuf + 1)))
{
/* special case since strtoul ignores leading white space */
q = linebuf + 1;
}
else
{
entry_version = strtoul (linebuf + 1, &q, 10);
if (q == linebuf + 1)
/* no valid digits found by strtoul */
entry_version = 0;
else
/* assume a delimiting seperator */
q++;
if (q != linebuf + 1)
/* assume a delimiting seperator */
q++;
}
switch (entry_version)
{
@ -568,21 +568,40 @@ login (argc, argv)
password_entry_operation (password_entry_add, current_parsed_root,
typed_password);
memset (typed_password, 0, strlen (typed_password));
free (typed_password);
free (cvs_password);
free_cvs_password (typed_password);
free (cvsroot_canonical);
cvs_password = NULL;
return 0;
}
/* Returns the _scrambled_ password. The server must descramble
before hashing and comparing. If password file not found, or
password not found in the file, just return NULL. */
/* Free the password returned by get_cvs_password() and also free the
* saved cvs_password if they are different pointers. Be paranoid
* about the in-memory copy of the password and overwrite it with zero
* bytes before doing the free().
*/
void
free_cvs_password (char *password)
{
if (password && password != cvs_password)
{
memset (password, 0, strlen (password));
free (password);
}
if (cvs_password)
{
memset (cvs_password, 0, strlen (cvs_password));
free (cvs_password);
cvs_password = NULL;
}
}
/* Returns the _scrambled_ password in freshly allocated memory. The server
* must descramble before hashing and comparing. If password file not found,
* or password not found in the file, just return NULL.
*/
char *
get_cvs_password ()
{
@ -593,7 +612,7 @@ get_cvs_password ()
context, then assume they have supplied the correct, scrambled
password. */
if (cvs_password)
return cvs_password;
return xstrdup (cvs_password);
if (getenv ("CVS_PASSWORD") != NULL)
{

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 1986-2005 The Free Software Foundation, Inc.
* Copyright (C) 1986-2008 The Free Software Foundation, Inc.
*
* Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
* and others.
@ -13,6 +13,7 @@
* $FreeBSD$
*/
#include <assert.h>
#include "cvs.h"
#include "getline.h"
#include "history.h"
@ -264,7 +265,6 @@ static const char *const modules_contents[] = {
"# key [options] directory files...\n",
"#\n",
"# Where \"options\" are composed of:\n",
"# -i prog Run \"prog\" on \"cvs commit\" from top-level of module.\n",
"# -o prog Run \"prog\" on \"cvs checkout\" of module.\n",
"# -e prog Run \"prog\" on \"cvs export\" of module.\n",
"# -t prog Run \"prog\" on \"cvs rtag\" of module.\n",
@ -291,6 +291,13 @@ static const char *const config_contents[] = {
"# Set this to \"no\" if pserver shouldn't check system users/passwords\n",
"#SystemAuth=yes\n",
"\n",
"# Set `IgnoreUnknownConfigKeys' to `yes' to ignore unknown config\n",
"# keys which are supported in a future version of CVS.\n",
"# This option is intended to be useful as a transition for read-only\n",
"# mirror sites when sites may need to be updated later than the\n",
"# primary CVS repository.\n",
"#IgnoreUnknownConfigKeys=no\n",
"\n",
"# Put CVS lock files in this directory rather than directly in the repository.\n",
"#LockDir=/var/lock/cvs\n",
"\n",
@ -849,6 +856,41 @@ rename_rcsfile (temp, real)
free (bak);
}
/*
* Walk PATH backwards to the root directory looking for the root of a
* repository.
*/
static char *
in_repository (const char *path)
{
char *cp = xstrdup (path);
for (;;)
{
if (isdir (cp))
{
int foundit;
char *adm = xmalloc (strlen(cp) + strlen(CVSROOTADM) + 2);
sprintf (adm, "%s/%s", cp, CVSROOTADM);
foundit = isdir (adm);
free (adm);
if (foundit) return cp;
}
/* If last_component() returns the empty string, then cp either
* points at the system root or is the empty string itself.
*/
if (!*last_component (cp) || !strcmp (cp, ".")
|| last_component(cp) == cp)
break;
cp[strlen(cp) - strlen(last_component(cp)) - 1] = '\0';
}
return NULL;
}
const char *const init_usage[] = {
"Usage: %s %s\n",
@ -870,8 +912,11 @@ init (argc, argv)
/* Exit status. */
int err = 0;
char *root_dir;
const struct admin_file *fileptr;
assert (!server_active);
umask (cvsumask);
if (argc == -1 || argc > 1)
@ -888,6 +933,14 @@ init (argc, argv)
}
#endif /* CLIENT_SUPPORT */
root_dir = in_repository (current_parsed_root->directory);
if (root_dir && strcmp (root_dir, current_parsed_root->directory))
error (1, 0,
"Cannot initialize repository under existing CVSROOT: `%s'",
root_dir);
free (root_dir);
/* Note: we do *not* create parent directories as needed like the
old cvsinit.sh script did. Few utilities do that, and a
non-existent parent directory is as likely to be a typo as something

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 1986-2005 The Free Software Foundation, Inc.
* Copyright (C) 1986-2008 The Free Software Foundation, Inc.
*
* Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
* and others.
@ -663,7 +663,6 @@ do_recursion (frame)
{
repository = frame->repository;
assert (repository != NULL);
assert (strstr (repository, "/./") == NULL);
}
fileattr_startdir (repository);
@ -766,7 +765,7 @@ do_recursion (frame)
have writelocks in place, and there is no way to get writelocks
here. */
if (current_parsed_root->isremote)
notify_check (repository, update_dir);
cvs_notify_check (repository, update_dir);
#endif /* CLIENT_SUPPORT */
finfo_struct.repository = repository;