[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs/src ChangeLog fns.c process.c
From: |
Andreas Schwab |
Subject: |
[Emacs-diffs] emacs/src ChangeLog fns.c process.c |
Date: |
Tue, 28 Apr 2009 19:02:28 +0000 |
CVSROOT: /sources/emacs
Module name: emacs
Changes by: Andreas Schwab <schwab> 09/04/28 19:02:28
Modified files:
src : ChangeLog fns.c process.c
Log message:
* fns.c (Flocale_info): Protect vector from GC during decoding.
* process.c (Fstart_process): Protect argv strings from GC during
encoding.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/src/ChangeLog?cvsroot=emacs&r1=1.7513&r2=1.7514
http://cvs.savannah.gnu.org/viewcvs/emacs/src/fns.c?cvsroot=emacs&r1=1.456&r2=1.457
http://cvs.savannah.gnu.org/viewcvs/emacs/src/process.c?cvsroot=emacs&r1=1.581&r2=1.582
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/src/ChangeLog,v
retrieving revision 1.7513
retrieving revision 1.7514
diff -u -b -r1.7513 -r1.7514
--- ChangeLog 27 Apr 2009 22:27:55 -0000 1.7513
+++ ChangeLog 28 Apr 2009 19:02:26 -0000 1.7514
@@ -1,3 +1,10 @@
+2009-04-28 Andreas Schwab <address@hidden>
+
+ * fns.c (Flocale_info): Protect vector from GC during decoding.
+
+ * process.c (Fstart_process): Protect argv strings from GC during
+ encoding.
+
2009-04-27 Andreas Schwab <address@hidden>
* sysdep.c: Include <ctype.h>.
Index: fns.c
===================================================================
RCS file: /sources/emacs/emacs/src/fns.c,v
retrieving revision 1.456
retrieving revision 1.457
diff -u -b -r1.456 -r1.457
--- fns.c 27 Jan 2009 21:16:32 -0000 1.456
+++ fns.c 28 Apr 2009 19:02:27 -0000 1.457
@@ -3135,8 +3135,10 @@
else if (EQ (item, Qdays)) /* e.g. for calendar-day-name-array */
{
Lisp_Object v = Fmake_vector (make_number (7), Qnil);
- int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
+ const int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
int i;
+ struct gcpro gcpro1;
+ GCPRO1 (v);
synchronize_system_time_locale ();
for (i = 0; i < 7; i++)
{
@@ -3148,26 +3150,29 @@
code_convert_string_norecord (val, Vlocale_coding_system,
0));
}
+ UNGCPRO;
return v;
}
#endif /* DAY_1 */
#ifdef MON_1
else if (EQ (item, Qmonths)) /* e.g. for calendar-month-name-array */
{
- struct Lisp_Vector *p = allocate_vector (12);
- int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
+ Lisp_Object v = Fmake_vector (make_number (12), Qnil);
+ const int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
MON_8, MON_9, MON_10, MON_11, MON_12};
int i;
+ struct gcpro gcpro1;
+ GCPRO1 (v);
synchronize_system_time_locale ();
for (i = 0; i < 12; i++)
{
str = nl_langinfo (months[i]);
val = make_unibyte_string (str, strlen (str));
- p->contents[i] =
- code_convert_string_norecord (val, Vlocale_coding_system, 0);
+ Faset (v, make_number (i),
+ code_convert_string_norecord (val, Vlocale_coding_system, 0));
}
- XSETVECTOR (val, p);
- return val;
+ UNGCPRO;
+ return v;
}
#endif /* MON_1 */
/* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
Index: process.c
===================================================================
RCS file: /sources/emacs/emacs/src/process.c,v
retrieving revision 1.581
retrieving revision 1.582
diff -u -b -r1.581 -r1.582
--- process.c 23 Feb 2009 05:06:40 -0000 1.581
+++ process.c 28 Apr 2009 19:02:27 -0000 1.582
@@ -1698,8 +1698,6 @@
XPROCESS (proc)->encode_coding_system = val;
}
- new_argv = (unsigned char **) alloca ((nargs - 1) * sizeof (char *));
-
/* If program file name is not absolute, search our path for it.
Put the name we will really use in TEM. */
if (!IS_DIRECTORY_SEP (SREF (program, 0))
@@ -1729,10 +1727,13 @@
&& SREF (tem, 1) == ':')
tem = Fsubstring (tem, make_number (2), Qnil);
+ {
+ struct gcpro gcpro1;
+ GCPRO1 (tem);
+
/* Encode the file name and put it in NEW_ARGV.
That's where the child will use it to execute the program. */
- tem = ENCODE_FILE (tem);
- new_argv[0] = SDATA (tem);
+ tem = Fcons (ENCODE_FILE (tem), Qnil);
/* Here we encode arguments by the coding system used for sending
data to the process. We don't support using different coding
@@ -1741,14 +1742,27 @@
for (i = 3; i < nargs; i++)
{
- tem = args[i];
- CHECK_STRING (tem);
- if (STRING_MULTIBYTE (tem))
- tem = (code_convert_string_norecord
- (tem, XPROCESS (proc)->encode_coding_system, 1));
- new_argv[i - 2] = SDATA (tem);
+ tem = Fcons (args[i], tem);
+ CHECK_STRING (XCAR (tem));
+ if (STRING_MULTIBYTE (XCAR (tem)))
+ XSETCAR (tem,
+ code_convert_string_norecord
+ (XCAR (tem), XPROCESS (proc)->encode_coding_system, 1));
+ }
+
+ UNGCPRO;
+ }
+
+ /* Now that everything is encoded we can collect the strings into
+ NEW_ARGV. */
+ new_argv = (unsigned char **) alloca ((nargs - 1) * sizeof (char *));
+ new_argv[nargs - 2] = 0;
+
+ for (i = nargs - 3; i >= 0; i--)
+ {
+ new_argv[i] = SDATA (XCAR (tem));
+ tem = XCDR (tem);
}
- new_argv[i - 2] = 0;
XPROCESS (proc)->decoding_buf = make_uninit_string (0);
XPROCESS (proc)->decoding_carryover = 0;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] emacs/src ChangeLog fns.c process.c,
Andreas Schwab <=