update from MirBSD CVS
authormirabilos <m@mirbsd.org>
Sat, 12 Aug 2017 00:33:32 +0000 (02:33 +0200)
committermirabilos <m@mirbsd.org>
Sat, 12 Aug 2017 00:33:32 +0000 (02:33 +0200)
fixes CVE-2017-12836 (Debian #871810) but may break the testsuite yet

22 files changed:
FAQ
NEWS
TODO
aclocal.m4
config.h.in
configure
configure.in
doc/cvs-paper.ms
doc/cvs.texinfo
lib/closeout.c
lib/filenamecat.c
lib/fncase.c
lib/getcwd.c
lib/system.h
m4/getcwd-path-max.m4
src/commit.c
src/filesubr.c
src/lock.c
src/login.c
src/root.c
src/rsh-client.c
src/sanity.sh

diff --git a/FAQ b/FAQ
index 624ae25..00d0a16 100644 (file)
--- a/FAQ
+++ b/FAQ
@@ -3097,7 +3097,7 @@ kingdon@cyclic.com
    If you want to allow read access, check out an entire tree somewhere.
    You have to do this anyway to build it.
    
-   Note: If you are using a stupid file system that can't inherit file
+   Note: If you are using a stupid filesystem that can't inherit file
    groups from the parent directory (even with the "setgid" (Octal 2000)
    bit set), you might have to modify CVS (or RCS) to reset the group
    every time you create a new file. I have not tested this.
@@ -7541,7 +7541,7 @@ done
    available on Sun, HP, SGI and OSF/1 platforms.
    
    ClearCase uses a special Unix filesystem type, called "mvfs" for
-   "multi-version file system". Conceptually, mvfs adds another dimension
+   "multi-version filesystem". Conceptually, mvfs adds another dimension
    to a regular Unix filesystem. The new axis is used to store the
    different versions of files and to provide a tree-hierarchical view of
    a collection of objects that might be scattered across any number of
@@ -7644,7 +7644,7 @@ done
     
    Shapetools includes a build mechanism (called Shape, not surprisingly)
    that is aware of the version mechanism, and some dependency tracking.
-   It is based on a file system extension called Attributed File System,
+   It is based on a filesystem extension called Attributed Filesystem,
    which allows arbitrary-sized "attributes" to be associated with a
    file. Files are version controlled in a manner similar to RCS.
    Configurations are managed through the Shapefile, an extension of the
diff --git a/NEWS b/NEWS
index 671b941..7b8bf46 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -677,7 +677,7 @@ GENERAL USER ISSUES
   from the server.
 
 * The configure script now tests whether it is building CVS on a case
-  insensitive file system.  If it is, CVS assumes that all file systems on this
+  insensitive filesystem.  If it is, CVS assumes that all filesystems on this
   platform will be case insensitive.  This is useful for getting the case
   insensitivity flag set correctly when compiling on Mac OS X and under Cygwin
   on Windows.  Autodetection can be overridden using the
diff --git a/TODO b/TODO
index 783bf60..feab6b5 100644 (file)
--- a/TODO
+++ b/TODO
@@ -33,14 +33,14 @@ The "TODO" file!                              -*-Indented-Text-*-
 66. Length of the CVS temporary files must be limited to 14 characters for
     System-V stupid support.  As well as the length on the CVS.adm files.
 
-72. Consider re-design of the module -t options to use the file system more
+72. Consider re-design of the module -t options to use the filesystem more
     intuitively.
 
 73. Consider an option (in .cvsrc?) to automatically add files that are new
     and specified to commit.
 
 79. Might be nice to have some sort of interface to Sun's Translucent
-    (?) File System and tagged revisions.
+    (?) filesystem and tagged revisions.
 
 82. Maybe the import stuff should allow an arbitrary revision to be
     specified.
@@ -215,7 +215,7 @@ The "TODO" file!                              -*-Indented-Text-*-
      machine or directory.  But there are other cases, like where the
      user might want to change from :pserver: to :ext:, use a different
      server (if there are two server machines which share the
-     repository using a networked file system), etc.
+     repository using a networked filesystem), etc.
 
      The status quo is a bit of a mess (as of, say, CVS 1.9).  It is
      that the -d global option has two moderately different uses.  One
@@ -334,7 +334,7 @@ The "TODO" file!                              -*-Indented-Text-*-
 
 165. The "import" command will create RCS files automatically, but will
      screw-up when trying to create long file names on short file name
