summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2010-05-18 14:05:43 -0400
committerChong Yidong <cyd@stupidchicken.com>2010-05-18 14:05:43 -0400
commit60dd06a08276422871cd3d491a44d10d4bdc690c (patch)
tree4baa92a13c1f684424c4276631cb84369a9e931c
parent472e7ec1e16f2f487e0e788f77fc9f3009b204b4 (diff)
parent754790b6c5a0ebe9cc1f2463d9446c5cb19b4264 (diff)
downloademacs-60dd06a08276422871cd3d491a44d10d4bdc690c.tar.gz
emacs-60dd06a08276422871cd3d491a44d10d4bdc690c.tar.bz2
emacs-60dd06a08276422871cd3d491a44d10d4bdc690c.zip
Fix stack overflow in string creation (Bug#6214).
* character.c (Fstring, Funibyte_string): Use SAFE_ALLOCA to prevent stack overflow if number of arguments is too large (Bug#6214).
-rw-r--r--src/ChangeLog6
-rw-r--r--src/character.c30
2 files changed, 26 insertions, 10 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index b0965f8e514..46346931085 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-18 Chong Yidong <cyd@stupidchicken.com>
+
+ * character.c (Fstring, Funibyte_string): Use SAFE_ALLOCA to
+ prevent stack overflow if number of arguments is too large
+ (Bug#6214).
+
2010-05-18 Juanma Barranquero <lekktu@gmail.com>
* charset.c (load_charset_map_from_file): Don't call close after fclose.
diff --git a/src/character.c b/src/character.c
index 5912a70d0ce..7cd1eedcef4 100644
--- a/src/character.c
+++ b/src/character.c
@@ -961,10 +961,13 @@ usage: (string &rest CHARACTERS) */)
int n;
Lisp_Object *args;
{
- int i;
- unsigned char *buf = (unsigned char *) alloca (MAX_MULTIBYTE_LENGTH * n);
- unsigned char *p = buf;
- int c;
+ int i, c;
+ unsigned char *buf, *p;
+ Lisp_Object str;
+ USE_SAFE_ALLOCA;
+
+ SAFE_ALLOCA (buf, unsigned char *, MAX_MULTIBYTE_LENGTH * n);
+ p = buf;
for (i = 0; i < n; i++)
{
@@ -973,7 +976,9 @@ usage: (string &rest CHARACTERS) */)
p += CHAR_STRING (c, p);
}
- return make_string_from_bytes ((char *) buf, n, p - buf);
+ str = make_string_from_bytes ((char *) buf, n, p - buf);
+ SAFE_FREE ();
+ return str;
}
DEFUN ("unibyte-string", Funibyte_string, Sunibyte_string, 0, MANY, 0,
@@ -983,10 +988,13 @@ usage: (unibyte-string &rest BYTES) */)
int n;
Lisp_Object *args;
{
- int i;
- unsigned char *buf = (unsigned char *) alloca (n);
- unsigned char *p = buf;
- unsigned c;
+ int i, c;
+ unsigned char *buf, *p;
+ Lisp_Object str;
+ USE_SAFE_ALLOCA;
+
+ SAFE_ALLOCA (buf, unsigned char *, n);
+ p = buf;
for (i = 0; i < n; i++)
{
@@ -997,7 +1005,9 @@ usage: (unibyte-string &rest BYTES) */)
*p++ = c;
}
- return make_string_from_bytes ((char *) buf, n, p - buf);
+ str = make_string_from_bytes ((char *) buf, n, p - buf);
+ SAFE_FREE ();
+ return str;
}
DEFUN ("char-resolve-modifiers", Fchar_resolve_modifiers,