aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2004-05-20 13:11:32 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2004-05-20 13:11:32 +0000
commitb0e9f4d203f6ceab1b5a0cf9382ae76eeb0519d9 (patch)
tree6fc769054869e62ba4b0b3851676e8c95ec8008c
parentf6fb3b4a3a9ba65a68d6d543cb9b20bae3e55830 (diff)
downloadsrc-b0e9f4d203f6ceab1b5a0cf9382ae76eeb0519d9.tar.gz
src-b0e9f4d203f6ceab1b5a0cf9382ae76eeb0519d9.zip
The previous commit broke compatibility with certain buggy third-party
CVS clients. This commit fixes that and brings this file up-to-date with CVS 1.1.16. Obtained from: ccvs.cvshome.org
Notes
Notes: svn path=/vendor/cvs/dist/; revision=129486
-rw-r--r--contrib/cvs/src/server.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/contrib/cvs/src/server.c b/contrib/cvs/src/server.c
index 3bffa9d82f7e..3d36ad6ea896 100644
--- a/contrib/cvs/src/server.c
+++ b/contrib/cvs/src/server.c
@@ -1638,8 +1638,18 @@ serve_unchanged (arg)
&& strncmp (arg, name, cp - name) == 0)
{
timefield = strchr (cp + 1, '/') + 1;
+ /* If the time field is not currently empty, then one of
+ * serve_modified, serve_is_modified, & serve_unchanged were
+ * already called for this file. We would like to ignore the
+ * reinvocation silently or, better yet, exit with an error
+ * message, but we just avoid the copy-forward and overwrite the
+ * value from the last invocation instead. See the comment below
+ * for more.
+ */
if (*timefield == '/')
{
+ /* Copy forward one character. Space was allocated for this
+ * already in serve_entry(). */
cp = timefield + strlen (timefield);
cp[1] = '\0';
while (cp > timefield)
@@ -1647,8 +1657,17 @@ serve_unchanged (arg)
*cp = cp[-1];
--cp;
}
- *timefield = '=';
}
+ /* If *TIMEFIELD wasn't "/", we assume that it was because of
+ * multiple calls to Is-Modified & Unchanged by the client and
+ * just overwrite the value from the last call. Technically, we
+ * should probably either ignore calls after the first or send the
+ * client an error, since the client/server protocol specification
+ * specifies that only one call to either Is-Modified or Unchanged
+ * is allowed, but broken versions of WinCVS & TortoiseCVS rely on
+ * this behavior.
+ */
+ *timefield = '=';
break;
}
}
@@ -1682,8 +1701,18 @@ serve_is_modified (arg)
&& strncmp (arg, name, cp - name) == 0)
{
timefield = strchr (cp + 1, '/') + 1;
+ /* If the time field is not currently empty, then one of
+ * serve_modified, serve_is_modified, & serve_unchanged were
+ * already called for this file. We would like to ignore the
+ * reinvocation silently or, better yet, exit with an error
+ * message, but we just avoid the copy-forward and overwrite the
+ * value from the last invocation instead. See the comment below
+ * for more.
+ */
if (*timefield == '/')
{
+ /* Copy forward one character. Space was allocated for this
+ * already in serve_entry(). */
cp = timefield + strlen (timefield);
cp[1] = '\0';
while (cp > timefield)
@@ -1691,8 +1720,17 @@ serve_is_modified (arg)
*cp = cp[-1];
--cp;
}
- *timefield = 'M';
}
+ /* If *TIMEFIELD wasn't "/", we assume that it was because of
+ * multiple calls to Is-Modified & Unchanged by the client and
+ * just overwrite the value from the last call. Technically, we
+ * should probably either ignore calls after the first or send the
+ * client an error, since the client/server protocol specification
+ * specifies that only one call to either Is-Modified or Unchanged
+ * is allowed, but broken versions of WinCVS & TortoiseCVS rely on
+ * this behavior.
+ */
+ *timefield = 'M';
if (kopt != NULL)
{
if (alloc_pending (strlen (name) + 80))