You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by cm...@apache.org on 2011/02/08 17:56:49 UTC
svn commit: r1068476 - in /subversion/trunk/subversion:
libsvn_subr/dirent_uri.c tests/libsvn_subr/dirent_uri-test.c
Author: cmpilato
Date: Tue Feb 8 16:56:49 2011
New Revision: 1068476
URL: http://svn.apache.org/viewvc?rev=1068476&view=rev
Log:
Fix some failing canonicalization scenarios.
* subversion/libsvn_subr/dirent_uri.c
(canonicalize): Teach this function to consistently treat "%2F" as
slashes and "%2E" as periods in URIs.
* subversion/tests/libsvn_subr/dirent_uri-test.c
(test_uri_canonicalize): Uncomment some previously failing test
data. Thems don't fail no' mo'.
Modified:
subversion/trunk/subversion/libsvn_subr/dirent_uri.c
subversion/trunk/subversion/tests/libsvn_subr/dirent_uri-test.c
Modified: subversion/trunk/subversion/libsvn_subr/dirent_uri.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/dirent_uri.c?rev=1068476&r1=1068475&r2=1068476&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/dirent_uri.c (original)
+++ subversion/trunk/subversion/libsvn_subr/dirent_uri.c Tue Feb 8 16:56:49 2011
@@ -473,22 +473,34 @@ canonicalize(path_type_t type, const cha
while (*src)
{
- /* Parse each segment, find the closing '/' */
+ /* Parse each segment, finding the closing '/' (which might look
+ like '%2F' for URIs). */
const char *next = src;
- while (*next && (*next != '/'))
- ++next;
+ apr_size_t slash_len = 0;
+ while (*next
+ && (next[0] != '/')
+ && (! (type == type_uri && next[0] == '%' && next[1] == '2' &&
+ canonicalize_to_upper(next[2]) == 'F')))
+ {
+ ++next;
+ }
+
+ /* Record how long our "slash" is. */
+ if (next[0] == '/')
+ slash_len = 1;
+ else if (type == type_uri && next[0] == '%')
+ slash_len = 3;
+
seglen = next - src;
- if (seglen == 0 || (seglen == 1 && src[0] == '.'))
+ if (seglen == 0
+ || (seglen == 1 && src[0] == '.')
+ || (type == type_uri && seglen == 3 && src[0] == '%' && src[1] == '2'
+ && canonicalize_to_upper(src[2]) == 'E'))
{
- /* Noop segment, so do nothing. */
- }
- else if (type == type_uri && seglen == 3
- && src[0] == '%' && src[1] == '2'
- && canonicalize_to_upper(src[2]) == 'E')
- {
- /* '%2E' is equivalent to '.', so this is a noop segment */
+ /* Empty or noop segment, so do nothing. (For URIs, '%2E'
+ is equivalent to '.'). */
}
#ifdef SVN_USE_DOS_PATHS
/* If this is the first path segment of a file:// URI and it contains a
@@ -507,17 +519,15 @@ canonicalize(path_type_t type, const cha
else
{
/* An actual segment, append it to the destination path */
- if (*next)
- seglen++;
memcpy(dst, src, seglen);
dst += seglen;
+ if (slash_len)
+ *(dst++) = '/';
canon_segments++;
}
/* Skip over trailing slash to the next segment. */
- src = next;
- if (*src)
- src++;
+ src = next + slash_len;
}
/* Remove the trailing slash if there was at least one
Modified: subversion/trunk/subversion/tests/libsvn_subr/dirent_uri-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_subr/dirent_uri-test.c?rev=1068476&r1=1068475&r2=1068476&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/dirent_uri-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_subr/dirent_uri-test.c Tue Feb 8 16:56:49 2011
@@ -838,9 +838,8 @@ test_uri_canonicalize(apr_pool_t *pool)
{ "http://server/ ", "http://server/%20" },
{ "http://server/#", "http://server/%23" },
{ "http://server/d/a%2Fb", "http://server/d/a/b" },
- /* ### These tests fail to notice that %2F is '/'.
{ "http://server/d/.%2F.", "http://server/d" },
- { "http://server/d/%2E%2F%2E", "http://server/d" }, */
+ { "http://server/d/%2E%2F%2E", "http://server/d" },
{ "file:///C%3a/temp", "file:///C:/temp" },
{ "http://server/cr%AB", "http://server/cr%AB" },
{ "http://server/cr%ab", "http://server/cr%AB" },