diff options
author | des <des@FreeBSD.org> | 2004-05-20 13:11:32 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 2004-05-20 13:11:32 +0000 |
commit | 3d101ef985844544d089e129157a94a0640fd246 (patch) | |
tree | 6fc769054869e62ba4b0b3851676e8c95ec8008c /contrib | |
parent | 52b98bc9df8cebdefe74c988040787a57055a0f4 (diff) | |
download | FreeBSD-src-3d101ef985844544d089e129157a94a0640fd246.zip FreeBSD-src-3d101ef985844544d089e129157a94a0640fd246.tar.gz |
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
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/cvs/src/server.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/contrib/cvs/src/server.c b/contrib/cvs/src/server.c index 3bffa9d..3d36ad6 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)) |