Patch bad_variable_mbfilter2 for mbstring related Bug #67386
Patch version 2014-07-07 14:50 UTC
Return to Bug #67386 |
Download this patch
Patch Revisions:
Developer: delda@virgilio.it
In this three methods, i think that the variable 'bad = 0' was instantiated in a wrong place: i instantiate it inside the while cycle instead the current version where 'bad = 0' is instatiated out of while cycle.
int
mbfl_encoding_detector_feed(mbfl_encoding_detector *identd, mbfl_string *string)
{
int i, n, num, bad, res;
unsigned char *p;
mbfl_identify_filter *filter;
res = 0;
/* feed data */
if (identd != NULL && string != NULL && string->val != NULL) {
num = identd->filter_list_size;
n = string->len;
p = string->val;
while (n > 0) {
bad = 0;
for (i = 0; i < num; i++) {
filter = identd->filter_list[i];
if (!filter->flag) {
(*filter->filter_function)(*p, filter);
if (filter->flag) {
bad++;
}
}
}
if ((num - 1) <= bad) {
res = 1;
break;
}
p++;
n--;
}
}
return res;
}
const mbfl_encoding *
mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz, int strict)
{
int i, n, num, bad;
unsigned char *p;
mbfl_identify_filter *flist, *filter;
const mbfl_encoding *encoding;
/* flist is an array of mbfl_identify_filter instances */
flist = (mbfl_identify_filter *)mbfl_calloc(elistsz, sizeof(mbfl_identify_filter));
if (flist == NULL) {
return NULL;
}
num = 0;
if (elist != NULL) {
for (i = 0; i < elistsz; i++) {
if (!mbfl_identify_filter_init(&flist[num], elist[i])) {
num++;
}
}
}
/* feed data */
n = string->len;
p = string->val;
if (p != NULL) {
while (n > 0) {
bad = 0;
for (i = 0; i < num; i++) {
filter = &flist[i];
if (!filter->flag) {
(*filter->filter_function)(*p, filter);
if (filter->flag) {
bad++;
}
}
}
if ((num - 1) <= bad && !strict) {
break;
}
p++;
n--;
}
}
const mbfl_encoding *
mbfl_identify_encoding2(mbfl_string *string, const mbfl_encoding **elist, int elistsz, int strict)
{
int i, n, num, bad;
unsigned char *p;
mbfl_identify_filter *flist, *filter;
const mbfl_encoding *encoding;
/* flist is an array of mbfl_identify_filter instances */
flist = (mbfl_identify_filter *)mbfl_calloc(elistsz, sizeof(mbfl_identify_filter));
if (flist == NULL) {
return NULL;
}
num = 0;
if (elist != NULL) {
for (i = 0; i < elistsz; i++) {
if (!mbfl_identify_filter_init2(&flist[num], elist[i])) {
num++;
}
}
}
/* feed data */
n = string->len;
p = string->val;
if (p != NULL) {
while (n > 0) {
bad = 0;
for (i = 0; i < num; i++) {
filter = &flist[i];
if (!filter->flag) {
(*filter->filter_function)(*p, filter);
if (filter->flag) {
bad++;
}
}
}
if ((num - 1) <= bad && !strict) {
break;
}
p++;
n--;
}
}
|