aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Schwab2012-06-30 11:13:54 +0200
committerAndreas Schwab2012-06-30 11:13:54 +0200
commitc5e4379cef494adeed3ce4ba3c610819c088cda8 (patch)
tree992965f991b094296784af9c0fe1844105f8d633 /src
parentaf5a5a98c882b9c4ed61bf840ce4f7e3d20baaa8 (diff)
downloademacs-c5e4379cef494adeed3ce4ba3c610819c088cda8.tar.gz
emacs-c5e4379cef494adeed3ce4ba3c610819c088cda8.zip
* font.c (font_style_to_value, font_style_symbolic)
(font_prop_validate_style): Add type checks for values in font_style_table.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog4
-rw-r--r--src/font.c47
2 files changed, 40 insertions, 11 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index fe66f77fc43..ce817c19894 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,9 @@
12012-06-30 Andreas Schwab <schwab@linux-m68k.org> 12012-06-30 Andreas Schwab <schwab@linux-m68k.org>
2 2
3 * font.c (font_style_to_value, font_style_symbolic)
4 (font_prop_validate_style): Add type checks for values in
5 font_style_table.
6
3 * lisp.h (CHECK_RANGED_INTEGER): Make value to check the first 7 * lisp.h (CHECK_RANGED_INTEGER): Make value to check the first
4 argument. 8 argument.
5 * character.c, charset.c, menu.c, process.c, window.c: Adjust all 9 * character.c, charset.c, menu.c, process.c, window.c: Adjust all
diff --git a/src/font.c b/src/font.c
index f9e0e5bdcc0..555c76c73c8 100644
--- a/src/font.c
+++ b/src/font.c
@@ -326,7 +326,10 @@ int
326font_style_to_value (enum font_property_index prop, Lisp_Object val, int noerror) 326font_style_to_value (enum font_property_index prop, Lisp_Object val, int noerror)
327{ 327{
328 Lisp_Object table = AREF (font_style_table, prop - FONT_WEIGHT_INDEX); 328 Lisp_Object table = AREF (font_style_table, prop - FONT_WEIGHT_INDEX);
329 int len = ASIZE (table); 329 int len;
330
331 CHECK_VECTOR (table);
332 len = ASIZE (table);
330 333
331 if (SYMBOLP (val)) 334 if (SYMBOLP (val))
332 { 335 {
@@ -336,10 +339,16 @@ font_style_to_value (enum font_property_index prop, Lisp_Object val, int noerror
336 339
337 /* At first try exact match. */ 340 /* At first try exact match. */
338 for (i = 0; i < len; i++) 341 for (i = 0; i < len; i++)
339 for (j = 1; j < ASIZE (AREF (table, i)); j++) 342 {
340 if (EQ (val, AREF (AREF (table, i), j))) 343 CHECK_VECTOR (AREF (table, i));
341 return ((XINT (AREF (AREF (table, i), 0)) << 8) 344 for (j = 1; j < ASIZE (AREF (table, i)); j++)
342 | (i << 4) | (j - 1)); 345 if (EQ (val, AREF (AREF (table, i), j)))
346 {
347 CHECK_NUMBER (AREF (AREF (table, i), 0));
348 return ((XINT (AREF (AREF (table, i), 0)) << 8)
349 | (i << 4) | (j - 1));
350 }
351 }
343 /* Try also with case-folding match. */ 352 /* Try also with case-folding match. */
344 s = SSDATA (SYMBOL_NAME (val)); 353 s = SSDATA (SYMBOL_NAME (val));
345 for (i = 0; i < len; i++) 354 for (i = 0; i < len; i++)
@@ -347,8 +356,11 @@ font_style_to_value (enum font_property_index prop, Lisp_Object val, int noerror
347 { 356 {
348 elt = AREF (AREF (table, i), j); 357 elt = AREF (AREF (table, i), j);
349 if (xstrcasecmp (s, SSDATA (SYMBOL_NAME (elt))) == 0) 358 if (xstrcasecmp (s, SSDATA (SYMBOL_NAME (elt))) == 0)
350 return ((XINT (AREF (AREF (table, i), 0)) << 8) 359 {
351 | (i << 4) | (j - 1)); 360 CHECK_NUMBER (AREF (AREF (table, i), 0));
361 return ((XINT (AREF (AREF (table, i), 0)) << 8)
362 | (i << 4) | (j - 1));
363 }
352 } 364 }
353 if (! noerror) 365 if (! noerror)
354 return -1; 366 return -1;
@@ -368,8 +380,11 @@ font_style_to_value (enum font_property_index prop, Lisp_Object val, int noerror
368 380
369 for (i = 0, last_n = -1; i < len; i++) 381 for (i = 0, last_n = -1; i < len; i++)
370 { 382 {
371 int n = XINT (AREF (AREF (table, i), 0)); 383 int n;
372 384
385 CHECK_VECTOR (AREF (table, i));
386 CHECK_NUMBER (AREF (AREF (table, i), 0));
387 n = XINT (AREF (AREF (table, i), 0));
373 if (numeric == n) 388 if (numeric == n)
374 return (n << 8) | (i << 4); 389 return (n << 8) | (i << 4);
375 if (numeric < n) 390 if (numeric < n)
@@ -397,11 +412,15 @@ font_style_symbolic (Lisp_Object font, enum font_property_index prop, int for_fa
397 if (NILP (val)) 412 if (NILP (val))
398 return Qnil; 413 return Qnil;
399 table = AREF (font_style_table, prop - FONT_WEIGHT_INDEX); 414 table = AREF (font_style_table, prop - FONT_WEIGHT_INDEX);
415 CHECK_VECTOR (table);
400 i = XINT (val) & 0xFF; 416 i = XINT (val) & 0xFF;
401 font_assert (((i >> 4) & 0xF) < ASIZE (table)); 417 font_assert (((i >> 4) & 0xF) < ASIZE (table));
402 elt = AREF (table, ((i >> 4) & 0xF)); 418 elt = AREF (table, ((i >> 4) & 0xF));
419 CHECK_VECTOR (elt);
403 font_assert ((i & 0xF) + 1 < ASIZE (elt)); 420 font_assert ((i & 0xF) + 1 < ASIZE (elt));
404 return (for_face ? AREF (elt, 1) : AREF (elt, (i & 0xF) + 1)); 421 elt = (for_face ? AREF (elt, 1) : AREF (elt, (i & 0xF) + 1));
422 CHECK_SYMBOL (elt);
423 return elt;
405} 424}
406 425
407/* Return ENCODING or a cons of ENCODING and REPERTORY of the font 426/* Return ENCODING or a cons of ENCODING and REPERTORY of the font
@@ -519,6 +538,7 @@ font_prop_validate_style (Lisp_Object style, Lisp_Object val)
519 if (INTEGERP (val)) 538 if (INTEGERP (val))
520 { 539 {
521 EMACS_INT n = XINT (val); 540 EMACS_INT n = XINT (val);
541 CHECK_VECTOR (AREF (font_style_table, prop - FONT_WEIGHT_INDEX));
522 if (((n >> 4) & 0xF) 542 if (((n >> 4) & 0xF)
523 >= ASIZE (AREF (font_style_table, prop - FONT_WEIGHT_INDEX))) 543 >= ASIZE (AREF (font_style_table, prop - FONT_WEIGHT_INDEX)))
524 val = Qerror; 544 val = Qerror;
@@ -526,10 +546,15 @@ font_prop_validate_style (Lisp_Object style, Lisp_Object val)
526 { 546 {
527 Lisp_Object elt = AREF (AREF (font_style_table, prop - FONT_WEIGHT_INDEX), (n >> 4) & 0xF); 547 Lisp_Object elt = AREF (AREF (font_style_table, prop - FONT_WEIGHT_INDEX), (n >> 4) & 0xF);
528 548
549 CHECK_VECTOR (elt);
529 if ((n & 0xF) + 1 >= ASIZE (elt)) 550 if ((n & 0xF) + 1 >= ASIZE (elt))
530 val = Qerror; 551 val = Qerror;
531 else if (XINT (AREF (elt, 0)) != (n >> 8)) 552 else
532 val = Qerror; 553 {
554 CHECK_NUMBER (AREF (elt, 0));
555 if (XINT (AREF (elt, 0)) != (n >> 8))
556 val = Qerror;
557 }
533 } 558 }
534 } 559 }
535 else if (SYMBOLP (val)) 560 else if (SYMBOLP (val))