diff options
| author | Karoly Lorentey | 2005-04-18 13:17:40 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2005-04-18 13:17:40 +0000 |
| commit | 91fd98fc1eff12aa5a46142efabababa7daf77bb (patch) | |
| tree | cdad4a136f45f0ace817f77fb03a83099eb22532 /src | |
| parent | 221d5c8772dc29f854292ec7cb423fce925daecf (diff) | |
| download | emacs-91fd98fc1eff12aa5a46142efabababa7daf77bb.tar.gz emacs-91fd98fc1eff12aa5a46142efabababa7daf77bb.zip | |
Resolve crashes related to face aliases.
* src/xfaces.c (internal_resolve_face_name, resolve_face_name_error): New functions.
(resolve_face_name): Protect against loops and errors thrown by Fget.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-327
Diffstat (limited to 'src')
| -rw-r--r-- | src/xfaces.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/xfaces.c b/src/xfaces.c index f237e0630b6..51dcfb144d1 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -3204,6 +3204,20 @@ push_named_merge_point (struct named_merge_point *new_named_merge_point, | |||
| 3204 | 3204 | ||
| 3205 | 3205 | ||
| 3206 | 3206 | ||
| 3207 | static Lisp_Object | ||
| 3208 | internal_resolve_face_name (nargs, args) | ||
| 3209 | int nargs; | ||
| 3210 | Lisp_Object *args; | ||
| 3211 | { | ||
| 3212 | Fget (args[0], args[1]); | ||
| 3213 | } | ||
| 3214 | |||
| 3215 | static Lisp_Object | ||
| 3216 | resolve_face_name_error (ignore) | ||
| 3217 | Lisp_Object ignore; | ||
| 3218 | { | ||
| 3219 | return Qnil; | ||
| 3220 | } | ||
| 3207 | 3221 | ||
| 3208 | /* Resolve face name FACE_NAME. If FACE_NAME is a string, intern it | 3222 | /* Resolve face name FACE_NAME. If FACE_NAME is a string, intern it |
| 3209 | to make it a symvol. If FACE_NAME is an alias for another face, | 3223 | to make it a symvol. If FACE_NAME is an alias for another face, |
| @@ -3214,17 +3228,25 @@ resolve_face_name (face_name) | |||
| 3214 | Lisp_Object face_name; | 3228 | Lisp_Object face_name; |
| 3215 | { | 3229 | { |
| 3216 | Lisp_Object aliased; | 3230 | Lisp_Object aliased; |
| 3231 | Lisp_Object args[2]; | ||
| 3232 | int c = 0; | ||
| 3217 | 3233 | ||
| 3218 | if (STRINGP (face_name)) | 3234 | if (STRINGP (face_name)) |
| 3219 | face_name = intern (SDATA (face_name)); | 3235 | face_name = intern (SDATA (face_name)); |
| 3220 | 3236 | ||
| 3221 | while (SYMBOLP (face_name)) | 3237 | /* Protect against loops by limiting the number of indirections. */ |
| 3238 | while (SYMBOLP (face_name) && c < 10) | ||
| 3222 | { | 3239 | { |
| 3223 | aliased = Fget (face_name, Qface_alias); | 3240 | /* Fget can signal an error; just ignore it. */ |
| 3241 | args[0] = face_name; | ||
| 3242 | args[1] = Qface_alias; | ||
| 3243 | aliased = internal_condition_case_2 (internal_resolve_face_name, 2, args, Qt, | ||
| 3244 | resolve_face_name_error); | ||
| 3224 | if (NILP (aliased)) | 3245 | if (NILP (aliased)) |
| 3225 | break; | 3246 | break; |
| 3226 | else | 3247 | else |
| 3227 | face_name = aliased; | 3248 | face_name = aliased; |
| 3249 | c++; | ||
| 3228 | } | 3250 | } |
| 3229 | 3251 | ||
| 3230 | return face_name; | 3252 | return face_name; |