diff options
author | Mike Frysinger <vapier@gentoo.org> | 2016-04-13 18:38:56 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2016-04-15 12:44:05 -0400 |
commit | 900f59f084bfe35cb389bbe0dc464413a1a38e90 (patch) | |
tree | 89c356ac80f3f52c9e9cd87bc1450836ead9db27 /locale | |
parent | 1a06eee86989d7058d317f3643355f8ec5e87efb (diff) | |
download | glibc-900f59f084bfe35cb389bbe0dc464413a1a38e90.tar.gz glibc-900f59f084bfe35cb389bbe0dc464413a1a38e90.tar.xz glibc-900f59f084bfe35cb389bbe0dc464413a1a38e90.zip |
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.
Diffstat (limited to 'locale')
-rw-r--r-- | locale/programs/ld-identification.c | 45 |
1 files changed, 38 insertions, 7 deletions
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])); + } + } } |