Fossil SCM
Fix the URL parser so that it is able to handle IPv6 addresses. Cherrypick (with updates) from the ipv6 branch circa [2012-07-07].
Commit
2075361ece43d7faa912c78c1c7ca13e71ec0579
Parent
65aa10f97c25606…
2 files changed
+11
-1
+11
-1
+11
-1
| --- src/url.c | ||
| +++ src/url.c | ||
| @@ -158,12 +158,22 @@ | ||
| 158 | 158 | zLogin = mprintf("%t@", pUrlData->user); |
| 159 | 159 | for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){} |
| 160 | 160 | pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]); |
| 161 | 161 | i = j; |
| 162 | 162 | }else{ |
| 163 | - for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){} | |
| 163 | + int inSquare = 0; | |
| 164 | + int n; | |
| 165 | + for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){ | |
| 166 | + if( c=='[' ) inSquare = 1; | |
| 167 | + if( c==']' ) inSquare = 0; | |
| 168 | + } | |
| 164 | 169 | pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]); |
| 170 | + n = strlen(pUrlData->name); | |
| 171 | + if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){ | |
| 172 | + pUrlData->name++; | |
| 173 | + pUrlData->name[n-2] = 0; | |
| 174 | + } | |
| 165 | 175 | zLogin = mprintf(""); |
| 166 | 176 | } |
| 167 | 177 | url_tolower(pUrlData->name); |
| 168 | 178 | if( c==':' ){ |
| 169 | 179 | pUrlData->port = 0; |
| 170 | 180 |
| --- src/url.c | |
| +++ src/url.c | |
| @@ -158,12 +158,22 @@ | |
| 158 | zLogin = mprintf("%t@", pUrlData->user); |
| 159 | for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){} |
| 160 | pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]); |
| 161 | i = j; |
| 162 | }else{ |
| 163 | for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){} |
| 164 | pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]); |
| 165 | zLogin = mprintf(""); |
| 166 | } |
| 167 | url_tolower(pUrlData->name); |
| 168 | if( c==':' ){ |
| 169 | pUrlData->port = 0; |
| 170 |
| --- src/url.c | |
| +++ src/url.c | |
| @@ -158,12 +158,22 @@ | |
| 158 | zLogin = mprintf("%t@", pUrlData->user); |
| 159 | for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){} |
| 160 | pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]); |
| 161 | i = j; |
| 162 | }else{ |
| 163 | int inSquare = 0; |
| 164 | int n; |
| 165 | for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){ |
| 166 | if( c=='[' ) inSquare = 1; |
| 167 | if( c==']' ) inSquare = 0; |
| 168 | } |
| 169 | pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]); |
| 170 | n = strlen(pUrlData->name); |
| 171 | if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){ |
| 172 | pUrlData->name++; |
| 173 | pUrlData->name[n-2] = 0; |
| 174 | } |
| 175 | zLogin = mprintf(""); |
| 176 | } |
| 177 | url_tolower(pUrlData->name); |
| 178 | if( c==':' ){ |
| 179 | pUrlData->port = 0; |
| 180 |
+11
-1
| --- src/url.c | ||
| +++ src/url.c | ||
| @@ -158,12 +158,22 @@ | ||
| 158 | 158 | zLogin = mprintf("%t@", pUrlData->user); |
| 159 | 159 | for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){} |
| 160 | 160 | pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]); |
| 161 | 161 | i = j; |
| 162 | 162 | }else{ |
| 163 | - for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){} | |
| 163 | + int inSquare = 0; | |
| 164 | + int n; | |
| 165 | + for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){ | |
| 166 | + if( c=='[' ) inSquare = 1; | |
| 167 | + if( c==']' ) inSquare = 0; | |
| 168 | + } | |
| 164 | 169 | pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]); |
| 170 | + n = strlen(pUrlData->name); | |
| 171 | + if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){ | |
| 172 | + pUrlData->name++; | |
| 173 | + pUrlData->name[n-2] = 0; | |
| 174 | + } | |
| 165 | 175 | zLogin = mprintf(""); |
| 166 | 176 | } |
| 167 | 177 | url_tolower(pUrlData->name); |
| 168 | 178 | if( c==':' ){ |
| 169 | 179 | pUrlData->port = 0; |
| 170 | 180 |
| --- src/url.c | |
| +++ src/url.c | |
| @@ -158,12 +158,22 @@ | |
| 158 | zLogin = mprintf("%t@", pUrlData->user); |
| 159 | for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){} |
| 160 | pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]); |
| 161 | i = j; |
| 162 | }else{ |
| 163 | for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){} |
| 164 | pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]); |
| 165 | zLogin = mprintf(""); |
| 166 | } |
| 167 | url_tolower(pUrlData->name); |
| 168 | if( c==':' ){ |
| 169 | pUrlData->port = 0; |
| 170 |
| --- src/url.c | |
| +++ src/url.c | |
| @@ -158,12 +158,22 @@ | |
| 158 | zLogin = mprintf("%t@", pUrlData->user); |
| 159 | for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){} |
| 160 | pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]); |
| 161 | i = j; |
| 162 | }else{ |
| 163 | int inSquare = 0; |
| 164 | int n; |
| 165 | for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){ |
| 166 | if( c=='[' ) inSquare = 1; |
| 167 | if( c==']' ) inSquare = 0; |
| 168 | } |
| 169 | pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]); |
| 170 | n = strlen(pUrlData->name); |
| 171 | if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){ |
| 172 | pUrlData->name++; |
| 173 | pUrlData->name[n-2] = 0; |
| 174 | } |
| 175 | zLogin = mprintf(""); |
| 176 | } |
| 177 | url_tolower(pUrlData->name); |
| 178 | if( c==':' ){ |
| 179 | pUrlData->port = 0; |
| 180 |