diff options
| author | Andreas Schwab | 2012-06-30 11:13:54 +0200 |
|---|---|---|
| committer | Andreas Schwab | 2012-06-30 11:13:54 +0200 |
| commit | c5e4379cef494adeed3ce4ba3c610819c088cda8 (patch) | |
| tree | 992965f991b094296784af9c0fe1844105f8d633 /src | |
| parent | af5a5a98c882b9c4ed61bf840ce4f7e3d20baaa8 (diff) | |
| download | emacs-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/ChangeLog | 4 | ||||
| -rw-r--r-- | src/font.c | 47 |
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 @@ | |||
| 1 | 2012-06-30 Andreas Schwab <schwab@linux-m68k.org> | 1 | 2012-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 | |||
| 326 | font_style_to_value (enum font_property_index prop, Lisp_Object val, int noerror) | 326 | font_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)) |