]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crash when dumping charset_table with portable dumper (Bug#52461)
authorYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Wed, 15 Dec 2021 04:12:02 +0000 (13:12 +0900)
committerYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Wed, 15 Dec 2021 04:12:02 +0000 (13:12 +0900)
* src/charset.h:
* src/charset.c (charset_table_used): Now extern.
* src/pdumper.c (dump_charset): Don't dump code_space_mask for unused
slots of charset_table.

src/charset.c
src/charset.h
src/pdumper.c

index 7cd0fa78f04291f5663357292515e747aa14ed18..670fd48a2d910857e503cefc0a15c1eaa3ef8896 100644 (file)
@@ -63,7 +63,7 @@ Lisp_Object Vcharset_hash_table;
 /* Table of struct charset.  */
 struct charset *charset_table;
 int charset_table_size;
-static int charset_table_used;
+int charset_table_used;
 
 /* Special charsets corresponding to symbols.  */
 int charset_ascii;
index 97122d82a6555ba20ac7061e0876aefd817dcafa..8c538234d8dddf4cd2ef392708476b33a874b0d4 100644 (file)
@@ -249,6 +249,7 @@ extern Lisp_Object Vcharset_hash_table;
 /* Table of struct charset.  */
 extern struct charset *charset_table;
 extern int charset_table_size;
+extern int charset_table_used;
 
 #define CHARSET_FROM_ID(id) (charset_table + (id))
 
index 98c760162e1d2dcdd04ca8167b0281a5684a77a8..2782648e7abfbf547bce9a1f7542a1ace9d31b79 100644 (file)
@@ -3174,7 +3174,7 @@ dump_charset (struct dump_context *ctx, int cs_i)
   DUMP_FIELD_COPY (&out, cs, hash_index);
   DUMP_FIELD_COPY (&out, cs, dimension);
   memcpy (out.code_space, &cs->code_space, sizeof (cs->code_space));
-  if (cs->code_space_mask)
+  if (cs_i < charset_table_used && cs->code_space_mask)
     dump_field_fixup_later (ctx, &out, cs, &cs->code_space_mask);
   DUMP_FIELD_COPY (&out, cs, code_linear_p);
   DUMP_FIELD_COPY (&out, cs, iso_chars_96);
@@ -3195,7 +3195,7 @@ dump_charset (struct dump_context *ctx, int cs_i)
   memcpy (out.fast_map, &cs->fast_map, sizeof (cs->fast_map));
   DUMP_FIELD_COPY (&out, cs, code_offset);
   dump_off offset = dump_object_finish (ctx, &out, sizeof (out));
-  if (cs->code_space_mask)
+  if (cs_i < charset_table_used && cs->code_space_mask)
     dump_remember_cold_op (ctx, COLD_OP_CHARSET,
                            Fcons (dump_off_to_lisp (cs_i),
                                   dump_off_to_lisp (offset)));