@@ -100,17 +100,20 @@ char *i18n_canonicalize_charset(char *cs){
100
100
char * i18n_convstring (char * string , char * fromcharset , char * tocharset , size_t * len ){
101
101
102
102
size_t origlen ,strleft ,bufleft ;
103
+ size_t origbuflen ;
103
104
char * convbuf ,* origconvbuf ;
104
105
iconv_t iconvfd ;
105
106
size_t ret ;
107
+ int error ;
106
108
107
109
if (string ){
108
110
strleft = origlen = strlen (string );
109
111
}else {
110
112
strleft = origlen = 0 ;
111
113
}
112
- origconvbuf = convbuf = malloc (origlen * 7 + 1 );
113
- memset (origconvbuf ,0 ,origlen * 7 );
114
+ origbuflen = origlen * 7 ;
115
+ origconvbuf = convbuf = malloc (origbuflen + 1 );
116
+ memset (origconvbuf ,0 ,origbuflen );
114
117
bufleft = origlen * 7 ;
115
118
116
119
if (!set_i18n || strcasecmp (fromcharset ,tocharset )== 0 ){
@@ -130,7 +133,7 @@ char *i18n_convstring(char *string, char *fromcharset, char *tocharset, size_t *
130
133
printf ("I18N: libiconv open error.\n" );
131
134
}
132
135
}
133
- origlen = sprintf (origconvbuf ,"(unknown charset) %s" ,string );
136
+ origlen = snprintf (origconvbuf ,origbuflen , "(unknown charset) %s" ,string );
134
137
origconvbuf [origlen ]= 0x0 ;
135
138
* len = origlen ;
136
139
return origconvbuf ;
@@ -140,38 +143,51 @@ char *i18n_convstring(char *string, char *fromcharset, char *tocharset, size_t *
140
143
iconv_close (iconvfd );
141
144
142
145
if (ret == (size_t )-1 ){
146
+ error = 1 ;
143
147
switch (errno ){
144
148
case E2BIG :
145
149
if (set_showprogress ){
146
150
printf ("I18N: buffer overflow.\n" );
147
151
}
152
+ origlen = snprintf (origconvbuf , origbuflen ,"(buffer overflow) %s" ,string );
153
+ error = 1 ;
148
154
break ;
149
155
case EILSEQ :
150
156
if (set_showprogress ){
151
157
printf ("I18N: invalid multibyte sequence, from %s to %s: %s.\n" ,fromcharset ,tocharset ,string );
152
158
}
153
- origlen = sprintf (origconvbuf ,"(wrong string) %s" ,string );
159
+ origlen = snprintf (origconvbuf , origbuflen ,"(wrong string) %s" ,string );
160
+ error = 1 ;
154
161
break ;
155
162
case EINVAL :
156
163
if (set_showprogress ){
157
- printf ("I18N: incomplete multibyte sqeuence , from %s to %s: %s.\n" ,fromcharset ,tocharset ,string );
164
+ printf ("I18N: incomplete multibyte sequence , from %s to %s: %s.\n" ,fromcharset ,tocharset ,string );
158
165
}
159
- origlen = sprintf (origconvbuf ,"(wrong string) %s" ,string );
166
+ origlen = snprintf (origconvbuf , origbuflen ,"(wrong string) %s" ,string );
167
+ error = 1 ;
160
168
break ;
161
169
}
170
+ } else {
171
+ error = 0 ;
162
172
}
163
173
164
- /* hmm... do we really need to do this? (daigo) */
165
- if (strncasecmp (tocharset ,"ISO-2022-JP" ,11 )== 0 ){
166
- * len = origlen * 7 - bufleft ;
167
- * (origconvbuf + * len )= 0x1b ;
168
- * (origconvbuf + * len + 1 )= 0x28 ;
169
- * (origconvbuf + * len + 2 )= 0x42 ;
170
- * len += 3 ;
171
- }else {
172
- * len = origlen * 7 - bufleft ;
174
+ if (error ) {
175
+ origconvbuf [origlen ]= 0x0 ;
176
+ * len = origlen ;
177
+ } else {
178
+ /* hmm... do we really need to do this? (daigo) */
179
+ if (strncasecmp (tocharset ,"ISO-2022-JP" ,11 )== 0 ){
180
+ * len = origlen * 7 - bufleft ;
181
+ * (origconvbuf + * len )= 0x1b ;
182
+ * (origconvbuf + * len + 1 )= 0x28 ;
183
+ * (origconvbuf + * len + 2 )= 0x42 ;
184
+ * len += 3 ;
185
+ }else {
186
+ * len = origlen * 7 - bufleft ;
187
+ }
188
+
189
+ * (origconvbuf + * len )= 0x0 ;
173
190
}
174
- * (origconvbuf + * len )= 0x0 ;
175
191
176
192
return origconvbuf ;
177
193
}
@@ -182,7 +198,7 @@ char *i18n_convstring(char *string, char *fromcharset, char *tocharset, size_t *
182
198
char * i18n_utf2numref (char * instr ,int escape ){
183
199
184
200
char * ucs ,* headofucs ;
185
- int len ;
201
+ size_t len ;
186
202
struct Push buff ;
187
203
char strbuf [10 ];
188
204
@@ -196,7 +212,8 @@ char *i18n_utf2numref(char *instr,int escape){
196
212
headofucs = ucs = i18n_convstring (instr , "UTF-8" , "UCS-2BE" , & len );
197
213
198
214
unsigned int p ;
199
- for (;len > 0 ; len -= 2 ){
215
+ int i = (int ) len ;
216
+ for (; i > 0 ; i -= 2 ){
200
217
p = (unsigned char )* ucs * 256 + (unsigned char )* (ucs + 1 );
201
218
if (p < 128 ){
202
219
/* keep ASCII characters human readable */
0 commit comments