-     file systems.  Perhaps import should be a bit more cautious.
+     filesystems.  Perhaps import should be a bit more cautious.
 
 166. There really needs to be a "Getting Started" document which describes
      some of the new CVS philosophies.  Folks coming straight from SCCS or
index 7e4a108..b9d821b 100644 (file)
@@ -488,7 +488,7 @@ AC_SUBST(install_sh)])
 
 # serial 2
 
-# Check whether the underlying file-system supports filenames
+# Check whether the underlying filesystem supports filenames
 # with a leading dot.  For instance MS-DOS doesn't.
 AC_DEFUN([AM_SET_LEADING_DOT],
 [rm -rf .tst 2>/dev/null
index 1508067..039506e 100644 (file)
@@ -64,7 +64,7 @@
 /* Define as good substitute value for EOVERFLOW. */
 #undef EOVERFLOW
 
-/* Define if this executable will be running on case insensitive file systems.
+/* Define if this executable will be running on case insensitive filesystems.
    In the client case, this means that it will request that the server pretend
    to be case insensitive if it isn't already. */
 #undef FILENAMES_CASE_INSENSITIVE
index 3dead5a..7c2c0cd 100644 (file)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61-MirPorts-2 for Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.1.
+# Generated by GNU Autoconf 2.61-MirPorts-2 for Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.2.
 #
 # Report bugs to <miros-discuss@mirbsd.org>.
 #
@@ -590,8 +590,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='Concurrent Versions System (CVS)'
 PACKAGE_TARNAME='cvs'
-PACKAGE_VERSION='1.12.13-MirOS-0AB8.1'
-PACKAGE_STRING='Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.1'
+PACKAGE_VERSION='1.12.13-MirOS-0AB8.2'
+PACKAGE_STRING='Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.2'
 PACKAGE_BUGREPORT='miros-discuss@mirbsd.org'
 
 ac_unique_file="src/cvs.h"
@@ -1259,7 +1259,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.1 to adapt to many kinds of systems.
+\`configure' configures Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1325,7 +1325,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.1:";;
+     short | recursive ) echo "Configuration of Concurrent Versions System (CVS) 1.12.13-MirOS-0AB8.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1362,7 +1362,7 @@ Optional Features:
                           authentication (in theory) with any PAM module, e.g.
                           on systems with shadow passwords or via LDAP
   --enable-case-sensitivity
-                          Force CVS to expect a case sensitive file system.
+                          Force CVS to expect a case sensitive filesystem.
                           Enabling this on a case insensitive system should
                           have little effect on the server or client
                           operation, though client users may ocassionally be
@@ -1375,7 +1375,7 @@ Optional Features:
                           client to ask servers to behave case insensitively,
                           which could cause confusion for users, but also
                           probably no real harm. (default autoselects based on
-                          the case sensitivity of the file system containing
+                          the case sensitivity of the filesystem containing
                           the current working directory)
   --enable-encryption     Enable encryption support (disabled by default)
   --enable-force-editor   When committing or importing files, you must enter a
@@ -1532,7 +1532,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Concurrent Versions System (CVS) configure 1.12.13-MirOS-0AB8.1
+Concurrent Versions System (CVS) configure 1.12.13-MirOS-0AB8.2
 generated by GNU Autoconf 2.61-MirPorts-2
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1562,7 +1562,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Concurrent Versions System (CVS) $as_me 1.12.13-MirOS-0AB8.1, which was
+It was created by Concurrent Versions System (CVS) $as_me 1.12.13-MirOS-0AB8.2, which was
 generated by GNU Autoconf 2.61-MirPorts-2.  Invocation command line was
 
   $ $0 $@
@@ -2257,7 +2257,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='cvs'
- VERSION='1.12.13-MirOS-0AB8.1'
+ VERSION='1.12.13-MirOS-0AB8.2'
 
 
 # Some tools Automake needs.
@@ -12236,7 +12236,7 @@ $ac_includes_default
    back from the file, nor mmap's back from the file at a different
    address.  (There have been systems where private was not correctly
    implemented like the infamous i386 svr4.0, and systems where the
-   VM page cache was not coherent with the file system buffer cache
+   VM page cache was not coherent with the filesystem buffer cache
    like early versions of FreeBSD and possibly contemporary NetBSD.)
    For shared mappings, we should conversely verify that changes get
    propagated back to all the places they're supposed to be.
@@ -16469,8 +16469,8 @@ main (void)
 {
 #ifndef PATH_MAX
   /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
-     at least not on a local file system.  And if we were to start worrying
-     about remote file systems, we'd have to enable the wrapper function
+     at least not on a local filesystem.  And if we were to start worrying
+     about remote filesystems, we'd have to enable the wrapper function
      all of the time, just to be safe.  That's not worth the cost.  */
   exit (0);
 #elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
@@ -32886,8 +32886,8 @@ fi
 
 
 acx_forced=' (forced)'
-{ echo "$as_me:$LINENO: checking for a case sensitive file system" >&5
-echo $ECHO_N "checking for a case sensitive file system... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: checking for a case sensitive filesystem" >&5
+echo $ECHO_N "checking for a case sensitive filesystem... $ECHO_C" >&6; }
 if test $enable_case_sensitivity = auto; then
         if test "${acx_cv_case_sensitive+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -33600,7 +33600,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Concurrent Versions System (CVS) $as_me 1.12.13-MirOS-0AB8.1, which was
+This file was extended by Concurrent Versions System (CVS) $as_me 1.12.13-MirOS-0AB8.2, which was
 generated by GNU Autoconf 2.61-MirPorts-2.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -33653,7 +33653,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-Concurrent Versions System (CVS) config.status 1.12.13-MirOS-0AB8.1
+Concurrent Versions System (CVS) config.status 1.12.13-MirOS-0AB8.2
 configured by $0, generated by GNU Autoconf 2.61-MirPorts-2,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index dda9f9b..e423167 100644 (file)
@@ -1,4 +1,4 @@
-dnl $MirOS: src/gnu/usr.bin/cvs/configure.in,v 1.29 2017/04/02 22:33:31 tg Exp $
+dnl $MirOS: src/gnu/usr.bin/cvs/configure.in,v 1.31 2017/08/11 22:52:19 tg Exp $
 dnl
 dnl configure.in for cvs
 
@@ -19,7 +19,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.])
 
-AC_INIT([Concurrent Versions System (CVS)],[1.12.13-MirOS-0AB8.1],
+AC_INIT([Concurrent Versions System (CVS)],[1.12.13-MirOS-0AB8.2],
        [miros-discuss@mirbsd.org],[cvs])
 AC_CONFIG_SRCDIR(src/cvs.h)
 AM_INIT_AUTOMAKE([gnu 1.9.2 dist-bzip2 no-define])
@@ -1080,7 +1080,7 @@ AC_ARG_ENABLE(
   [case-sensitivity],
   AC_HELP_STRING(
     [--enable-case-sensitivity],
-    [Force CVS to expect a case sensitive file system.  Enabling this on a case
+    [Force CVS to expect a case sensitive filesystem.  Enabling this on a case
      insensitive system should have little effect on the server or client
      operation, though client users may ocassionally be suprised that the CVS
      server appears to be case sensitive.  Disabling this for a case sensitive
@@ -1089,7 +1089,7 @@ AC_ARG_ENABLE(
      Disabling this for a case sensitive client will cause the client to ask
      servers to behave case insensitively, which could cause confusion for
      users, but also probably no real harm.  (default autoselects based on the
-     case sensitivity of the file system containing the current working
+     case sensitivity of the filesystem containing the current working
      directory)]),
     [case "$enable_case_sensitivity" in
        yes | no | auto) ;;
@@ -1100,7 +1100,7 @@ AC_ARG_ENABLE(
   [enable_case_sensitivity=auto])
 
 acx_forced=' (forced)'
-AC_MSG_CHECKING([for a case sensitive file system])
+AC_MSG_CHECKING([for a case sensitive filesystem])
 if test $enable_case_sensitivity = auto; then
   dnl
   dnl Check for a case insensitive filesystem, like Mac OS X and Windows have.
@@ -1122,7 +1122,7 @@ AC_MSG_RESULT([$enable_case_sensitivity$acx_forced])
 if test $enable_case_sensitivity = no; then
   AC_DEFINE([FILENAMES_CASE_INSENSITIVE], [1],
             [Define if this executable will be running on case insensitive
-             file systems.  In the client case, this means that it will request
+             filesystems.  In the client case, this means that it will request
              that the server pretend to be case insensitive if it isn't
              already.])
   dnl Compile fncase.c (containing fncase() & fncmp()) to handle file name
index ea9445a..eb30717 100644 (file)
@@ -923,7 +923,7 @@ This can be fixed by using a home-grown \fBsystem\fP\|() replacement.
 .IP \(bu 3
 Security of the source repository is currently not dealt with directly.
 The usual UNIX approach of user-group-other security permissions through
-the file system is utilized, but nothing else.
+the filesystem is utilized, but nothing else.
 \fBcvs\fP could likely be a set-group-id executable that checks a
 protected database to verify user access permissions for particular objects
 before allowing any operations to affect those objects.
index ba27374..90972f3 100644 (file)
@@ -11,7 +11,7 @@
   {28truecm}{21truecm}%
  \globaldefs = 0%
 @end tex
-@comment $MirOS: src/gnu/usr.bin/cvs/doc/cvs.texinfo,v 1.34 2017/03/29 15:18:42 tg Exp $
+@comment $MirOS: src/gnu/usr.bin/cvs/doc/cvs.texinfo,v 1.35 2017/08/07 20:12:59 tg Exp $
 @macro copyleftnotice
 @noindent
 Copyright @copyright{} 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
@@ -1180,7 +1180,7 @@ Some of the following might apply to OS/2 but I'm not
 sure).
 
 If you are using local @sc{cvs} and the repository is on a
-networked file system which is served by the Samba SMB
+networked filesystem which is served by the Samba SMB
 server, some people have reported problems with
 permissions.  Enabling WRITE=YES in the samba
 configuration is said to fix/workaround it.
@@ -1959,7 +1959,7 @@ approximately one working directory for each developer
 on what each developer uses).
 
 The repository should be accessible
-(directly or via a networked file system) from all
+(directly or via a networked filesystem) from all
 machines which want to use @sc{cvs} in server or local
 mode; the client machines need not have any access to
 it other than via the @sc{cvs} protocol.  It is not
@@ -7249,7 +7249,7 @@ The date (UTC) the revision was checked in, in a format suitable
 for the Berkeley mdoc macro processing.
 
 @example
-$Mdocdate: March 29 2017 $
+$Mdocdate: August 7 2017 $
 @end example
 
 @cindex Header keyword
@@ -13194,7 +13194,7 @@ If using remote access methods (pserver, ext, etc.),
 @sc{cvs} will execute this program on the server from a temporary
 directory. The path is searched for this program.
 
-If using ``local access'' (on a local or remote NFS file system, i.e.
+If using ``local access'' (on a local or remote NFS filesystem, i.e.
 repository set just to a path),
 the program will be executed from the newly checked-out tree, if
 found there, or alternatively searched for in the path if not.
@@ -14890,7 +14890,7 @@ to let users read from the repository while giving them
 write access only to @var{directory}, not to the
 repository.
 It can also be used to put the locks on a very fast
-in-memory file system to speed up locking and unlocking
+in-memory filesystem to speed up locking and unlocking
 the repository.
 You need to create @var{directory}, but
 @sc{cvs} will create subdirectories of @var{directory} as it
@@ -15003,7 +15003,7 @@ log message after running the program specified by @file{verifymsg}.
 the log message should always be reread; @samp{no}
 or @samp{never}, indicating that it should never be
 reread; or @var{value} may be @samp{stat}, indicating
-that the file should be checked with the file system
+that the file should be checked with the filesystem
 @samp{stat()} function to see if it has changed (see warning below)
 before rereading.  The default value is @samp{always}.
 
index 5d0509d..d7fd499 100644 (file)
@@ -59,7 +59,7 @@ close_stdout_set_file_name (const char *file)
    when it tries to write out that buffered data.  Thus, you would be
    left with an incomplete output file and the offending program would
    exit successfully.  Even calling fflush is not always sufficient,
-   since some file systems (NFS and CODA) buffer written/flushed data
+   since some filesystems (NFS and CODA) buffer written/flushed data
    until an actual close call.
 
    Besides, it's wasteful to check the return value from every call
index f947346..c5ba2f0 100644 (file)
@@ -50,7 +50,7 @@ longest_relative_suffix (char const *f)
    newly-allocated storage and return the result.
    The resulting file name F is such that the commands "ls F" and "(cd
    DIR; ls BASE)" refer to the same file, where BASE is ABASE with any
-   file system prefixes and leading separators removed.
+   filesystem prefixes and leading separators removed.
    Arrange for a directory separator if necessary between DIR and BASE
    in the result, removing any redundant separators.
    In any case, if BASE_IN_RESULT is non-NULL, set
index 2842428..a68b58c 100644 (file)
@@ -1,4 +1,4 @@
-/* fncase.c -- CVS support for case insensitive file systems.
+/* fncase.c -- CVS support for case insensitive filesystems.
    Jim Blandy <jimb@cyclic.com>
 
    This file is part of GNU CVS.
index b73d9c5..47a4e6f 100644 (file)
@@ -32,7 +32,7 @@
 
 #include <fcntl.h> /* For AT_FDCWD on Solaris 9.  */
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/lib/getcwd.c,v 1.3 2010/09/19 19:42:57 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/lib/getcwd.c,v 1.4 2017/08/07 20:13:05 tg Exp $");
 
 #ifndef __set_errno
 # define __set_errno(val) (errno = (val))
@@ -333,7 +333,7 @@ __getcwd (char *buf, size_t size)
            entry_status = __lstat (dotlist, &st);
 #endif
            /* We don't fail here if we cannot stat() a directory entry.
-              This can happen when (network) file systems fail.  If this
+              This can happen when (network) filesystems fail.  If this
               entry is in fact the one we are looking for we will find
               out soon as we reach the end of the directory without
               having found anything.  */
index 8ea4a95..4ce0a3c 100644 (file)
@@ -304,7 +304,7 @@ extern void fnfold (char *FILENAME);
 
 
 
-/* Some file systems are case-insensitive.  If FOLD_FN_CHAR is
+/* Some filesystems are case-insensitive.  If FOLD_FN_CHAR is
    #defined, it maps the character C onto its "canonical" form.  In a
    case-insensitive system, it would map all alphanumeric characters
    to lower case.  Under Windows NT, / and \ are both path component
@@ -315,7 +315,7 @@ extern void fnfold (char *FILENAME);
 # define fncmp strcmp
 #endif
 
-/* Different file systems can have different naming patterns which designate
+/* Different filesystems can have different naming patterns which designate
  * a path as absolute.
  */
 #ifndef ISABSOLUTE
index 5a6c43a..9ba43ec 100644 (file)
@@ -65,8 +65,8 @@ main (void)
 {
 #ifndef PATH_MAX
   /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
-     at least not on a local file system.  And if we were to start worrying
-     about remote file systems, we'd have to enable the wrapper function
+     at least not on a local filesystem.  And if we were to start worrying
+     about remote filesystems, we'd have to enable the wrapper function
      all of the time, just to be safe.  That's not worth the cost.  */
   exit (0);
 #elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
index d3bbba0..d57b61a 100644 (file)
@@ -25,7 +25,7 @@
 #include "fileattr.h"
 #include "hardlink.h"
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/commit.c,v 1.10 2010/09/19 19:43:02 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/commit.c,v 1.11 2017/08/07 20:13:09 tg Exp $");
 
 static Dtype check_direntproc (void *callerdat, const char *dir,
                                const char *repos, const char *update_dir,
@@ -494,7 +494,7 @@ commit (int argc, char **argv)
 
        /* Now we keep track of which files we actually are going to
           operate on, and only work with those files in the future.
-          This saves time--we don't want to search the file system
+          This saves time--we don't want to search the filesystem
           of the working directory twice.  */
        if (size_overflow_p (xtimes (find_args.argc, sizeof (char **))))
        {
index d9c398c..29cc4f0 100644 (file)
 
 /* These functions were moved out of subr.c because they need different
    definitions under operating systems (like, say, Windows NT) with different
-   file system semantics.  */
+   filesystem semantics.  */
 
 #include "cvs.h"
 #include "lstat.h"
 #include "save-cwd.h"
 #include "xsize.h"
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/filesubr.c,v 1.4 2017/03/26 15:54:08 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/filesubr.c,v 1.5 2017/08/07 20:13:09 tg Exp $");
 
 static int deep_remove_dir (const char *path);
 
index 65a1b3d..c19fc4c 100644 (file)
@@ -58,7 +58,7 @@
    which periodically get made about how locks might be different:
 
    1.  Check for EROFS.  Maybe useful, although in the presence of NFS
-   EROFS does *not* mean that the file system is unchanging.
+   EROFS does *not* mean that the filesystem is unchanging.
 
    2.  Provide an option to disable locks for operations which only
    read (see above for some of the consequences).
@@ -71,7 +71,7 @@
 
 #include "cvs.h"
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/lock.c,v 1.6 2010/09/19 19:43:05 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/lock.c,v 1.7 2017/08/07 20:13:09 tg Exp $");
 
 
 struct lock {
index 53fa010..fd03ed6 100644 (file)
@@ -15,7 +15,7 @@
 #include "cvs.h"
 #include "getline.h"
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/login.c,v 1.8 2017/03/26 15:54:08 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/login.c,v 1.9 2017/08/07 20:13:10 tg Exp $");
 
 /* There seems to be very little agreement on which system header
    getpass is declared in.  With a lot of fancy autoconfiscation,
@@ -446,7 +446,7 @@ process:
         *
         * I don't think so, unless we change the way rename_file works to
         * attempt a cp/rm sequence when rename fails since rename doesn't
-        * work across file systems and it isn't uncommon to have /tmp
+        * work across filesystems and it isn't uncommon to have /tmp
         * on its own partition.
         *
         * For that matter, it's probably not uncommon to have a home
index 6994160..c2d32f4 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Copyright © 2017
+ *     mirabilos <m@mirbsd.org>
+ *
  * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
  *
  * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
@@ -18,7 +21,7 @@
 #include <assert.h>
 #include "getline.h"
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/root.c,v 1.11 2017/01/08 19:13:05 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/root.c,v 1.19 2017/08/11 23:49:29 tg Exp $");
 
 /* Printable names for things in the current_parsed_root->method enum variable.
    Watch out if the enum is changed in cvs.h! */
@@ -495,6 +498,9 @@ free_cvsroot_t (cvsroot_t *root)
 }
 
 
+#if defined(CLIENT_SUPPORT) || defined (SERVER_SUPPORT)
+static char *validate_hostname(const char *) __attribute__((__malloc__));
+#endif /* defined(CLIENT_SUPPORT) || defined (SERVER_SUPPORT) */
 
 /*
  * Parse a CVSROOT string to allocate and return a new cvsroot_t structure.
@@ -648,26 +654,27 @@ parse_cvsroot (const char *root_in)
            TRACE (TRACE_DATA, "CVSROOT option=`%s' value=`%s'", p, q);
            if (!strcasecmp (p, "proxy"))
            {
-               newroot->proxy_hostname = xstrdup (q);
+               if (!(newroot->proxy_hostname = validate_hostname(q))) {
+                       error(0, 0, "Invalid proxy hostname: %s", q);
+                       goto error_exit;
+               }
            }
            else if (!strcasecmp (p, "proxyport"))
            {
                char *r = q;
-               if (*r == '-') r++;
-               while (*r)
-               {
-                   if (!isdigit(*r++))
-                   {
+
+               do {
+                   if (!isdigit(*r)) {
+ proxy_port_error:
                        error (0, 0,
 "CVSROOT may only specify a positive, non-zero, integer proxy port (not `%s').",
                               q);
                        goto error_exit;
                    }
-               }
-               if ((newroot->proxy_port = atoi (q)) <= 0)
-                   error (0, 0,
-"CVSROOT may only specify a positive, non-zero, integer proxy port (not `%s').",
-                          q);
+               } while (*++r);
+               if ((newroot->proxy_port = atoi(q)) <= 0 ||
+                   newroot->proxy_port > 65535)
+                       goto proxy_port_error;
            }
            else if (!strcasecmp (p, "CVS_RSH"))
            {
@@ -760,7 +767,22 @@ parse_cvsroot (const char *root_in)
                /* a blank username is impossible, so leave it NULL in that
                 * case so we know to use the default username
                 */
+           {
+               /* for want of strcspn */
+               if (/* no at, obviously */ strchr(cvsroot_copy, '@') ||
+                   /* no colon, interference with CVSROOT/passwd file */
+                   strchr(cvsroot_copy, ':') ||
+                   /* no linefeeds, interference with pserver protocol */
+                   strchr(cvsroot_copy, '\012')) {
+                       error(0, 0, "Bad username \"%s\"", cvsroot_copy);
+                       goto error_exit;
+               }
+               /* other limitations include not beginning with a
+                * hyphen-minus but that’s not even a requirement
+                * in POSIX, let alone other operating environments…
+                */
                newroot->username = xstrdup (cvsroot_copy);
+           }
 
            cvsroot_copy = ++p;
        }
@@ -771,24 +793,18 @@ parse_cvsroot (const char *root_in)
        if ((p = strchr (cvsroot_copy, ':')) != NULL)
        {
            *p++ = '\0';
-           if (strlen(p))
+           if (*p)
            {
+               char qch;
+
                q = p;
-               if (*q == '-') q++;
-               while (*q)
+               while ((qch = *q++))
                {
-                   if (!isdigit(*q++))
-                   {
-                       error (0, 0,
-"CVSROOT may only specify a positive, non-zero, integer port (not `%s').",
-                               p);
-                       error (0, 0,
-                               "Perhaps you entered a relative pathname?");
-                       goto error_exit;
-                   }
+                   if (!isdigit(qch))
+                       goto parse_port_error;
                }
-               if ((newroot->port = atoi (p)) <= 0)
-               {
+               if ((newroot->port = atoi(p)) <= 0 || newroot->port > 65535) {
+ parse_port_error:
                    error (0, 0,
 "CVSROOT may only specify a positive, non-zero, integer port (not `%s').",
                            p);
@@ -798,12 +814,8 @@ parse_cvsroot (const char *root_in)
            }
        }
 
-       /* copy host */
-       if (*cvsroot_copy != '\0')
-           /* blank hostnames are invalid, but for now leave the field NULL
-            * and catch the error during the sanity checks later
-            */
-           newroot->hostname = xstrdup (cvsroot_copy);
+       /* check and copy host */
+       newroot->hostname = validate_hostname(cvsroot_copy);
 
        /* restore the '/' */
        cvsroot_copy = firstslash;
@@ -828,7 +840,9 @@ parse_cvsroot (const char *root_in)
 #if defined(CLIENT_SUPPORT) || defined (SERVER_SUPPORT)
     if (newroot->username && ! newroot->hostname)
     {
-       error (0, 0, "Missing hostname in CVSROOT.");
+       /* this defangs sanity.sh tests for remote reject, though */
+ bad_hostname:
+       error (0, 0, "Missing or bad hostname in CVSROOT.");
        goto error_exit;
     }
 
@@ -942,10 +956,7 @@ parse_cvsroot (const char *root_in)
     }
 
     if (check_hostname && !newroot->hostname)
-    {
-       error (0, 0, "Didn't specify hostname in CVSROOT.");
-       goto error_exit;
-    }
+       goto bad_hostname;
 
     if (no_port && newroot->port)
     {
@@ -1131,3 +1142,78 @@ main (int argc, char *argv[])
    /* NOTREACHED */
 }
 #endif
+
+#if defined(CLIENT_SUPPORT) || defined (SERVER_SUPPORT)
+#define CLS_INVALID    0
+#define CLS_INSIDE     1
+#define CLS_OUTSIDE    2
+#define CLS_SEPARATOR  4
+/* EBCDIC safe */
+#define CLASSIFY(x)    classify[(unsigned char)(x)]
+static char *
+validate_hostname(const char *s)
+{
+       char *buf, *cp;
+       size_t sz;
+       static char classify_initialised = 0, *classify;
+
+       /* initialise classification table */
+       if (!classify_initialised) {
+               const char *ccp;
+
+               classify = xmalloc(256);
+               for (sz = 0; sz < 256; ++sz)
+                       CLASSIFY(sz) = CLS_INVALID;
+               for (ccp = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+                   *ccp; ++ccp)
+                       CLASSIFY(*ccp) = CLS_INSIDE | CLS_OUTSIDE;
+               CLASSIFY('-') = CLS_INSIDE;
+               CLASSIFY('.') = CLS_SEPARATOR;
+               classify_initialised = 1;
+       }
+
+       /* total size limit tolerating a trailing dot */
+       if ((sz = strlen(s)) > 256)
+               return (NULL);
+       buf = xstrdup(s);
+
+       /* drop trailing dot */
+       if ((unsigned char)buf[sz - 1] == (unsigned char)'.')
+               buf[--sz] = '\0';
+       /* recheck */
+       if (sz > 255) {
+ err:
+               free(buf);
+               return (NULL);
+       }
+
+       /* check each label */
+       cp = buf;
+ loop:
+       /* must begin with [0-9A-Za-z] */
+       if (!(CLASSIFY(*cp++) & CLS_OUTSIDE))
+               goto err;
+       sz = 1;
+       /* arbitrary many [0-9A-Za-z-] */
+       while (CLASSIFY(*cp) & CLS_INSIDE) {
+               ++cp;
+               ++sz;
+       }
+       /* except the last must have been [0-9A-Za-z] again */
+       if (!(CLASSIFY(cp[-1]) & CLS_OUTSIDE))
+               goto err;
+       /* maximum label size */
+       if (sz > 63)
+               goto err;
+       /* next label? */
+       if (CLASSIFY(*cp) & CLS_SEPARATOR) {
+               ++cp;
+               goto loop;
+       }
+       /* must be end of string now */
+       if (*cp)
+               goto err;
+       /* it is, everything okay */
+       return (buf);
+}
+#endif /* defined(CLIENT_SUPPORT) || defined (SERVER_SUPPORT) */
index 2db873e..5d88202 100644 (file)
@@ -15,7 +15,7 @@
 #include "cvs.h"
 #include "buffer.h"
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/rsh-client.c,v 1.6 2017/03/26 15:54:10 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/rsh-client.c,v 1.7 2017/08/11 20:41:40 tg Exp $");
 
 #ifdef CLIENT_SUPPORT
 
@@ -55,8 +55,9 @@ start_rsh_server (cvsroot_t *root, struct buffer **to_server_p,
     char *cvs_server = (root->cvs_server != NULL
                        ? root->cvs_server : getenv ("CVS_SERVER"));
     int i = 0;
-    /* This needs to fit "rsh", "-b", "-l", "USER", "-p", port, "host",
-       "cmd (w/ args)", and NULL.  We leave some room to grow. */
+    /* This needs to fit "rsh", "-b", "-l", "USER", "-p", port,
+       "--", "host", "cvs", "-R", "server", and NULL.
+       We leave some room to grow. */
     char *rsh_argv[16];
     char argvport[16];
 
@@ -107,6 +108,9 @@ start_rsh_server (cvsroot_t *root, struct buffer **to_server_p,
        rsh_argv[i++] = argvport;
     }
 
+    /* Only non-option arguments from here. (CVE-2017-12836) */
+    rsh_argv[i++] = "--";
+
     rsh_argv[i++] = root->hostname;
     rsh_argv[i++] = cvs_server;
     if (readonlyfs)
@@ -191,6 +195,8 @@ start_rsh_server (cvsroot_t *root, struct buffer **to_server_p,
                *p++ = argvport;
        }
 
+       *p++ = "--";
+
        *p++ = root->hostname;
        *p++ = command;
        *p++ = NULL;
index 83ce91d..914fa42 100644 (file)
@@ -1,6 +1,6 @@
 #! /bin/sh
 :
-# $MirOS: src/gnu/usr.bin/cvs/src/sanity.sh,v 1.17 2017/03/28 17:48:24 tg Exp $
+# $MirOS: src/gnu/usr.bin/cvs/src/sanity.sh,v 1.19 2017/08/12 00:15:29 tg Exp $
 #-
 # set DISABLE_ANY_RSH=1 to skip rsh and ssh calls
 #
@@ -700,6 +700,10 @@ EOF
 #! $TESTSHELL
 hostname=\$1
 shift
+if test x"\$hostname" = x"--"; then
+       hostname=\$1
+       shift
+fi
 exec \
 $CVS_RSH \
         \$hostname \
@@ -2693,7 +2697,9 @@ export CVS_SERVER
 
 # No need to check the PID of the last client since we are testing with
 # Redirect disabled.
-proot_arg="--allow-root=$SECONDARY_CVSROOT_DIRNAME --allow-root=$PRIMARY_CVSROOT_DIRNAME"
+proot_arg="--allow-root=$SECONDARY_CVSROOT_DIRNAME \
+       --allow-root=$TESTDIR/crerepos \
+       --allow-root=$PRIMARY_CVSROOT_DIRNAME"
 exec $CVS_SERVER_secondary_wrapper_orig \$proot_arg "\$@"
 EOF
        cat <<EOF >$TESTDIR/primary-wrapper
@@ -22053,9 +22059,10 @@ ${CPROG} \[init aborted\]: Bad CVSROOT: .:ext:${hostname}:crerepos.\."
            # can look up '..' and want to ask the user about the unknown host
            # key or somesuch.  Which error message we get depends on whether
            # false finishes running before we try to talk to it or not.
+           # We don't even get to talk to it as of 1.12.13-MirOS-0AB8.2 tho.
            dotest_fail crerepos-6a "CVS_RSH=false ${testcvs} -q -d ../crerepos get ." \
-"${SPROG} \[checkout aborted\]: end of file from server (consult above messages if any)" \
-"${SPROG} \[checkout aborted\]: received broken pipe signal"
+"${SPROG} checkout: Missing or bad hostname in CVSROOT\.
+${SPROG} \[checkout aborted\]: Bad CVSROOT: .\.\./crerepos.\."
            cd ..
            rm -r 1