Commit 5b4a152d authored by Tim Rühsen's avatar Tim Rühsen

Stricter check of punycode-decode input

parent 734ef70e
mmmmm'mmmmmmmmmmmmmmmmmmmmmmmm'mmmmmmmXN--mmmmmmmmmmmm'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xn-mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'ٮ.xn-'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xn-mmmmmmmmmmmmmmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmm\mmm.mmmm;m'ٮm;m'ٮ.mmmmmmmmmm.xn-mmmmmmmmmmmmmmmmmmmmmmmmmmmmmommmmmmmmmm'ٮ.
\ No newline at end of file
mmmmm'mmmmmmmmmmmmmmmmmmmmmmmm'mmmmmmmmmmmmmmmmmmmmmmm'ٮ.xn--mmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmmmmmmmmmm)mmmmmmm.xn*mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'ٮ.xn-'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xnmmmmmmmmmmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xn-mmmmmmmmmmmmmmmmmmmmmmmmmmmmmommmmmmmmmm'ٮ.
\ No newline at end of file
mmmmm'mmmmmmmmmmmmmmmmmmlmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.mmmmmmmٮ.xn--mm2mmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.mmmmmmmٮ.xn--mm2mmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmm.mmmmmmmm;m'ٮm;m'ٮ.xn--mmlmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.mmmmmmmٮ.xn--mm2mmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.mmmmmmmٮ.xn--mm2mmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.xn-mmmmmmmmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'ٮ.
\ No newline at end of file
.َ)..َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)ِ)Ǟ,ِ)Ǟ,)Ǟِ).َ)ِ)ِ)ِ)Ǟ,َِ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)ِ)Ǟ,ِ)Ǟ,)َ)ِ)ِ)Ǟ,َِ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)ِ)Ǟ,ِ)Ǟ,)Ǟِ).َ)ِ)ِ)ِ)Ǟ,َِ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)ِ)Ǟ,ِ)Ǟ,)Ǟِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)ِ)Ǟw,ِ)Ǟ,)Ǟِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)َ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)Ǟ,ِ)ِ).َ)ِ)ِ)Ǟ,َِ)ِ).َ)ِ)ِ)ِ)Ǟw,ِ)Ǟ,)Ǟ,
\ No newline at end of file
m.xn.xn--mm0mmn--mm0mmm..xn--mm0mmm.xn--mm2m.xn--mm0x.xn.xn--mm0mmm.xn--mm2m.xn--mm0x..xn--mm0mmm.xn--mm2m.xn---mm2m.XN--mm2m.xn--mm0mmm..xn-xn---mm0mmm.xn--mm2m.xn--mm0x.xn--mm0m.mmm..xn--mm0mmm.xn--mm2m.xn--mm0x.xn--mm0m.xn--mm0m2m.xn--mm2m.XN--mm2m.xn--mm0mmm..xn--mm0mmm.xn--mm2m.xn--mm0x.xn.xn--mm0mmm.xn--mm2m.xn--mm0x..xn--mm0mmm.xn--mm2m.xn---mm2m.XN--mm2m.xn--mm0mmm..xn-xn---mm0mmm.xn--mm2m.xn--mm0x.xn--mm0m.xn--mm0m2m.xn--mm2m.XN--mm2m.xn--mm0mmm..xn--mm0mmm.xn-xn--mm0m2m.xn--mm2m.XN---m.mnxm2-mm0mmm..xn--mm0mmm.xn--mm2m.xn--mm0x.xn.xn--mm0mmm.xn--mm2m.xn--mm0x..xn--mm0mmm.xn--mm2m.xn--mm1mmm
\ No newline at end of file
m.x0x.xn--mm0m.xn--mm0mmm.m.xn--mm2m.XN--mm2m.xn--mm0mmm..xn--mm0mmm.xn--mm3m.xn--mm2m.XN--mm2m.xn-xn--mm0x.xn--mm0m.xn--mm0mmm.m.xn--mm2m.XN2m-m.-mxn--mm0mmm..xn--mm0mmm.xn--mm3m.xn--mm2m.XN--mm2m.xn--mm2m.XN--mm2m.xn--mm0mmmmm2m.xn--mm0x.xn.xn--mm0mmm.xn--mm2m.xn--mm0x..xn--mm0mmm.xn--mm2m.xn---mm2m.XN--mm2m.xn--mm0mmm..xn-xn---mm0mmm.xn--mm2m.xn--mm0x.xn--mm0m.mmm..xn--mm0mmm.xn--mm2m.xn--mm0-mm2m.xn---mm2m.XN--mm2m.xn--mm0mmm..xn-xn---mm0mmm.xn--mm2m.xn--mm0x.xn--mm0m.xn--mm0m2m.xn--mm2m.--mm0x.xn.xn--mm0mmm.xn--mm2m.xn--mm0x..xn--mm0mmm.xn--m
m2m.xn--mm1mmm
\ No newline at end of file
mmmmm'mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.mmmmmmmٮ.xn--mm2mmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmxn--mmmmmmmmmmmmmmmmm.mmmm;m'ٮm;mmmmmٮ.xn--mm2mmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.mmmmmmmٮ.xn--mm2mmmmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmm-mmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmxn--mmmmmmmmmmmmmmmmm.mmmm;m'ٮm;m'ٮ.xn--mmmmmmmmmmmmmmmmmmmmm.xn--mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'ٮ.
\ No newline at end of file
>03-.XN--N-......xn---N--....xn----..xn----..xn--n--.XN--N---.XN--N;-.....xn---N-N--N---.XN--N-...xn.xn--n------.XN--N--.xn---N--....xn--n--.XN-----.XN--N-..-....xn----..xn----..xn--n--.XN--N---.XN--N;-.....xn---N-N--N---.XN--N-...xn.xn--n------.XN--N--.xn---N--....xn--n-..-...xn.xn--n---N---.XN--N--.....xn----.xn--n--.XN--N--.-.XN--N-.-
xn--ccc..xn--cccc...xn--ccc..xn--ccccc.qn--cccccccc...xn--ccc..xn--cccccccc..xn--ccc.;.Xcc...xn--ccc..xn--ccccc..x-..xn--cccccc..xn--ccc...xn--ccc..xn--cccccccccc...xn--ccc..xn--ccc..xn--ccc.+.Xcc...xn--ccc..xn--cccccc...cc...xn--ccc..xn--cccccZ.ccc..xc..xn--cccccc..xn--ccc..c...xn--ccc..xccc...xn--ccc..xn--cccccc..xn--ccc....+.Xcc...xn--ccc..xn--cccccc....x.xn--ccc..xn--cccccc..xn--ccc..xn--ccc..&
\ No newline at end of file
>...xn--........;...XN--.xn--.....xn--........;...XN--.......;...XN--.xn--.....xn--........;...XN--.xn--.XN--.xn--.....xn--........;...XN--.......;...XN--.xn--.....xn--........;...XN--.xn--....................t..xn--..................t.............;...XN--.xn--.....xn--........;...XN--.xn--.XN--.xn--.....xn--........;...XN--.......;...XN--.xn--.....xn--........;...XN--.xn--................t
\ No newline at end of file
.Х.3.َ.Х.3.ََ)َََ)َ)Х.3.ََ)َ).3.َ.Х.3.ََ)َ)Х.3.ََ)َ)ََ.َ)ََ.)Х.3.ََ)َ).3.َ.Х.3.ََ)َ)Х.3.ََ)َ)ََ.3.َ.Х.3.ََ)َ)Х.3.ََ)َ))َ).3.َ.Х.3.ََ)َ)Х.3.ََ)َ)ََ.َ)ََ.)Х.3.ََ)َ).3Х.3.ََ)َ)ََ.3.َ.Х.3.ََ)َ)Х.3.ََ)َ))َ).3.َ.Х.3.ََ)َ)Х.3.ََ)َ)ََ.َ.Х.3.ََ)َ)Х.3.ََ)َ)ََ.3.َ.Х.3.ََ)َ)Х.3.ََ)َ)ََ.َ)ََ.)Х.3ََ.َ)ََ.)Х.3.ََ)َ).َ)ََ.
\ No newline at end of file
xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xn--.xN--.xn--.xn--.xn--.xN--.xn--.xn--.xn--
\ No newline at end of file
......@@ -74,6 +74,7 @@
/**********************************************************/
/* Implementation (would normally go in its own .c file): */
#include <stdio.h>
#include <string.h>
#include "punycode.h"
......@@ -86,9 +87,6 @@ enum { base = 36, tmin = 1, tmax = 26, skew = 38, damp = 700,
/* basic(cp) tests whether cp is a basic code point: */
#define basic(cp) ((cp >= 'a' && cp <= 'z') || (cp >= '0' && cp <='9') || (cp >= 'A' && cp <='Z') || cp == '-' || cp == '_')
/* delim(cp) tests whether cp is a delimiter: */
#define delim(cp) ((cp) == delimiter)
/* decode_digit(cp) returns the numeric value of a basic code */
/* point (for use in representing integers) in the range 0 to */
/* base-1, or base if cp does not represent a value. */
......@@ -140,37 +138,44 @@ int punycode_decode(
size_t *output_length,
punycode_uint output[])
{
punycode_uint n, out, i, max_out, bias, oldi, w, k, digit, t;
size_t b, j, in;
/* Initialize the state: */
n = initial_n;
out = i = 0;
max_out = *output_length > maxint ? maxint
: (punycode_uint) *output_length;
bias = initial_bias;
punycode_uint n, out = 0, i, max_out, bias, oldi, w, k, digit, t;
size_t b = 0, j, in;
/* Handle the basic code points: Let b be the number of input code */
/* points before the last delimiter, or 0 if there is none, then */
/* copy the first b code points to the output. */
if (!input_length)
return punycode_bad_input;
for (b = j = 0; j < input_length; ++j) if (delim(input[j])) b = j;
if (b >= max_out) return punycode_big_output;
for (j = 0; j < b; ++j) {
/* Check that all chars are basic */
for (j = 0; j < input_length; ++j) {
if (!basic(input[j])) return punycode_bad_input;
output[out++] = input[j];
if (input[j] == delimiter) b = j;
}
if (input_length)
b += delim(input[b]);
max_out = *output_length > maxint ? maxint : (punycode_uint) *output_length;
for (j = b; j < input_length; ++j)
if (!basic(input[j])) return punycode_bad_input;
if (input[b] == delimiter) {
/* do not accept leading or trailing delimiter
* - leading delim must be omitted if there is no ASCII char in u-label
* - trailing delim means there where no non-ASCII chars in u-label
*/
if (!b || b == input_length - 1) return punycode_bad_input;
if (b >= max_out) return punycode_big_output;
/* Check that all chars before last delimiter are basic chars */
/* and copy the first b code points to the output. */
for (j = 0; j < b; j++)
output[out++] = input[j];
b += 1; /* advance to non-basic char encoding */
}
/* Initialize the state: */
n = initial_n;
i = 0;
bias = initial_bias;
/* Main decoding loop: Start just after the last delimiter if any */
/* basic code points were copied; start at the beginning otherwise. */
for (in = b; in < input_length; ++out) {
/* in is the index of the next ASCII code point to be consumed, */
......@@ -180,7 +185,6 @@ int punycode_decode(
/* which gets added to i. The overflow checking is easier */
/* if we increase i as we go, then subtract off its starting */
/* value at the end to obtain delta. */
for (oldi = i, w = 1, k = base; ; k += base) {
if (in >= input_length) return punycode_bad_input;
digit = decode_digit(input[in++]);
......@@ -198,7 +202,6 @@ int punycode_decode(
/* i was supposed to wrap around from out+1 to 0, */
/* incrementing n each time, so we'll fix that now: */
if (i / (out + 1) > maxint - n) return punycode_overflow;
n += i / (out + 1);
if (n > 0x10FFFF || (n >= 0xD800 && n <= 0xDBFF)) return punycode_bad_input;
......
......@@ -356,8 +356,17 @@ const test_t test[] = {
{
0x2e, 0x64, 0x65, 0
},
IDN2_OK
IDN2_PUNYCODE_BAD_INPUT
},
{
"No ASCII char but delimiter",
"xn---tda.de",
{
0x2e, 0x64, 0x65, 0
},
IDN2_PUNYCODE_BAD_INPUT
},
};
static int debug = 1;
......@@ -370,7 +379,7 @@ fail (const char *format, ...)
va_list arg_ptr;
va_start (arg_ptr, format);
vfprintf (stderr, format, arg_ptr);
vprintf (format, arg_ptr);
va_end (arg_ptr);
error_count++;
......@@ -416,7 +425,7 @@ _check_4z(const test_t *t, int rc, uint32_t *ucs4, const char *funcname)
{
if (rc != t->rc_expected && !(rc == IDN2_ICONV_FAIL && t->rc_expected == IDN2_ENCODING_ERROR))
{
fprintf (stderr, "Test[%u] '%s' failed (got %d, expected %d):\n",
printf ("Test[%u] '%s' failed (got %d, expected %d):\n",
(unsigned) (t - test), t->name, rc, t->rc_expected);
fail (" %s(): %s\n", funcname, idn2_strerror (rc));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment