Subject: bug#73985: fix: charset.max_char may be used before being set

From: Eli Zaretskii <[email-masked]>
Date: Thu, 24 Oct 2024 17:42:36 +0300

> Cc: [email-masked]
> Date: Thu, 24 Oct 2024 17:12:13 +0300
> From: Eli Zaretskii <[email-masked]>
> 
> > Date: Thu, 24 Oct 2024 11:46:17 +0000
> > From:  altermo31 via "Bug reports for GNU Emacs,
> >  the Swiss army knife of text editors" <[email-masked]>
> > 
> > Problem:
> > If the value to be set to charset.max_char is invalid, an error occurs, but the error uses the yet unset charset.max_char.
> > 
> > Solution:
> > Use the value that charset.max_char would be set to if the value wasn't invalid.
> 
> Thanks.  You are right that the original code is incorrect, but the
> code you propose has a subtle problem: the sum
> 
>   i + charset.code_offset
> 
> could overflow.  So we need to find a safer way of explaining the
> problem.

I fixed that (on the master branch) like this:

diff --git a/src/charset.c b/src/charset.c
index e8d0826..f7d80cc 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -1007,7 +1007,8 @@ DEFUN ("define-charset-internal", Fdefine_charset_internal,
 
       i = CODE_POINT_TO_INDEX (&charset, charset.max_code);
       if (MAX_CHAR - charset.code_offset < i)
-	error ("Unsupported max char: %d", charset.max_char);
+	error ("Unsupported max char: %d + %ud > MAX_CHAR (%d)",
+	       i, charset.max_code, MAX_CHAR);
       charset.max_char = i + charset.code_offset;
       i = CODE_POINT_TO_INDEX (&charset, charset.min_code);
       charset.min_char = i + charset.code_offset;