Path: blob/main/website/static/security/patches/EN-15:10/iconv.patch
18096 views
Index: lib/libiconv_modules/UTF7/citrus_utf7.c1===================================================================2--- lib/libiconv_modules/UTF7/citrus_utf7.c (revision 284940)3+++ lib/libiconv_modules/UTF7/citrus_utf7.c (working copy)4@@ -62,8 +62,7 @@ typedef struct {5unsigned int6mode: 1, /* whether base64 mode */7bits: 4, /* need to hold 0 - 15 */8- cache: 22, /* 22 = BASE64_BIT + UTF16_BIT */9- surrogate: 1; /* whether surrogate pair or not */10+ cache: 22; /* 22 = BASE64_BIT + UTF16_BIT */11int chlen;12char ch[4]; /* BASE64_IN, 3 * 6 = 18, most closed to UTF16_BIT */13} _UTF7State;14@@ -154,12 +153,11 @@ _citrus_UTF7_mbtoutf16(_UTF7EncodingInfo * __restr15uint16_t * __restrict u16, const char ** __restrict s, size_t n,16_UTF7State * __restrict psenc, size_t * __restrict nresult)17{18- _UTF7State sv;19const char *s0;20int done, i, len;2122+ *nresult = 0;23s0 = *s;24- sv = *psenc;2526for (i = 0, done = 0; done == 0; i++) {27if (i == psenc->chlen) {28@@ -166,9 +164,6 @@ _citrus_UTF7_mbtoutf16(_UTF7EncodingInfo * __restr29if (n-- < 1) {30*nresult = (size_t)-2;31*s = s0;32- sv.chlen = psenc->chlen;33- memcpy(sv.ch, psenc->ch, sizeof(sv.ch));34- *psenc = sv;35return (0);36}37psenc->ch[psenc->chlen++] = *s0++;38@@ -257,34 +252,31 @@ _citrus_UTF7_mbrtowc_priv(_UTF7EncodingInfo * __re39*nresult = (size_t)_ENCODING_IS_STATE_DEPENDENT;40return (0);41}42- if (psenc->surrogate) {43- hi = (psenc->cache >> psenc->bits) & UTF16_MAX;44- if (hi < HISRG_MIN || hi > HISRG_MAX)45- return (EINVAL);46- siz = 0;47- } else {48- err = _citrus_UTF7_mbtoutf16(ei, &hi, s, n, psenc, &nr);49- if (nr == (size_t)-1 || nr == (size_t)-2) {50- *nresult = nr;51- return (err);52- }53- if (err != 0)54- return (err);55- n -= nr;56- siz = nr;57- if (hi < HISRG_MIN || hi > HISRG_MAX) {58- u32 = (uint32_t)hi;59- goto done;60- }61- psenc->surrogate = 1;62+ err = _citrus_UTF7_mbtoutf16(ei, &hi, s, n, psenc, &nr);63+ if (nr == (size_t)-1 || nr == (size_t)-2) {64+ *nresult = nr;65+ return (err);66}67+ if (err != 0)68+ return (err);69+ n -= nr;70+ siz = nr;71+ if (hi < HISRG_MIN || hi > HISRG_MAX) {72+ u32 = (uint32_t)hi;73+ goto done;74+ }75err = _citrus_UTF7_mbtoutf16(ei, &lo, s, n, psenc, &nr);76if (nr == (size_t)-1 || nr == (size_t)-2) {77+ psenc->chlen = 1; /* make get_state_desc return incomplete */78*nresult = nr;79return (err);80}81if (err != 0)82return (err);83+ if (lo < LOSRG_MIN || lo > LOSRG_MAX) {84+ *nresult = (size_t)-1;85+ return (EILSEQ);86+ }87hi -= HISRG_MIN;88lo -= LOSRG_MIN;89u32 = (hi << 10 | lo) + SRG_BASE;90@@ -297,7 +289,6 @@ done:91_citrus_UTF7_init_state(ei, psenc);92} else {93*nresult = siz;94- psenc->surrogate = 0;95}96return (err);97}98@@ -396,7 +387,7 @@ _citrus_UTF7_put_state_reset(_UTF7EncodingInfo * _99{100int bits, pos;101102- if (psenc->chlen != 0 || psenc->bits > BASE64_BIT || psenc->surrogate)103+ if (psenc->chlen != 0 || psenc->bits > BASE64_BIT)104return (EINVAL);105106if (psenc->mode) {107108109