aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2007-05-21 16:01:12 +0000
committerVincent Richard <[email protected]>2007-05-21 16:01:12 +0000
commita25333888df96bdc33bbf68bfe21515c1cb2b358 (patch)
tree12d073f83611f951f90a9416b90a110c55739f2c /src
parentFixed bug #1660740: Listing 5.1, The VMIME BOOK, getDecodedText. (diff)
downloadvmime-a25333888df96bdc33bbf68bfe21515c1cb2b358.tar.gz
vmime-a25333888df96bdc33bbf68bfe21515c1cb2b358.zip
Fixed bug #1656547: segfault in urlUtils::decode() if the string ends with '%'.
Diffstat (limited to 'src')
-rw-r--r--src/utility/urlUtils.cpp36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/utility/urlUtils.cpp b/src/utility/urlUtils.cpp
index 52405c07..90dc7887 100644
--- a/src/utility/urlUtils.cpp
+++ b/src/utility/urlUtils.cpp
@@ -79,14 +79,16 @@ const string urlUtils::decode(const string& s)
{
case '%':
{
- const char_t p = (++it != s.end() ? *it : 0);
- const char_t q = (++it != s.end() ? *it : 0);
+ ++it; // skip '%'
+
+ const char_t p = (it != s.end() ? *(it++) : 0);
+ const char_t q = (it != s.end() ? *(it++) : 0);
unsigned char r = 0;
switch (p)
{
- case 0: r = '?'; break;
+ case 0: r = '%'; break;
case 'a': case 'A': r = 10; break;
case 'b': case 'B': r = 11; break;
case 'c': case 'C': r = 12; break;
@@ -96,25 +98,23 @@ const string urlUtils::decode(const string& s)
default: r = p - '0'; break;
}
- r *= 16;
-
- switch (q)
+ if (q != 0)
{
- case 0: r = '?'; break;
- case 'a': case 'A': r += 10; break;
- case 'b': case 'B': r += 11; break;
- case 'c': case 'C': r += 12; break;
- case 'd': case 'D': r += 13; break;
- case 'e': case 'E': r += 14; break;
- case 'f': case 'F': r += 15; break;
- default: r += q - '0'; break;
+ r *= 16;
+
+ switch (q)
+ {
+ case 'a': case 'A': r += 10; break;
+ case 'b': case 'B': r += 11; break;
+ case 'c': case 'C': r += 12; break;
+ case 'd': case 'D': r += 13; break;
+ case 'e': case 'E': r += 14; break;
+ case 'f': case 'F': r += 15; break;
+ default: r += q - '0'; break;
+ }
}
result += static_cast <string::value_type>(r);
-
- if (it != s.end())
- ++it;
-
break;
}
default: