From 98807b31c11c88e4e1c21b14b73bb96e54026e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Mon, 11 Feb 2008 20:42:25 +0000 Subject: [PATCH] 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 --- lib/wind/normalize.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/lib/wind/normalize.c b/lib/wind/normalize.c index 7b16dd32f..bee9a9e5d 100644 --- a/lib/wind/normalize.c +++ b/lib/wind/normalize.c @@ -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; }