Subject: bug#5365: 23.1.91; Wrong type argument: keymapp, ("DEAD" . 35215396)

From: Chong Yidong <[email-masked]>
Date: Wed, 13 Jan 2010 15:53:40 -0500

Stefan Monnier <[email-masked]> writes:

>>> Even if that's the case, I'm not sure why Vlocal_function_key_map is
>>> getting garbage-collected, tho.
>
>> OK, I see one place where this could happen.  In xterm.c:10207:
>
> terminal-> kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
>>     ...
>>     if (!EQ (XSYMBOL (Qvendor_specific_keysyms)->function, Qunbound))
>>       {
>>         char *vendor = ServerVendor (dpy);
>>         /* Temporarily hide the partially initialized terminal */
>>         terminal_list = terminal->next_terminal;
>>         UNBLOCK_INPUT;
> terminal-> kboard->Vsystem_key_alist
>>           = call1 (Qvendor_specific_keysyms,
>>                    vendor ? build_string (vendor) : empty_unibyte_string);
>>         BLOCK_INPUT;
>>         ...
>>       }
>
> Indeed, that looks risky.  Why don't we add this new kboard to the
> all_kboards list before calling Qvendor_specific_keysyms?

We'd still have to protect the terminal object.  I've checked in a fix
that uses inhibit_garbage_collection, but if you'd like to replace this
with a more elegant fix, go ahead.

Since it appears to fix the problem (as far as Sven can tell), I'll
close this bug.  I'll forward the patch to the Debian bts too.