On Fri, Mar 18, 2022 at 05:03:34PM +0600, NRK wrote: > the array is not accessed outside of base64dec() so it makes sense to > limit it's scope to the related function. the static-storage duration of > the array is kept intact. > > this also removes unnecessary explicit zeroing from the start and end of > the array. anything that wasn't explicitly zero-ed will now be > implicitly zero-ed instead. > > the validity of the new array can be easily confirmed via running this > trivial loop: > > for (int i = 0; i < 255; ++i) > assert(base64_digits[i] == base64_digits_old[i]); > > lastly, as pointed out by Roberto, the array needs to have 256 elements > in order to able access it as any unsigned char as an index; the > previous array had 255. > > however, this array will only be accessed at indexes which are > isprint() || '=' (see `base64dec_getc()`), so reducing the size of the > array to the highest printable ascii char (127 AFAIK) + 1 might also be > a valid strategy. > --- > st.c | 22 +++++++--------------- > 1 file changed, 7 insertions(+), 15 deletions(-) > > diff --git a/st.c b/st.c > index 1307fdf..f43cfd3 100644 > --- a/st.c > +++ b/st.c > @@ -349,21 +349,6 @@ utf8validate(Rune *u, size_t i) > return i; > } > > -static const char base64_digits[] = { > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, > - 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, -1, 0, 0, 0, 0, 1, > - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, > - 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, > - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, > - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 > -}; > - > char > base64dec_getc(const char **src) > { > @@ -377,6 +362,13 @@ base64dec(const char *src) > { > size_t in_len = strlen(src); > char *result, *dst; > + static const char base64_digits[256] = { > + [43] = 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, > + 0, 0, 0, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, > + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, > + 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, > + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 > + }; > > if (in_len % 4) > in_len += 4 - (in_len % 4); > -- > 2.34.1 > >
Thank you for both patches, I like how this discussion and testing was going and found these 2 bugs. Applied both patches, -- Kind regards, Hiltjo