This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][BZ 19084] Make sure _nl_value_type_LC_<category> arrays have correct size.


On 21 Mar 2016 10:10, Rafal Luzynski wrote:
> Otherwise if the last element of a category is an array (stringarray,
> wstringarray etc.) this array will count only the first element
> of the array element and will not load a category, will complain
> that a locale file is too long.

sorry, but i'm not seeing the problem here.  the type field is merely
an enum.  whether the last element is a stringarray (value of 2) or a
byte (value of 3), the array will still build up the same # of elements.

the _nl_value_type_LC_xxx array is indexing the _NL_xxx field only, not
the contents of it.

> --- a/locale/loadlocale.c
> +++ b/locale/loadlocale.c
> @@ -45,7 +45,8 @@ static const size_t _nl_category_num_items[] =
>  #define NO_PAREN(arg, rest...) arg, ##rest
>  
>  #define DEFINE_CATEGORY(category, category_name, items, a) \
> -static const enum value_type _nl_value_type_##category[] = { NO_PAREN items };
> +static const enum value_type _nl_value_type_##category     \
> +  [_NL_ITEM_INDEX (_NL_NUM_##category)] = { NO_PAREN items };
>  #define DEFINE_ELEMENT(element, element_name, optstd, type, rest...) \
>    [_NL_ITEM_INDEX (element)] = type,
>  #include "categories.def"

the code today will do for LC_IDENTIFICATION:
static const enum value_type _nl_value_type_LC_IDENTIFICATION[] = {
	[((int) (_NL_IDENTIFICATION_TITLE) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_SOURCE) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_ADDRESS) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_CONTACT) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_EMAIL) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_TEL) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_FAX) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_LANGUAGE) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_TERRITORY) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_AUDIENCE) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_APPLICATION) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_ABBREVIATION) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_REVISION) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_DATE) & 0xffff)] = string,
	[((int) (_NL_IDENTIFICATION_CATEGORY) & 0xffff)] = stringarray,
	[((int) (_NL_IDENTIFICATION_CODESET) & 0xffff)] = string,
};

these NL values are defined in langinfo.h and expand as:
  _NL_IDENTIFICATION_TITLE = (((12) << 16) | (0)),
  _NL_IDENTIFICATION_SOURCE,
  _NL_IDENTIFICATION_ADDRESS,
  _NL_IDENTIFICATION_CONTACT,
  _NL_IDENTIFICATION_EMAIL,
  _NL_IDENTIFICATION_TEL,
  _NL_IDENTIFICATION_FAX,
  _NL_IDENTIFICATION_LANGUAGE,
  _NL_IDENTIFICATION_TERRITORY,
  _NL_IDENTIFICATION_AUDIENCE,
  _NL_IDENTIFICATION_APPLICATION,
  _NL_IDENTIFICATION_ABBREVIATION,
  _NL_IDENTIFICATION_REVISION,
  _NL_IDENTIFICATION_DATE,
  _NL_IDENTIFICATION_CATEGORY,
  _NL_IDENTIFICATION_CODESET,
  _NL_NUM_LC_IDENTIFICATION,

_NL_IDENTIFICATION_CODESET is merely one larger than the
_NL_IDENTIFICATION_CATEGORY value.  if CODESET didn't exist,
then CATEGORY (a stringarray) would be at the end, but the
array would still be defined/calculated correctly.
-mike

Attachment: signature.asc
Description: Digital signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]