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 { 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;
} }