mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
iconv: Avoid writable data and relocations in ISO646
This commit is contained in:
parent
b9deb8ce2a
commit
261e6758e7
@ -1,3 +1,9 @@
|
||||
2016-10-26 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* iconvdata/iso646.c (enum variant): Drop illegal_var.
|
||||
(names): Turn into concatenation of strings.
|
||||
(gconv_init): Adapt iteration over names.
|
||||
|
||||
2016-10-26 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* iconvdata/ibm930.h (__ucs4_to_ibm930sb): Remove indirection and
|
||||
|
@ -60,9 +60,9 @@ enum direction
|
||||
from_iso646
|
||||
};
|
||||
|
||||
/* See names below, must be in the same order. */
|
||||
enum variant
|
||||
{
|
||||
illegal_var,
|
||||
GB, /* BS_4730 */
|
||||
CA, /* CSA_Z243.4-1985-1 */
|
||||
CA2, /* CSA_Z243.4-1985-2 */
|
||||
@ -88,33 +88,33 @@ enum variant
|
||||
SE2 /* SEN_850200_C */
|
||||
};
|
||||
|
||||
static const char *names[] =
|
||||
{
|
||||
[GB] = "BS_4730//",
|
||||
[CA] = "CSA_Z243.4-1985-1//",
|
||||
[CA2] = "CSA_Z243.4-1985-2//",
|
||||
[DE] = "DIN_66003//",
|
||||
[DK] = "DS_2089//",
|
||||
[ES] = "ES//",
|
||||
[ES2] = "ES2//",
|
||||
[CN] = "GB_1988-80//",
|
||||
[IT] = "IT//",
|
||||
[JP] = "JIS_C6220-1969-RO//",
|
||||
[JP_OCR_B] = "JIS_C6229-1984-B//",
|
||||
[YU] = "JUS_I.B1.002//",
|
||||
[KR] = "KSC5636//",
|
||||
[HU] = "MSZ_7795.3//",
|
||||
[CU] = "NC_NC00-10//",
|
||||
[FR] = "NF_Z_62-010//",
|
||||
[FR1] = "NF_Z_62-010_1973//", /* Note that we don't have the parenthesis
|
||||
in the name. */
|
||||
[NO] = "NS_4551-1//",
|
||||
[NO2] = "NS_4551-2//",
|
||||
[PT] = "PT//",
|
||||
[PT2] = "PT2//",
|
||||
[SE] = "SEN_850200_B//",
|
||||
[SE2] = "SEN_850200_C//"
|
||||
};
|
||||
/* Must be in the same order as enum variant above. */
|
||||
static const char names[] =
|
||||
"BS_4730//\0"
|
||||
"CSA_Z243.4-1985-1//\0"
|
||||
"CSA_Z243.4-1985-2//\0"
|
||||
"DIN_66003//\0"
|
||||
"DS_2089//\0"
|
||||
"ES//\0"
|
||||
"ES2//\0"
|
||||
"GB_1988-80//\0"
|
||||
"IT//\0"
|
||||
"JIS_C6220-1969-RO//\0"
|
||||
"JIS_C6229-1984-B//\0"
|
||||
"JUS_I.B1.002//\0"
|
||||
"KSC5636//\0"
|
||||
"MSZ_7795.3//\0"
|
||||
"NC_NC00-10//\0"
|
||||
"NF_Z_62-010//\0"
|
||||
"NF_Z_62-010_1973//\0" /* Note that we don't have the parenthesis in
|
||||
the name. */
|
||||
"NS_4551-1//\0"
|
||||
"NS_4551-2//\0"
|
||||
"PT//\0"
|
||||
"PT2//\0"
|
||||
"SEN_850200_B//\0"
|
||||
"SEN_850200_C//\0"
|
||||
"\0";
|
||||
|
||||
struct iso646_data
|
||||
{
|
||||
@ -130,20 +130,24 @@ gconv_init (struct __gconv_step *step)
|
||||
/* Determine which direction. */
|
||||
struct iso646_data *new_data;
|
||||
enum direction dir = illegal_dir;
|
||||
enum variant var;
|
||||
int result;
|
||||
|
||||
for (var = sizeof (names) / sizeof (names[0]) - 1; var > illegal_var; --var)
|
||||
if (__strcasecmp (step->__from_name, names[var]) == 0)
|
||||
{
|
||||
dir = from_iso646;
|
||||
break;
|
||||
}
|
||||
else if (__strcasecmp (step->__to_name, names[var]) == 0)
|
||||
{
|
||||
dir = to_iso646;
|
||||
break;
|
||||
}
|
||||
enum variant var = 0;
|
||||
for (const char *name = names; *name != '\0';
|
||||
name = __rawmemchr (name, '\0') + 1)
|
||||
{
|
||||
if (__strcasecmp (step->__from_name, name) == 0)
|
||||
{
|
||||
dir = from_iso646;
|
||||
break;
|
||||
}
|
||||
else if (__strcasecmp (step->__to_name, name) == 0)
|
||||
{
|
||||
dir = to_iso646;
|
||||
break;
|
||||
}
|
||||
++var;
|
||||
}
|
||||
|
||||
result = __GCONV_NOCONV;
|
||||
if (__builtin_expect (dir, from_iso646) != illegal_dir)
|
||||
|
Loading…
Reference in New Issue
Block a user