diff options
author | David Kalnischkies <kalnischkies@gmail.com> | 2010-01-20 14:18:12 +0100 |
---|---|---|
committer | David Kalnischkies <kalnischkies@gmail.com> | 2010-01-20 14:18:12 +0100 |
commit | d16aade9b781538ad5d6d79eda7b69ff075aad85 (patch) | |
tree | d12a7c0da1430255a3f366eb27e8c69d299ad7c4 | |
parent | e29f5aee684afa04f84d8e0fe523dec72b231672 (diff) |
* apt-pkg/contrib/strutl.cc:
- fix malloc asseration fail with ja_JP.eucJP locale in
apt-cache search. Thanks Kusanagi Kouichi! (Closes: #548884)
-rw-r--r-- | apt-pkg/contrib/strutl.cc | 49 | ||||
-rw-r--r-- | debian/changelog | 3 |
2 files changed, 36 insertions, 16 deletions
diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index 4c05f2df8..2913fbf44 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -43,9 +43,10 @@ bool UTF8ToCodeset(const char *codeset, const string &orig, string *dest) { iconv_t cd; const char *inbuf; - char *inptr, *outbuf, *outptr; - size_t insize, outsize; - + char *inptr, *outbuf; + size_t insize, bufsize; + dest->clear(); + cd = iconv_open(codeset, "UTF-8"); if (cd == (iconv_t)(-1)) { // Something went wrong @@ -55,33 +56,49 @@ bool UTF8ToCodeset(const char *codeset, const string &orig, string *dest) else perror("iconv_open"); - // Clean the destination string - *dest = ""; - return false; } - insize = outsize = orig.size(); + insize = bufsize = orig.size(); inbuf = orig.data(); inptr = (char *)inbuf; - outbuf = new char[insize+1]; - outptr = outbuf; + outbuf = new char[bufsize]; + size_t lastError = -1; while (insize != 0) { + char *outptr = outbuf; + size_t outsize = bufsize; size_t const err = iconv(cd, &inptr, &insize, &outptr, &outsize); + dest->append(outbuf, outptr - outbuf); if (err == (size_t)(-1)) { - insize--; - outsize++; - inptr++; - *outptr = '?'; - outptr++; + switch (errno) + { + case EILSEQ: + insize--; + inptr++; + // replace a series of unknown multibytes with a single "?" + if (lastError != insize) { + lastError = insize - 1; + dest->append("?"); + } + break; + case EINVAL: + insize = 0; + break; + case E2BIG: + if (outptr == outbuf) + { + bufsize *= 2; + delete[] outbuf; + outbuf = new char[bufsize]; + } + break; + } } } - *outptr = '\0'; - *dest = outbuf; delete[] outbuf; iconv_close(cd); diff --git a/debian/changelog b/debian/changelog index 588038b4c..9a88f084a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -42,6 +42,9 @@ apt (0.7.25.2) UNRELEASED; urgency=low - replace the per language addendum with a global addendum - add a explanation why translations include (maybe) english parts to the new global addendum (Closes: #561636) + * apt-pkg/contrib/strutl.cc: + - fix malloc asseration fail with ja_JP.eucJP locale in + apt-cache search. Thanks Kusanagi Kouichi! (Closes: #548884) -- David Kalnischkies <kalnischkies@gmail.com> Sat, 16 Jan 2010 21:06:38 +0100 |