diff options
Diffstat (limited to 'REORG.TODO/catgets/tst-catgets.c')
-rw-r--r-- | REORG.TODO/catgets/tst-catgets.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/REORG.TODO/catgets/tst-catgets.c b/REORG.TODO/catgets/tst-catgets.c new file mode 100644 index 0000000000..7169ceb841 --- /dev/null +++ b/REORG.TODO/catgets/tst-catgets.c @@ -0,0 +1,100 @@ +#include <assert.h> +#include <mcheck.h> +#include <nl_types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/resource.h> + + +static const char *msgs[] = +{ +#define INPUT(str) +#define OUTPUT(str) str, +#include <intl/msgs.h> +}; +#define nmsgs (sizeof (msgs) / sizeof (msgs[0])) + + +/* Test for unbounded alloca. */ +static int +do_bz17905 (void) +{ + char *buf; + struct rlimit rl; + nl_catd result __attribute__ ((unused)); + + const int sz = 1024 * 1024; + + getrlimit (RLIMIT_STACK, &rl); + rl.rlim_cur = sz; + setrlimit (RLIMIT_STACK, &rl); + + buf = malloc (sz + 1); + memset (buf, 'A', sz); + buf[sz] = '\0'; + setenv ("NLSPATH", buf, 1); + + result = catopen (buf, NL_CAT_LOCALE); + assert (result == (nl_catd) -1); + + free (buf); + return 0; +} + +#define ROUNDS 5 + +static int +do_test (void) +{ + int rnd; + int result = 0; + + mtrace (); + + /* We do this a few times to stress the memory handling. */ + for (rnd = 0; rnd < ROUNDS; ++rnd) + { + nl_catd cd = catopen ("libc", 0); + size_t cnt; + + if (cd == (nl_catd) -1) + { + printf ("cannot load catalog: %m\n"); + result = 1; + break; + } + + /* Go through all the messages and compare the result. */ + for (cnt = 0; cnt < nmsgs; ++cnt) + { + char *trans; + + trans = catgets (cd, 1, 1 + cnt, + "+#+# if this comes backs it's an error"); + + if (trans == NULL) + { + printf ("catgets return NULL for %zd\n", cnt); + result = 1; + } + else if (strcmp (trans, msgs[cnt]) != 0 && msgs[cnt][0] != '\0') + { + printf ("expected \"%s\", got \"%s\"\n", msgs[cnt], trans); + result = 1; + } + } + + if (catclose (cd) != 0) + { + printf ("catclose failed: %m\n"); + result = 1; + } + } + + result += do_bz17905 (); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |