From 900f59f084bfe35cb389bbe0dc464413a1a38e90 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 13 Apr 2016 18:38:56 -0400 Subject: localedef: check LC_IDENTIFICATION.category values Currently localedef accepts any value for the category keyword. This has allowed bad values to propagate to the vast majority of locales (~90%). Add some logic to only accept a few standards. --- locale/programs/ld-identification.c | 45 +++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'locale/programs') diff --git a/locale/programs/ld-identification.c b/locale/programs/ld-identification.c index 1e8fa84712..84a21acaa7 100644 --- a/locale/programs/ld-identification.c +++ b/locale/programs/ld-identification.c @@ -164,14 +164,45 @@ No definition for %s category found"), "LC_IDENTIFICATION")); TEST_ELEM (date); for (num = 0; num < __LC_LAST; ++num) - if (num != LC_ALL && identification->category[num] == NULL) - { - if (verbose && ! nothing) - WITH_CUR_LOCALE (error (0, 0, _("\ + { + /* We don't accept/parse this category, so skip it early. */ + if (num == LC_ALL) + continue; + + if (identification->category[num] == NULL) + { + if (verbose && ! nothing) + WITH_CUR_LOCALE (error (0, 0, _("\ %s: no identification for category `%s'"), - "LC_IDENTIFICATION", category_name[num])); - identification->category[num] = ""; - } + "LC_IDENTIFICATION", category_name[num])); + identification->category[num] = ""; + } + else + { + /* Only list the standards we care about. This is based on the + ISO 30112 WD10 [2014] standard which supersedes all previous + revisions of the ISO 14652 standard. */ + static const char * const standards[] = + { + "posix:1993", + "i18n:2004", + "i18n:2012", + }; + size_t i; + bool matched = false; + + for (i = 0; i < sizeof (standards) / sizeof (standards[0]); ++i) + if (strcmp (identification->category[num], standards[i]) == 0) + matched = true; + + if (matched != true) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: unknown standard `%s' for category `%s'"), + "LC_IDENTIFICATION", + identification->category[num], + category_name[num])); + } + } } -- cgit 1.4.1