From b9deb8ce2a72de8f74361ea10dd4c4b116458518 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 26 Oct 2016 10:44:50 +0200 Subject: iconv: Avoid writable data and relocations in IBM charsets The IBM930, IBM933, IBM935 and IBM939 converters defined lookup tables which were not constant. They also contained an unnecessary pointer indirection. --- iconvdata/ibm939.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'iconvdata/ibm939.c') diff --git a/iconvdata/ibm939.c b/iconvdata/ibm939.c index c0a75f7..5122975 100644 --- a/iconvdata/ibm939.c +++ b/iconvdata/ibm939.c @@ -190,7 +190,6 @@ enum uint32_t ch = get32 (inptr); \ const struct gap *rp1 = __ucs4_to_ibm939sb_idx; \ const struct gap *rp2 = __ucs4_to_ibm939db_idx; \ - const char *cp; \ \ if (__glibc_unlikely (ch >= 0xffff)) \ { \ @@ -202,14 +201,16 @@ enum ++rp1; \ \ /* Use the UCS4 table for single byte. */ \ + unsigned char sbconv; \ if (__builtin_expect (ch < rp1->start, 0) \ - || (cp = __ucs4_to_ibm939sb[ch + rp1->idx], \ - __builtin_expect (cp[0], L'\1') == L'\0' && ch != '\0')) \ + || (sbconv = __ucs4_to_ibm939sb[ch + rp1->idx], \ + __builtin_expect (sbconv, L'\1') == L'\0' && ch != '\0')) \ { \ /* Use the UCS4 table for double byte. */ \ while (ch > rp2->end) \ ++rp2; \ \ + const char *cp; \ if (__builtin_expect (ch < rp2->start, 0) \ || (cp = __ucs4_to_ibm939db[ch + rp2->idx], \ __builtin_expect (cp[0], L'\1')==L'\0' && ch != '\0')) \ @@ -263,7 +264,7 @@ enum else if (ch == 0x5c) \ *outptr++ = 0xb2; \ else \ - *outptr++ = cp[0]; \ + *outptr++ = sbconv; \ } \ \ /* Now that we wrote the output increment the input pointer. */ \ -- cgit v1.1