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