use generated constant for length, check for overruns, dont use gcc/c99 extentions
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@22581 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -205,12 +205,15 @@ find_composition(const uint32_t *in, unsigned in_len)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
const struct canon_node *c = &_wind_canon_table[canon_index];
|
const struct canon_node *c = &_wind_canon_table[canon_index];
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
if (n % 5 == 0) {
|
if (n % 5 == 0) {
|
||||||
cur = *in++;
|
cur = *in++;
|
||||||
if (in_len-- == 0)
|
if (in_len-- == 0)
|
||||||
return c->val;
|
return c->val;
|
||||||
}
|
}
|
||||||
unsigned i = cur >> 16;
|
|
||||||
|
i = cur >> 16;
|
||||||
if (i < c->next_start || i >= c->next_end)
|
if (i < c->next_start || i >= c->next_end)
|
||||||
canon_index = 0;
|
canon_index = 0;
|
||||||
else
|
else
|
||||||
@@ -224,7 +227,7 @@ find_composition(const uint32_t *in, unsigned in_len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
combine(const uint32_t *in, size_t in_len,
|
combine(const uint32_t *in, size_t in_len,
|
||||||
uint32_t *out, size_t *out_len)
|
uint32_t *out, size_t *out_len)
|
||||||
{
|
{
|
||||||
@@ -239,19 +242,27 @@ combine(const uint32_t *in, size_t in_len,
|
|||||||
out[o++] = in[i++];
|
out[o++] = in[i++];
|
||||||
}
|
}
|
||||||
if (i < in_len) {
|
if (i < in_len) {
|
||||||
|
if (o >= *out_len)
|
||||||
|
return WIND_ERR_OVERRUN;
|
||||||
ostarter = o;
|
ostarter = o;
|
||||||
out[o++] = in[i++];
|
out[o++] = in[i++];
|
||||||
old_cc = -1;
|
old_cc = -1;
|
||||||
|
|
||||||
while (i < in_len) {
|
while (i < in_len) {
|
||||||
uint32_t v[2] = {out[ostarter], in[i]};
|
|
||||||
uint32_t comb;
|
uint32_t comb;
|
||||||
|
uint32_t v[2];
|
||||||
|
|
||||||
|
v[0] = out[ostarter];
|
||||||
|
v[1] = in[i];
|
||||||
|
|
||||||
cc = _wind_combining_class(in[i]);
|
cc = _wind_combining_class(in[i]);
|
||||||
if (old_cc != cc && (comb = find_composition(v, 2))) {
|
if (old_cc != cc && (comb = find_composition(v, 2))) {
|
||||||
out[ostarter] = comb;
|
out[ostarter] = comb;
|
||||||
} else if (cc == 0) {
|
} else if (cc == 0) {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
if (o >= *out_len)
|
||||||
|
return WIND_ERR_OVERRUN;
|
||||||
out[o++] = in[i];
|
out[o++] = in[i];
|
||||||
old_cc = cc;
|
old_cc = cc;
|
||||||
}
|
}
|
||||||
@@ -260,6 +271,7 @@ combine(const uint32_t *in, size_t in_len,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
*out_len = o;
|
*out_len = o;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -271,8 +283,8 @@ _wind_stringprep_normalize(const uint32_t *in, size_t in_len,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
tmp_len = in_len * 4;
|
tmp_len = in_len * 4;
|
||||||
if (tmp_len < MAX_LENGTH)
|
if (tmp_len < MAX_LENGTH_CANON)
|
||||||
tmp_len = MAX_LENGTH;
|
tmp_len = MAX_LENGTH_CANON;
|
||||||
tmp = malloc(tmp_len * sizeof(uint32_t));
|
tmp = malloc(tmp_len * sizeof(uint32_t));
|
||||||
if (tmp == NULL)
|
if (tmp == NULL)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
@@ -283,7 +295,7 @@ _wind_stringprep_normalize(const uint32_t *in, size_t in_len,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
canonical_reorder(tmp, tmp_len);
|
canonical_reorder(tmp, tmp_len);
|
||||||
combine(tmp, tmp_len, out, out_len);
|
ret = combine(tmp, tmp_len, out, out_len);
|
||||||
free(tmp);
|
free(tmp);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user