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:
Love Hörnquist Åstrand
2008-02-11 20:42:25 +00:00
parent 5027093451
commit 98807b31c1

View File

@@ -205,12 +205,15 @@ find_composition(const uint32_t *in, unsigned in_len)
do {
const struct canon_node *c = &_wind_canon_table[canon_index];
unsigned i;
if (n % 5 == 0) {
cur = *in++;
if (in_len-- == 0)
return c->val;
}
unsigned i = cur >> 16;
i = cur >> 16;
if (i < c->next_start || i >= c->next_end)
canon_index = 0;
else
@@ -224,7 +227,7 @@ find_composition(const uint32_t *in, unsigned in_len)
return 0;
}
static void
static int
combine(const uint32_t *in, size_t in_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++];
}
if (i < in_len) {
if (o >= *out_len)
return WIND_ERR_OVERRUN;
ostarter = o;
out[o++] = in[i++];
old_cc = -1;
while (i < in_len) {
uint32_t v[2] = {out[ostarter], in[i]};
uint32_t comb;
uint32_t v[2];
v[0] = out[ostarter];
v[1] = in[i];
cc = _wind_combining_class(in[i]);
if (old_cc != cc && (comb = find_composition(v, 2))) {
out[ostarter] = comb;
} else if (cc == 0) {
break;
} else {
if (o >= *out_len)
return WIND_ERR_OVERRUN;
out[o++] = in[i];
old_cc = cc;
}
@@ -260,6 +271,7 @@ combine(const uint32_t *in, size_t in_len,
}
}
*out_len = o;
return 0;
}
int
@@ -271,8 +283,8 @@ _wind_stringprep_normalize(const uint32_t *in, size_t in_len,
int ret;
tmp_len = in_len * 4;
if (tmp_len < MAX_LENGTH)
tmp_len = MAX_LENGTH;
if (tmp_len < MAX_LENGTH_CANON)
tmp_len = MAX_LENGTH_CANON;
tmp = malloc(tmp_len * sizeof(uint32_t));
if (tmp == NULL)
return ENOMEM;
@@ -283,7 +295,7 @@ _wind_stringprep_normalize(const uint32_t *in, size_t in_len,
return ret;
}
canonical_reorder(tmp, tmp_len);
combine(tmp, tmp_len, out, out_len);
ret = combine(tmp, tmp_len, out, out_len);
free(tmp);
return 0;
return ret;
}