[{"id":3685949,"web_url":"http://patchwork.ozlabs.org/comment/3685949/","msgid":"<ec87c97f-03c2-43fd-8cb4-d138fb2fa527@linaro.org>","list_archive_url":null,"date":"2026-05-04T17:56:29","subject":"Re: [PATCH v3 2/2] intl: Add tests for plural expression hardening","submitter":{"id":66065,"url":"http://patchwork.ozlabs.org/api/people/66065/","name":"Adhemerval Zanella Netto","email":"adhemerval.zanella@linaro.org"},"content":"On 04/05/26 14:22, Avinal Kumar wrote:\n> The first test checks for stack overflow.  It uses a plural expression\n> nested 5000 levels deep using the !(1-(...)) pattern.  The parser\n> accepts it (below YYMAXDEPTH=10000), but evaluation exeeds\n> EVAL_MAXDEPTH=100 and falls back to index 0 instead of crashing with\n> SIGSEGV.\n> \n> The second test checks for division by zero in plural expression.  The\n> expression (n!=1)+1/(n!=1729) triggers 1/0 for n=1729.  msgfmt only\n> validates 0<= n <= 1000, so the .mo file is accepted.  Evaluation\n> returns PE_INTDIV and falls back instead of raising SIGFPE.\n> \n> Adaptations from gettext to glibc:\n> \n> - gettext's plural-3 embeds the nested expresion as a literal string.\n> This test uses an AWK script (plural-depth.awk) to generate the same\n> expression.\n> \n> - gettext uses LANGUAGE= (empty) with LC_ALL=ll and its own locale\n> setup.  glibc requires a real locale for setlocale() or else the \"C\"\n> locale override in dcigettext.c ignores LANGUAGE entirely.\n> \n> The tests are derived from GNU gettext's plural-3 (commit 021348871a22)\n> and plural-4 (commit 429ba6c6b835), adapted to glibc's test framework.\n> \n> Original author: Bruno Haible <bruno@clisp.org>\n> Signed-off-by: Avinal Kumar <avinal.xlvii@gmail.com>\n\nLGTM, thanks.\n\nReviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>\n\n> ---\n> Changes from v2:\n> - Use TEST_VERIFY\n> - Style changes in Makefile\n> - Typo fixed in commit message\n> \n>  intl/Makefile           | 32 +++++++++++++----\n>  intl/plural-depth.awk   | 54 +++++++++++++++++++++++++++++\n>  intl/tst-plural-eval.c  | 76 +++++++++++++++++++++++++++++++++++++++++\n>  intl/tst-plural-eval.sh | 67 ++++++++++++++++++++++++++++++++++++\n>  4 files changed, 223 insertions(+), 6 deletions(-)\n>  create mode 100644 intl/plural-depth.awk\n>  create mode 100644 intl/tst-plural-eval.c\n>  create mode 100644 intl/tst-plural-eval.sh\n> \n> diff --git a/intl/Makefile b/intl/Makefile\n> index 42875eb1a9..a8b41a1993 100644\n> --- a/intl/Makefile\n> +++ b/intl/Makefile\n> @@ -22,13 +22,21 @@ subdir = intl\n>  include ../Makeconfig\n>  \n>  headers = libintl.h\n> -routines = bindtextdom dcgettext dgettext gettext\t\\\n> +routines = bindtextdom dcgettext dgettext gettext \\\n>  \t   dcigettext dcngettext dngettext ngettext \\\n>  \t   finddomain loadmsgcat localealias textdomain\n> -aux =\t   l10nflist explodename plural plural-exp hash-string\n> +aux = l10nflist explodename plural plural-exp hash-string\n>  \n>  multithread-test-srcs := tst-gettext4 tst-gettext5 tst-gettext6\n> -test-srcs := tst-gettext tst-translit tst-gettext2 tst-codeset tst-gettext3\n> +test-srcs := \\\n> +\ttst-gettext \\\n> +\ttst-translit \\\n> +\ttst-gettext2 \\\n> +\ttst-codeset \\\n> +\ttst-gettext3 \\\n> +\ttst-plural-eval\n> +\t# test-srcs\n> +\n>  ifeq ($(have-thread-library),yes)\n>  test-srcs += $(multithread-test-srcs)\n>  endif\n> @@ -53,9 +61,15 @@ $(objpfx)plural.o: $(objpfx)plural.c\n>  ifeq ($(run-built-tests),yes)\n>  ifeq (yes,$(build-shared))\n>  ifneq ($(strip $(MSGFMT)),:)\n> -tests-special += $(objpfx)tst-translit.out $(objpfx)tst-gettext.out \\\n> -\t\t $(objpfx)tst-gettext2.out $(objpfx)tst-codeset.out \\\n> -\t\t $(objpfx)tst-gettext3.out\n> +tests-special += \\\n> +\t$(objpfx)tst-translit.out \\\n> +\t$(objpfx)tst-gettext.out \\\n> +\t$(objpfx)tst-gettext2.out \\\n> +\t$(objpfx)tst-codeset.out \\\n> +\t$(objpfx)tst-gettext3.out \\\n> +\t$(objpfx)tst-plural-eval.out\n> +\t# tests-special\n> +\n>  ifeq ($(have-thread-library),yes)\n>  tests-special += $(objpfx)tst-gettext4.out $(objpfx)tst-gettext5.out \\\n>  \t\t $(objpfx)tst-gettext6.out\n> @@ -103,6 +117,10 @@ $(objpfx)tst-gettext4.out: tst-gettext4.sh $(objpfx)tst-gettext4\n>  $(objpfx)tst-gettext6.out: tst-gettext6.sh $(objpfx)tst-gettext6\n>  \t$(SHELL) $< $(common-objpfx) '$(test-program-prefix)' $(common-objpfx)intl/; \\\n>  \t$(evaluate-test)\n> +$(objpfx)tst-plural-eval.out: tst-plural-eval.sh $(objpfx)tst-plural-eval\n> +\t$(SHELL) $< $(common-objpfx) '$(test-program-prefix)' \\\n> +\t  $(common-objpfx)intl/; \\\n> +\t$(evaluate-test)\n>  \n>  $(objpfx)tst-codeset.out: $(codeset_mo)\n>  $(objpfx)tst-gettext3.out: $(codeset_mo)\n> @@ -140,6 +158,7 @@ CFLAGS-tst-gettext3.c += -DOBJPFX=\\\"$(objpfx)\\\"\n>  CFLAGS-tst-gettext4.c += -DOBJPFX=\\\"$(objpfx)\\\"\n>  CFLAGS-tst-gettext5.c += -DOBJPFX=\\\"$(objpfx)\\\"\n>  CFLAGS-tst-gettext6.c += -DOBJPFX=\\\"$(objpfx)\\\"\n> +CFLAGS-tst-plural-eval.c += -DOBJPFX=\\\"$(objpfx)\\\"\n>  \n>  ifeq ($(have-thread-library),yes)\n>  ifeq (yes,$(build-shared))\n> @@ -156,6 +175,7 @@ $(objpfx)tst-gettext3.out: $(objpfx)tst-gettext.out\n>  $(objpfx)tst-gettext4.out: $(objpfx)tst-gettext.out\n>  $(objpfx)tst-gettext5.out: $(objpfx)tst-gettext.out\n>  $(objpfx)tst-gettext6.out: $(objpfx)tst-gettext.out\n> +$(objpfx)tst-plural-eval.out: $(objpfx)tst-gettext.out\n>  \n>  CPPFLAGS += -D'LOCALEDIR=\"$(localedir)\"' \\\n>  \t    -D'LOCALE_ALIAS_PATH=\"$(localedir)\"' \\\n> diff --git a/intl/plural-depth.awk b/intl/plural-depth.awk\n> new file mode 100644\n> index 0000000000..7b200c00e9\n> --- /dev/null\n> +++ b/intl/plural-depth.awk\n> @@ -0,0 +1,54 @@\n> +# plural-depth.awk - Generate .po file with deeply nested plural expression.\n> +# Copyright (C) 2026 Free Software Foundation, Inc.\n> +#\n> +# This file is part of the GNU C Library.\n> +#\n> +# The GNU C Library is free software; you can redistribute it and/or\n> +# modify it under the terms of the GNU Lesser General Public\n> +# License as published by the Free Software Foundation; either\n> +# version 2.1 of the License, or (at your option) any later version.\n> +#\n> +# The GNU C Library is distributed in the hope that it will be useful,\n> +# but WITHOUT ANY WARRANTY; without even the implied warranty of\n> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n> +# Lesser General Public License for more details.\n> +#\n> +# You should have received a copy of the GNU Lesser General Public\n> +# License along with the GNU C Library; if not, see\n> +# <https://www.gnu.org/licenses/>.\n> +\n> +# Generate a .po file whose Plural-Forms header contains a plural\n> +# expression nested DEPTH levels deep.  Each level wraps as !(1-(...)),\n> +# producing an expression that is accepted by the parser (YYMAXDEPTH=10000)\n> +# but exceeds EVAL_MAXDEPTH=100 at runtime.\n> +#\n> +# Usage: awk -v DEPTH=5000 -f plural-depth.awk > plural-depth.po\n> +\n> +BEGIN {\n> +    if (DEPTH == 0)\n> +\tDEPTH = 5000\n> +\n> +    expr = \"\"\n> +    for (i = 0; i < DEPTH; i++)\n> +\texpr = expr \"!(1-\"\n> +    expr = expr \"(n!=1)\"\n> +    for (i = 0; i < DEPTH; i++)\n> +\texpr = expr \")\"\n> +\n> +    print \"msgid \\\"\\\"\"\n> +    print \"msgstr \\\"\\\"\"\n> +    print \"\\\"Project-Id-Version: test\\\\n\\\"\"\n> +    print \"\\\"PO-Revision-Date: 2026-01-01 00:00+0000\\\\n\\\"\"\n> +    print \"\\\"Last-Translator: \\\\n\\\"\"\n> +    print \"\\\"Language-Team: \\\\n\\\"\"\n> +    print \"\\\"Language: ll\\\\n\\\"\"\n> +    print \"\\\"MIME-Version: 1.0\\\\n\\\"\"\n> +    print \"\\\"Content-Type: text/plain; charset=ASCII\\\\n\\\"\"\n> +    print \"\\\"Content-Transfer-Encoding: 8bit\\\\n\\\"\"\n> +    print \"\\\"Plural-Forms: nplurals=2; plural=\" expr \";\\\\n\\\"\"\n> +    print \"\"\n> +    print \"msgid \\\"X\\\"\"\n> +    print \"msgid_plural \\\"Y\\\"\"\n> +    print \"msgstr[0] \\\"x\\\"\"\n> +    print \"msgstr[1] \\\"y\\\"\"\n> +}\n> diff --git a/intl/tst-plural-eval.c b/intl/tst-plural-eval.c\n> new file mode 100644\n> index 0000000000..8658598330\n> --- /dev/null\n> +++ b/intl/tst-plural-eval.c\n> @@ -0,0 +1,76 @@\n> +/* Test plural expression evaluation hardening.\n> +   Copyright (C) 2026 Free Software Foundation, Inc.\n> +   This file is part of the GNU C Library.\n> +\n> +   The GNU C Library is free software; you can redistribute it and/or\n> +   modify it under the terms of the GNU Lesser General Public\n> +   License as published by the Free Software Foundation; either\n> +   version 2.1 of the License, or (at your option) any later version.\n> +\n> +   The GNU C Library is distributed in the hope that it will be useful,\n> +   but WITHOUT ANY WARRANTY; without even the implied warranty of\n> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n> +   Lesser General Public License for more details.\n> +\n> +   You should have received a copy of the GNU Lesser General Public\n> +   License along with the GNU C Library; if not, see\n> +   <https://www.gnu.org/licenses/>.  */\n> +\n> +#include <libintl.h>\n> +#include <locale.h>\n> +#include <stdio.h>\n> +#include <stdlib.h>\n> +#include <string.h>\n> +#include <support/check.h>\n> +#include <support/support.h>\n> +\n> +static int\n> +do_test (void)\n> +{\n> +  unsetenv (\"OUTPUT_CHARSET\");\n> +\n> +  /* Use a real locale so that the active locale is not \"C\".  */\n> +  TEST_VERIFY (setenv (\"LC_ALL\", \"de_DE.UTF-8\", 1) == 0);\n> +  xsetlocale (LC_ALL, \"\");\n> +  /* Set a dummy langauge to override lookup.  */\n> +  TEST_VERIFY (setenv (\"LANGUAGE\", \"ll\", 1) == 0);\n> +\n> +  /* Test 1: Stack overflow in plural evaluation.\n> +     The .mo file has a plural expression with 5000 levels of nesting\n> +     like !(1-(!(1-(...(n!=1)...)))).  Before the fix, plural_eval()\n> +     used unbounded recursion and would crash with SIGSEGV on threads\n> +     with small stacks.  After the fix, EVAL_MAXDEPTH=100 causes\n> +     plural_eval_recurse() to return PE_STACKOVF, and plural_lookup()\n> +     falls back to index 0 (the singular form).  */\n> +\n> +  TEST_VERIFY (bindtextdomain (\"plural-depth\", OBJPFX \"domaindir\") != NULL);\n> +  TEST_VERIFY (textdomain (\"plural-depth\") != NULL);\n> +\n> +  /* ngettext must not crash.  The return value depends on whether\n> +     the depth limit is hit (falls back to index 0) or the expression\n> +     evaluates successfully.  Either result is acceptable.  */\n> +\n> +  const char *tr = ngettext (\"X\", \"Y\", 42);\n> +  TEST_VERIFY (tr != NULL);\n> +  TEST_VERIFY (strcmp (tr, \"x\") == 0 || strcmp (tr, \"y\") == 0);\n> +\n> +  /* Test 2: Division by zero in plural evaluation.\n> +     The .mo file has plural expression (n!=1)+1/(n!=1729).\n> +     For n=1729, (n!=1729) is 0, so 1/0 triggers division by zero.\n> +     Before the fix, this raised SIGFPE.  After the fix,\n> +     plural_eval_recurse() returns PE_INTDIV, and plural_lookup()\n> +     falls back to index 0.  */\n> +\n> +  TEST_VERIFY (bindtextdomain (\"plural-divzero\", OBJPFX \"domaindir\") != NULL);\n> +  TEST_VERIFY (textdomain (\"plural-divzero\") != NULL);\n> +\n> +  /* ngettext with n=1729 must not crash with SIGFPE.  */\n> +  tr = ngettext (\"X\", \"Y\", 1729);\n> +  TEST_VERIFY (tr != NULL);\n> +  TEST_VERIFY (strcmp (tr, \"x\") == 0 || strcmp (tr, \"y\") == 0\n> +\t       || strcmp (tr, \"z\") == 0);\n> +\n> +  return 0;\n> +}\n> +\n> +#include <support/test-driver.c>\n> diff --git a/intl/tst-plural-eval.sh b/intl/tst-plural-eval.sh\n> new file mode 100644\n> index 0000000000..f020fa9925\n> --- /dev/null\n> +++ b/intl/tst-plural-eval.sh\n> @@ -0,0 +1,67 @@\n> +#!/bin/sh\n> +# Test plural expression evaluation hardening.\n> +# Copyright (C) 2026 Free Software Foundation, Inc.\n> +# This file is part of the GNU C Library.\n> +\n> +# The GNU C Library is free software; you can redistribute it and/or\n> +# modify it under the terms of the GNU Lesser General Public\n> +# License as published by the Free Software Foundation; either\n> +# version 2.1 of the License, or (at your option) any later version.\n> +\n> +# The GNU C Library is distributed in the hope that it will be useful,\n> +# but WITHOUT ANY WARRANTY; without even the implied warranty of\n> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n> +# Lesser General Public License for more details.\n> +\n> +# You should have received a copy of the GNU Lesser General Public\n> +# License along with the GNU C Library; if not, see\n> +# <https://www.gnu.org/licenses/>.\n> +\n> +set -e\n> +\n> +common_objpfx=$1\n> +test_program_prefix=$2\n> +objpfx=$3\n> +\n> +# Create domain directories.\n> +mkdir -p ${objpfx}domaindir/ll/LC_MESSAGES\n> +\n> +# Test 1: Deeply nested plural expression (stack overflow test).\n> +# This expression has 5000 levels of nesting, well above EVAL_MAXDEPTH=100\n> +# but below YYMAXDEPTH=10000 so the parser accepts it.\n> +LC_ALL=C awk -v DEPTH=5000 -f plural-depth.awk > ${objpfx}plural-depth.po\n> +\n> +msgfmt -o ${objpfx}domaindir/ll/LC_MESSAGES/plural-depth.mo \\\n> +       ${objpfx}plural-depth.po || exit 1\n> +\n> +# Test 2: Division by zero in plural expression (SIGFPE test).\n> +# The expression 1/(n!=1729) triggers division by zero for n=1729.\n> +# msgfmt -c only checks 0 <= n <= 1000, so this passes validation.\n> +cat > ${objpfx}plural-divzero.po <<EOF\n> +msgid \"\"\n> +msgstr \"\"\n> +\"Project-Id-Version: test\\n\"\n> +\"PO-Revision-Date: 2026-01-01 00:00+0000\\n\"\n> +\"Last-Translator: \\n\"\n> +\"Language-Team: \\n\"\n> +\"Language: ll\\n\"\n> +\"MIME-Version: 1.0\\n\"\n> +\"Content-Type: text/plain; charset=ASCII\\n\"\n> +\"Content-Transfer-Encoding: 8bit\\n\"\n> +\"Plural-Forms: nplurals=3; plural=(n!=1)+1/(n!=1729);\\n\"\n> +\n> +msgid \"X\"\n> +msgid_plural \"Y\"\n> +msgstr[0] \"x\"\n> +msgstr[1] \"y\"\n> +msgstr[2] \"z\"\n> +EOF\n> +\n> +msgfmt -o ${objpfx}domaindir/ll/LC_MESSAGES/plural-divzero.mo \\\n> +       ${objpfx}plural-divzero.po || exit 1\n> +\n> +# Run the test.\n> +${test_program_prefix} \\\n> +${objpfx}tst-plural-eval ${objpfx}domaindir\n> +\n> +exit $?","headers":{"Return-Path":"<libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org>","X-Original-To":["incoming@patchwork.ozlabs.org","libc-alpha@sourceware.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","libc-alpha@sourceware.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=PZM2reuL;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=PZM2reuL","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=linaro.org","sourceware.org; spf=pass smtp.mailfrom=linaro.org","server2.sourceware.org;\n arc=none smtp.remote-ip=2607:f8b0:4864:20::a29"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g8TrB3ySpz1yJV\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 05 May 2026 03:57:30 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 99A084BAE7DA\n\tfor <incoming@patchwork.ozlabs.org>; Mon,  4 May 2026 17:57:28 +0000 (GMT)","from mail-vk1-xa29.google.com (mail-vk1-xa29.google.com\n [IPv6:2607:f8b0:4864:20::a29])\n by sourceware.org (Postfix) with ESMTPS id 4E06F4BA23E7\n for <libc-alpha@sourceware.org>; Mon,  4 May 2026 17:56:34 +0000 (GMT)","by mail-vk1-xa29.google.com with SMTP id\n 71dfb90a1353d-57516bb40b9so1240826e0c.1\n for <libc-alpha@sourceware.org>; Mon, 04 May 2026 10:56:34 -0700 (PDT)","from ?IPV6:2804:1b3:a7c1:364:8c6d:41c2:d01:c918?\n ([2804:1b3:a7c1:364:8c6d:41c2:d01:c918])\n by smtp.gmail.com with ESMTPSA id\n 71dfb90a1353d-5749f7e9f72sm6440700e0c.3.2026.05.04.10.56.31\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Mon, 04 May 2026 10:56:32 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 99A084BAE7DA","OpenDKIM Filter v2.11.0 sourceware.org 4E06F4BA23E7"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 4E06F4BA23E7","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 4E06F4BA23E7","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777917394; cv=none;\n b=NeZeGYnSwvJMOxKzoVHuMgXEpI4ixz7OIkGNq3cqtQxzCkMtM08Gz+NDStvvkehGCKYJvmRVNXTG3/RjmHUyYdpC5NqK35Uhq7YGXVFmqre2VV/JjQ5SYgurycM+THlsGsTyWLNLjw1w/GoRziW7wY5EYdvjlboLyGtH8n34ztU=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777917394; c=relaxed/simple;\n bh=aqFhqg2QqrtWL9WIwV93u27mgQLnbWqmBTBBxN65v9U=;\n h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From;\n b=vBAyP61LzXsPlPM0xUa9/Yro5JhV1sQKgrwW6QKMBes5FM8MQbr6U98xxJU033Q3dpAPQp3srD84IVQOKG4HDWvUIzPMsxVB05MN/RSljPwqZcmoq11y4IVU5CcK8xQWXkhDKtklkLDA25l6dqCVMg+fxKE9XOJDBYoleATZPxM=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1777917394; x=1778522194; darn=sourceware.org;\n h=content-transfer-encoding:in-reply-to:organization:from\n :content-language:references:to:subject:user-agent:mime-version:date\n :message-id:from:to:cc:subject:date:message-id:reply-to;\n bh=izUgFUra9MaDMv+Pm4wKtaUrCuF3YS8ZQiQwRPxrX4M=;\n b=PZM2reuL4D4v+8ddfVN/1yfzKO/PXUmsDsIAhkz5wMke4ZiQkqeCuRCqcxRM55FdOO\n gbmH+iY1BN2J6KH9ebU6OwcNfRedmMraagi/Bucs7TyzB3G7pUPTMNFo1GJblQ0+fpXk\n bhku7YNGwPK/2VZeXkBLz92aqs3nWbrKrNdCu+P6ODBc6wye+67btayHc044YgjVUy7q\n V4BTDJg8dfIX0RJlER7EAKKOSKQoeH6jHsX9iLAcf4P5SVdFBPE68w+2mw1Y+c+TvBL1\n afGGPov6rqqyKfzzwpy74hqvJs3FVTGbT8RnLJ02dEZ8PTUUSf1INgJbhHXuRn/mIqo7\n PPEQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777917394; x=1778522194;\n h=content-transfer-encoding:in-reply-to:organization:from\n :content-language:references:to:subject:user-agent:mime-version:date\n :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=izUgFUra9MaDMv+Pm4wKtaUrCuF3YS8ZQiQwRPxrX4M=;\n b=doGK33lmRNbIyhKaS8/zAnxISxTbAnoHxoQSBn48iZvI/UsfTM8kQuDVS+9IPzYfyJ\n OnRq3FCubozn1a74IlBByri8gEY3ueBEPs+CnBD9JTpa5pV5xbUKh634EWLQml7Zkl0l\n J+sxahhHxHe3ZfHgAQozTetdyRoIChXr9DoxSsDkEkbjhR7yRZL2WAcR7gP5gF+P+baR\n 44x020wzYFWYQORNnXz9qvoPdl354lQmlioUSXLqdwN68L5wA+6GsyfVAv1waKA/VI6g\n 5Iyo1qYgDuEwC6BJ0VylviWB/PTgJQ105naIq4h0afjoPEkCbZngPxKu2dj3BfwUxyjZ\n e66g==","X-Forwarded-Encrypted":"i=1;\n AFNElJ+ebCJh9Xws3ArDaotAOE3iCLT7q0S7D0Y1V+4Go4LuWA9RJZUT6eWN87A81uFVDGw4BQOGVQyDOlKS@sourceware.org","X-Gm-Message-State":"AOJu0YyBmBye/sgEZ2IewvAJTUyKHafwNrof1rmO3troZ8NntosAfZpO\n z31pGCTV8J+nN5i0eNEOFvmiN/+r9HOBQz5y3/jjXRIltiVWBltbtkzB4p25MmetRgY=","X-Gm-Gg":"AeBDies5VjAiON0VG7lVOficcKFdyKIaRk8+0eriCjx6c/hMhYIOM9yN11xhpJ5c0PX\n DlTB1VFxnylRHHuHyr5b7TxyB30L/z0QSFA1ymMmz85HEgCTzcypF94JDkV35hYc9rs9OrsxoTX\n Z2AOxt6lZCcpuAoYOTzymo75HlcOiv2OuroplGcoeCgajrR30zpnLhSFzyNBNlvHeaoylsPTZ6l\n aESg7lkG/dVVhxOu0N09pRUNLqEp1fdkjGRuNDhMF2heKeQBE7kUb3Q7mU5f4N7ZrbPzXTWKq5y\n eyqzj/71MR+oSU2Ju7s59ZRwrz4Q4bFjeuynRXleBk3kIAl5r7xy1GZO0Gq6rQZH/BF0cxx9xe2\n HIngT1X9lnOH/gUihzTi1XaV8YVpOy6Yb/WrjG12xYnSx7FxA7NXBogIyja8c3lcZGxhK4ms337\n tTlKYNKLjIOYs2xk2Sa7MTSO7Frrmw4/hoBJZxkX79UXXrfBDDWpcf505c/w4sPlEVXf8DV/ZQV\n t8u4ioQkFqTXdZQDmdpGrOPjBdPFiSZr5hk/X6OlNX8nLLemQ==","X-Received":"by 2002:a05:6122:4145:b0:575:352f:ead0 with SMTP id\n 71dfb90a1353d-575352ff116mr2291552e0c.6.1777917393529;\n Mon, 04 May 2026 10:56:33 -0700 (PDT)","Message-ID":"<ec87c97f-03c2-43fd-8cb4-d138fb2fa527@linaro.org>","Date":"Mon, 4 May 2026 14:56:29 -0300","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v3 2/2] intl: Add tests for plural expression hardening","To":"Avinal Kumar <avinal.xlvii@gmail.com>, libc-alpha@sourceware.org","References":"<20260504172206.2470310-1-avinal.xlvii@gmail.com>\n <20260504172206.2470310-2-avinal.xlvii@gmail.com>","Content-Language":"en-US","From":"Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>","Organization":"Linaro","In-Reply-To":"<20260504172206.2470310-2-avinal.xlvii@gmail.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","X-BeenThere":"libc-alpha@sourceware.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Libc-alpha mailing list <libc-alpha.sourceware.org>","List-Unsubscribe":"<https://sourceware.org/mailman/options/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe>","List-Archive":"<https://sourceware.org/pipermail/libc-alpha/>","List-Post":"<mailto:libc-alpha@sourceware.org>","List-Help":"<mailto:libc-alpha-request@sourceware.org?subject=help>","List-Subscribe":"<https://sourceware.org/mailman/listinfo/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=subscribe>","Errors-To":"libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org"}}]