1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-30 08:09:04 +00:00

* charset.c (load_charset_map_from_file)

(load_charset_map_from_vector): Fix last change to use SAFE_ALLOCA
instead of xmalloc (Bug#5526).
This commit is contained in:
Chong Yidong 2010-02-06 08:23:33 -05:00
parent ffe87109ce
commit a2f3eb1962
2 changed files with 28 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2010-02-06 Chong Yidong <cyd@stupidchicken.com>
* charset.c (load_charset_map_from_file)
(load_charset_map_from_vector): Fix last change to use SAFE_ALLOCA
instead of xmalloc (Bug#5526).
2010-02-05 Chong Yidong <cyd@stupidchicken.com>
* charset.c (load_charset_map_from_file): Allocate large

View File

@ -512,12 +512,13 @@ load_charset_map_from_file (charset, mapfile, control_flag)
int eof;
Lisp_Object suffixes;
struct charset_map_entries *head, *entries;
int n_entries;
int count = SPECPDL_INDEX ();
int n_entries, count;
USE_SAFE_ALLOCA;
suffixes = Fcons (build_string (".map"),
Fcons (build_string (".TXT"), Qnil));
count = SPECPDL_INDEX ();
specbind (Qfile_name_handler_alist, Qnil);
fd = openp (Vcharset_map_path, mapfile, suffixes, NULL, Qnil);
unbind_to (count, Qnil);
@ -525,8 +526,12 @@ load_charset_map_from_file (charset, mapfile, control_flag)
|| ! (fp = fdopen (fd, "r")))
error ("Failure in loading charset map: %S", SDATA (mapfile));
head = entries = ((struct charset_map_entries *)
xmalloc (sizeof (struct charset_map_entries)));
/* Use SAFE_ALLOCA instead of alloca, as `charset_map_entries' is
large (larger than MAX_ALLOCA). */
SAFE_ALLOCA (head, struct charset_map_entries *,
sizeof (struct charset_map_entries));
entries = head;
n_entries = 0;
eof = 0;
while (1)
@ -549,8 +554,8 @@ load_charset_map_from_file (charset, mapfile, control_flag)
if (n_entries > 0 && (n_entries % 0x10000) == 0)
{
entries->next = ((struct charset_map_entries *)
alloca (sizeof (struct charset_map_entries)));
SAFE_ALLOCA (entries->next, struct charset_map_entries *,
sizeof (struct charset_map_entries));
entries = entries->next;
}
idx = n_entries % 0x10000;
@ -563,7 +568,7 @@ load_charset_map_from_file (charset, mapfile, control_flag)
close (fd);
load_charset_map (charset, head, n_entries, control_flag);
xfree (head);
SAFE_FREE ();
}
static void
@ -578,6 +583,7 @@ load_charset_map_from_vector (charset, vec, control_flag)
int n_entries;
int len = ASIZE (vec);
int i;
USE_SAFE_ALLOCA;
if (len % 2 == 1)
{
@ -585,8 +591,12 @@ load_charset_map_from_vector (charset, vec, control_flag)
return;
}
head = entries = ((struct charset_map_entries *)
alloca (sizeof (struct charset_map_entries)));
/* Use SAFE_ALLOCA instead of alloca, as `charset_map_entries' is
large (larger than MAX_ALLOCA). */
SAFE_ALLOCA (head, struct charset_map_entries *,
sizeof (struct charset_map_entries));
entries = head;
n_entries = 0;
for (i = 0; i < len; i += 2)
{
@ -619,8 +629,8 @@ load_charset_map_from_vector (charset, vec, control_flag)
if (n_entries > 0 && (n_entries % 0x10000) == 0)
{
entries->next = ((struct charset_map_entries *)
alloca (sizeof (struct charset_map_entries)));
SAFE_ALLOCA (entries->next, struct charset_map_entries *,
sizeof (struct charset_map_entries));
entries = entries->next;
}
idx = n_entries % 0x10000;
@ -631,6 +641,7 @@ load_charset_map_from_vector (charset, vec, control_flag)
}
load_charset_map (charset, head, n_entries, control_flag);
SAFE_FREE ();
}