From 4620e6bccd98625208d8be4d960d24119a20594f Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 23 Sep 2014 21:12:37 -0700 Subject: [PATCH] Fix some slow uses and misuses of strcat. * doc.c (get_doc_string): * gtkutil.c (get_utf8_string): * xsmfns.c (x_session_initialize): Avoid recomputation of string length. * ftfont.c (ftfont_spec_pattern): * xfns.c (xic_create_fontsetname): Don't assume output buffer is initially zero. --- src/ChangeLog | 11 +++++++++++ src/doc.c | 4 ++-- src/ftfont.c | 2 +- src/gtkutil.c | 8 ++++---- src/xfns.c | 7 ++++--- src/xsmfns.c | 6 +++--- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 7f05f6fe21f..0fc4c2b1599 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2014-09-24 Paul Eggert + + Fix some slow uses and misuses of strcat. + * doc.c (get_doc_string): + * gtkutil.c (get_utf8_string): + * xsmfns.c (x_session_initialize): + Avoid recomputation of string length. + * ftfont.c (ftfont_spec_pattern): + * xfns.c (xic_create_fontsetname): + Don't assume output buffer is initially zero. + 2014-09-23 Paul Eggert * lisp.h (lispstpcpy): Rename from lispstrcpy, and act like stpcpy. diff --git a/src/doc.c b/src/doc.c index fdd7be6def9..bbb42c2aa3f 100644 --- a/src/doc.c +++ b/src/doc.c @@ -121,8 +121,8 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bool definition) if (minsize < 8) minsize = 8; name = SAFE_ALLOCA (minsize + SCHARS (file) + 8); - lispstpcpy (name, docdir); - strcat (name, SSDATA (file)); + char *z = lispstpcpy (name, docdir); + strcpy (z, SSDATA (file)); } else { diff --git a/src/ftfont.c b/src/ftfont.c index 0ab3119365e..4c12ef5d3af 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -804,7 +804,7 @@ ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **ots *otspec = ftfont_get_open_type_spec (val); if (! *otspec) return NULL; - strcat (otlayout, "otlayout:"); + strcpy (otlayout, "otlayout:"); OTF_TAG_STR ((*otspec)->script_tag, otlayout + 9); script = (*otspec)->script; } diff --git a/src/gtkutil.c b/src/gtkutil.c index 62f2c1b0682..1f3e1958ede 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -508,16 +508,16 @@ get_utf8_string (const char *str) && err->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) { memcpy (up, p, bytes_written); - sprintf (up + bytes_written, "\\%03o", p[bytes_written]); - up += bytes_written+4; - p += bytes_written+1; + up += bytes_written; + up += sprintf (up, "\\%03o", p[bytes_written]); + p += bytes_written + 1; g_error_free (err); err = NULL; } if (cp) { - strcat (utf8_str, cp); + strcpy (up, cp); g_free (cp); } if (err) diff --git a/src/xfns.c b/src/xfns.c index c2e39b5c0a6..63978c27f46 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1786,7 +1786,7 @@ xic_create_fontsetname (const char *base_fontname, int motif) len = p - base_fontname + strlen (allcs) + 1; font_allcs = alloca (len); memcpy (font_allcs, base_fontname, p - base_fontname); - strcat (font_allcs, allcs); + strcpy (font_allcs + (p - base_fontname), allcs); /* Build the font spec that matches all families and add-styles. */ @@ -1794,7 +1794,7 @@ xic_create_fontsetname (const char *base_fontname, int motif) font_allfamilies = alloca (len); strcpy (font_allfamilies, allfamilies); memcpy (font_allfamilies + strlen (allfamilies), p1, p - p1); - strcat (font_allfamilies, allcs); + strcpy (font_allfamilies + strlen (allfamilies) + (p - p1), allcs); /* Build the font spec that matches all. */ len = p - p2 + strlen (allcs) + strlen (all) + strlen (allfamilies) + 1; @@ -1802,7 +1802,8 @@ xic_create_fontsetname (const char *base_fontname, int motif) strcpy (font_all, allfamilies); strcat (font_all, all); memcpy (font_all + strlen (all) + strlen (allfamilies), p2, p - p2); - strcat (font_all, allcs); + strcpy (font_all + strlen (all) + strlen (allfamilies) + (p - p2), + allcs); /* Build the actual font set name. */ len = strlen (base_fontname) + strlen (font_allcs) diff --git a/src/xsmfns.c b/src/xsmfns.c index ed67a7d8e1f..cd4f9ce57fa 100644 --- a/src/xsmfns.c +++ b/src/xsmfns.c @@ -415,11 +415,11 @@ x_session_initialize (struct x_display_info *dpyinfo) /* This malloc will not be freed, but it is only done once, and hopefully not very large */ emacs_program = xmalloc (name_len + 1); - emacs_program[0] = '\0'; + char *z = emacs_program; if (! EQ (Vinvocation_directory, Qnil)) - lispstpcpy (emacs_program, Vinvocation_directory); - strcat (emacs_program, SSDATA (Vinvocation_name)); + z = lispstpcpy (z, Vinvocation_directory); + lispstpcpy (z, Vinvocation_name); /* The SM protocol says all callbacks are mandatory, so set up all here and in the mask passed to SmcOpenConnection. */ -- 2.39.5