From patchwork Wed Apr 13 22:45:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Frysinger X-Patchwork-Id: 11740 X-Patchwork-Delegate: vapier@gentoo.org Received: (qmail 6812 invoked by alias); 13 Apr 2016 22:45:40 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 6799 invoked by uid 89); 13 Apr 2016 22:45:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.9 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:2054 X-HELO: smtp.gentoo.org From: Mike Frysinger To: libc-alpha@sourceware.org Cc: carlos@redhat.com, keld@keldix.com Subject: [PATCH] localedef: check LC_IDENTIFICATION.category values Date: Wed, 13 Apr 2016 18:45:32 -0400 Message-Id: <1460587532-5278-1-git-send-email-vapier@gentoo.org> In-Reply-To: <570E96AE.3070209@redhat.com> References: <570E96AE.3070209@redhat.com> 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 the 1993 POSIX and 2002 ISO-14652 standards. 2016-04-13 Mike Frysinger * locale/programs/ld-identification.c (identification_finish): Check that the values in identification->category are only posix:1993 or i18n:2002. --- locale/programs/ld-identification.c | 42 ++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/locale/programs/ld-identification.c b/locale/programs/ld-identification.c index 1e8fa84..eccb388 100644 --- a/locale/programs/ld-identification.c +++ b/locale/programs/ld-identification.c @@ -164,14 +164,42 @@ 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. */ + static const char * const standards[] = + { + "posix:1993", + "i18n:2002", + }; + 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])); + } + } }