From ccd6111c2415fc357944464cdf51ab496364241c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 19 Jun 2011 22:51:47 -0700 Subject: [PATCH] * font.c (font_intern_prop): Don't assume string length fits in int. Don't assume integer property fits in fixnum. * font.h (font_intern_prop): 2nd arg is now ptrdiff_t, not int. --- src/ChangeLog | 3 +++ src/font.c | 11 ++++++++--- src/font.h | 3 ++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 32756b4427..cb6ea8ff9e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -3,6 +3,9 @@ * font.c: Don't assume string length fits in int. (font_parse_xlfd, font_parse_fcname, font_unparse_fcname): Use ptrdiff_t, not int. + (font_intern_prop): Don't assume string length fits in int. + Don't assume integer property fits in fixnum. + * font.h (font_intern_prop): 2nd arg is now ptrdiff_t, not int. * filelock.c: Fix some buffer overrun and integer overflow issues. (get_boot_time): Don't assume that gzip command string fits in 100 bytes. diff --git a/src/font.c b/src/font.c index b9cdde376a..cc57af1214 100644 --- a/src/font.c +++ b/src/font.c @@ -232,9 +232,9 @@ static int num_font_drivers; STR. */ Lisp_Object -font_intern_prop (const char *str, int len, int force_symbol) +font_intern_prop (const char *str, ptrdiff_t len, int force_symbol) { - int i; + ptrdiff_t i; Lisp_Object tem; Lisp_Object obarray; EMACS_INT nbytes, nchars; @@ -247,7 +247,12 @@ font_intern_prop (const char *str, int len, int force_symbol) if (! isdigit (str[i])) break; if (i == len) - return make_number (atoi (str)); + { + Lisp_Object num = string_to_number (str, 10, 0); + if (! INTEGERP (num)) + xsignal1 (Qoverflow_error, num); + return num; + } } /* The following code is copied from the function intern (in diff --git a/src/font.h b/src/font.h index 0ca9e8baec..e50eaff9a1 100644 --- a/src/font.h +++ b/src/font.h @@ -777,7 +777,8 @@ extern void font_done_for_face (FRAME_PTR f, struct face *face); extern Lisp_Object font_open_by_spec (FRAME_PTR f, Lisp_Object spec); extern Lisp_Object font_open_by_name (FRAME_PTR f, const char *name); -extern Lisp_Object font_intern_prop (const char *str, int len, int force_symbol); +extern Lisp_Object font_intern_prop (const char *str, ptrdiff_t len, + int force_symbol); extern void font_update_sort_order (int *order); extern void font_parse_family_registry (Lisp_Object family, -- 2.20.1