aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2019-06-25 14:53:39 -0700
committerPaul Eggert2019-06-25 14:55:08 -0700
commitd7c6836288c91bb639956cb8c748dd6597c55cd4 (patch)
tree687f6f257d3cb5f4bd54eb634aef2737eb9c0856 /src
parent349b778dde7f583a92dd1531aef3ff5c336e9aee (diff)
downloademacs-d7c6836288c91bb639956cb8c748dd6597c55cd4.tar.gz
emacs-d7c6836288c91bb639956cb8c748dd6597c55cd4.zip
Avoid some strlen work, primarily via strnlen
* admin/merge-gnulib (GNULIB_MODULES): Add strnlen. * lib-src/etags.c (find_entries): * src/emacs.c (main): * src/nsmenu.m (parseKeyEquiv:): * src/nsterm.m (ns_xlfd_to_fontname): * src/term.c (vfatal): Prefer !*X to !strlen (X). * lib-src/etags.c (pfnote, add_regex): * lib-src/pop.c (pop_open): * lib-src/update-game-score.c (main): * lwlib/lwlib.c (lw_separator_p): * src/doprnt.c (doprnt): * src/emacs.c (main): * src/inotify.c (inotifyevent_to_event): * src/keyboard.c (menu_separator_name_p, parse_tool_bar_item): * src/sysdep.c (get_current_dir_name_or_unreachable): * src/xdisp.c (store_mode_line_string): Use strnlen to avoid unnecessary work with strlen. * lib-src/etags.c (Prolog_functions, prolog_pr) (Erlang_functions, erlang_func): Prefer ptrdiff_t to size_t when either will do. (prolog_pr, erlang_func): New arg LASTLEN, to avoid unnecessary strlen call. All callers changed. * lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate. * lib/strnlen.c, m4/strnlen.m4: New files, copied from Gnulib. * lwlib/lwlib.c (lw_separator_p): * src/json.c (json_has_prefix): Use strncmp to avoid unecessary work with strlen + memcmp. * src/process.c (set_socket_option): Use SBYTES instead of strlen.
Diffstat (limited to 'src')
-rw-r--r--src/doprnt.c4
-rw-r--r--src/emacs.c4
-rw-r--r--src/inotify.c3
-rw-r--r--src/json.c4
-rw-r--r--src/keyboard.c15
-rw-r--r--src/nsmenu.m2
-rw-r--r--src/nsterm.m2
-rw-r--r--src/process.c6
-rw-r--r--src/sysdep.c4
-rw-r--r--src/term.c2
-rw-r--r--src/xdisp.c4
11 files changed, 21 insertions, 29 deletions
diff --git a/src/doprnt.c b/src/doprnt.c
index 5fb70634048..64bb368ee3e 100644
--- a/src/doprnt.c
+++ b/src/doprnt.c
@@ -357,8 +357,8 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format,
357 if (fmtcpy[1] != 's') 357 if (fmtcpy[1] != 's')
358 minlen = atoi (&fmtcpy[1]); 358 minlen = atoi (&fmtcpy[1]);
359 string = va_arg (ap, char *); 359 string = va_arg (ap, char *);
360 tem = strlen (string); 360 tem = strnlen (string, STRING_BYTES_BOUND + 1);
361 if (STRING_BYTES_BOUND < tem) 361 if (tem == STRING_BYTES_BOUND + 1)
362 error ("String for %%s or %%S format is too long"); 362 error ("String for %%s or %%S format is too long");
363 width = strwidth (string, tem); 363 width = strwidth (string, tem);
364 goto doit1; 364 goto doit1;
diff --git a/src/emacs.c b/src/emacs.c
index 1ddd10b8051..231acc0ef32 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1520,8 +1520,8 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
1520 } 1520 }
1521 1521
1522 /* In exec'd: parse special dname into pipe and name info. */ 1522 /* In exec'd: parse special dname into pipe and name info. */
1523 if (!dname_arg || !strchr (dname_arg, '\n') 1523 if (!dname_arg || !*dname_arg || strnlen (dname_arg, 71) == 71
1524 || strlen (dname_arg) < 1 || strlen (dname_arg) > 70) 1524 || !strchr (dname_arg, '\n'))
1525 { 1525 {
1526 fprintf (stderr, "emacs daemon: daemon name absent or too long\n"); 1526 fprintf (stderr, "emacs daemon: daemon name absent or too long\n");
1527 exit (EXIT_CANNOT_INVOKE); 1527 exit (EXIT_CANNOT_INVOKE);
diff --git a/src/inotify.c b/src/inotify.c
index 9a7dbb8f413..e8891aefc7a 100644
--- a/src/inotify.c
+++ b/src/inotify.c
@@ -181,8 +181,7 @@ inotifyevent_to_event (Lisp_Object watch, struct inotify_event const *ev)
181 181
182 if (ev->len > 0) 182 if (ev->len > 0)
183 { 183 {
184 size_t const len = strlen (ev->name); 184 name = make_unibyte_string (ev->name, strnlen (ev->name, ev->len));
185 name = make_unibyte_string (ev->name, min (len, ev->len));
186 name = DECODE_FILE (name); 185 name = DECODE_FILE (name);
187 } 186 }
188 else 187 else
diff --git a/src/json.c b/src/json.c
index e2a4424463b..23234c767d8 100644
--- a/src/json.c
+++ b/src/json.c
@@ -197,9 +197,7 @@ init_json (void)
197static bool 197static bool
198json_has_prefix (const char *string, const char *prefix) 198json_has_prefix (const char *string, const char *prefix)
199{ 199{
200 size_t string_len = strlen (string); 200 return strncmp (string, prefix, strlen (prefix)) == 0;
201 size_t prefix_len = strlen (prefix);
202 return string_len >= prefix_len && memcmp (string, prefix, prefix_len) == 0;
203} 201}
204 202
205/* Return whether STRING ends with SUFFIX. */ 203/* Return whether STRING ends with SUFFIX. */
diff --git a/src/keyboard.c b/src/keyboard.c
index 0d7f124f5f3..56916e0cb4e 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -7331,7 +7331,7 @@ menu_separator_name_p (const char *label)
7331{ 7331{
7332 if (!label) 7332 if (!label)
7333 return 0; 7333 return 0;
7334 else if (strlen (label) > 3 7334 else if (strnlen (label, 4) == 4
7335 && memcmp (label, "--", 2) == 0 7335 && memcmp (label, "--", 2) == 0
7336 && label[2] != '-') 7336 && label[2] != '-')
7337 { 7337 {
@@ -8248,13 +8248,13 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item)
8248 Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION); 8248 Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION);
8249 const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : ""; 8249 const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : "";
8250 const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : ""; 8250 const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : "";
8251 ptrdiff_t max_lbl = 8251 ptrdiff_t max_lbl_size =
8252 2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2)); 8252 2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2)) + 1;
8253 char *buf = xmalloc (max_lbl + 1); 8253 char *buf = xmalloc (max_lbl_size);
8254 Lisp_Object new_lbl; 8254 Lisp_Object new_lbl;
8255 ptrdiff_t caption_len = strlen (capt); 8255 ptrdiff_t caption_len = strnlen (capt, max_lbl_size);
8256 8256
8257 if (caption_len <= max_lbl && capt[0] != '\0') 8257 if (0 < caption_len && caption_len < max_lbl_size)
8258 { 8258 {
8259 strcpy (buf, capt); 8259 strcpy (buf, capt);
8260 while (caption_len > 0 && buf[caption_len - 1] == '.') 8260 while (caption_len > 0 && buf[caption_len - 1] == '.')
@@ -8263,7 +8263,8 @@ parse_tool_bar_item (Lisp_Object key, Lisp_Object item)
8263 label = capt = buf; 8263 label = capt = buf;
8264 } 8264 }
8265 8265
8266 if (strlen (label) <= max_lbl && label[0] != '\0') 8266 ptrdiff_t label_len = strnlen (label, max_lbl_size);
8267 if (0 < label_len && label_len < max_lbl_size)
8267 { 8268 {
8268 ptrdiff_t j; 8269 ptrdiff_t j;
8269 if (label != buf) 8270 if (label != buf)
diff --git a/src/nsmenu.m b/src/nsmenu.m
index 3fe06cda02a..817f8cff184 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -611,7 +611,7 @@ ns_activate_menubar (struct frame *f)
611 const char *tpos = key; 611 const char *tpos = key;
612 keyEquivModMask = NSEventModifierFlagCommand; 612 keyEquivModMask = NSEventModifierFlagCommand;
613 613
614 if (!key || !strlen (key)) 614 if (!key || !*key)
615 return @""; 615 return @"";
616 616
617 while (*tpos == ' ' || *tpos == '(') 617 while (*tpos == ' ' || *tpos == '(')
diff --git a/src/nsterm.m b/src/nsterm.m
index 0ab03b46df1..8d46a49cc5e 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -9298,7 +9298,7 @@ ns_xlfd_to_fontname (const char *xlfd)
9298 sscanf (xlfd, "-%*[^-]-%179[^-]-", name); 9298 sscanf (xlfd, "-%*[^-]-%179[^-]-", name);
9299 9299
9300 /* stopgap for malformed XLFD input */ 9300 /* stopgap for malformed XLFD input */
9301 if (strlen (name) == 0) 9301 if (!*name)
9302 strcpy (name, "Monaco"); 9302 strcpy (name, "Monaco");
9303 9303
9304 /* undo hack in ns_fontname_to_xlfd, converting '$' to '-', '_' to ' ' 9304 /* undo hack in ns_fontname_to_xlfd, converting '$' to '-', '_' to ' '
diff --git a/src/process.c b/src/process.c
index 6717ccb4187..15d87cf6015 100644
--- a/src/process.c
+++ b/src/process.c
@@ -2857,11 +2857,7 @@ set_socket_option (int s, Lisp_Object opt, Lisp_Object val)
2857 This should work on all systems. KFS. 2003-09-23. */ 2857 This should work on all systems. KFS. 2003-09-23. */
2858 memset (devname, 0, sizeof devname); 2858 memset (devname, 0, sizeof devname);
2859 if (STRINGP (val)) 2859 if (STRINGP (val))
2860 { 2860 memcpy (devname, SDATA (val), min (SBYTES (val), IFNAMSIZ));
2861 char *arg = SSDATA (val);
2862 int len = min (strlen (arg), IFNAMSIZ);
2863 memcpy (devname, arg, len);
2864 }
2865 else if (!NILP (val)) 2861 else if (!NILP (val))
2866 error ("Bad option value for %s", name); 2862 error ("Bad option value for %s", name);
2867 ret = setsockopt (s, sopt->optlevel, sopt->optnum, 2863 ret = setsockopt (s, sopt->optlevel, sopt->optnum,
diff --git a/src/sysdep.c b/src/sysdep.c
index 0910b69f8bc..b702bae5818 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -281,7 +281,7 @@ get_current_dir_name_or_unreachable (void)
281 pwd = get_current_dir_name (); 281 pwd = get_current_dir_name ();
282 if (pwd) 282 if (pwd)
283 { 283 {
284 if (strlen (pwd) < dirsize_max) 284 if (strnlen (pwd, dirsize_max) < dirsize_max)
285 return pwd; 285 return pwd;
286 free (pwd); 286 free (pwd);
287 errno = ERANGE; 287 errno = ERANGE;
@@ -298,7 +298,7 @@ get_current_dir_name_or_unreachable (void)
298 sometimes a nicer name, and using it may avoid a fatal error if a 298 sometimes a nicer name, and using it may avoid a fatal error if a
299 parent directory is searchable but not readable. */ 299 parent directory is searchable but not readable. */
300 if (pwd 300 if (pwd
301 && (pwdlen = strlen (pwd)) < bufsize_max 301 && (pwdlen = strnlen (pwd, bufsize_max)) < bufsize_max
302 && IS_DIRECTORY_SEP (pwd[pwdlen && IS_DEVICE_SEP (pwd[1]) ? 2 : 0]) 302 && IS_DIRECTORY_SEP (pwd[pwdlen && IS_DEVICE_SEP (pwd[1]) ? 2 : 0])
303 && stat (pwd, &pwdstat) == 0 303 && stat (pwd, &pwdstat) == 0
304 && stat (".", &dotstat) == 0 304 && stat (".", &dotstat) == 0
diff --git a/src/term.c b/src/term.c
index ce06e1cd4e5..8b5a710d80a 100644
--- a/src/term.c
+++ b/src/term.c
@@ -4400,7 +4400,7 @@ vfatal (const char *str, va_list ap)
4400{ 4400{
4401 fprintf (stderr, "emacs: "); 4401 fprintf (stderr, "emacs: ");
4402 vfprintf (stderr, str, ap); 4402 vfprintf (stderr, str, ap);
4403 if (!(strlen (str) > 0 && str[strlen (str) - 1] == '\n')) 4403 if (! (str[0] && str[strlen (str) - 1] == '\n'))
4404 fprintf (stderr, "\n"); 4404 fprintf (stderr, "\n");
4405 exit (1); 4405 exit (1);
4406} 4406}
diff --git a/src/xdisp.c b/src/xdisp.c
index 25e8932945e..9f63ef4b180 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -24341,9 +24341,7 @@ store_mode_line_string (const char *string, Lisp_Object lisp_string,
24341 24341
24342 if (string != NULL) 24342 if (string != NULL)
24343 { 24343 {
24344 len = strlen (string); 24344 len = strnlen (string, precision <= 0 ? SIZE_MAX : precision);
24345 if (precision > 0 && len > precision)
24346 len = precision;
24347 lisp_string = make_string (string, len); 24345 lisp_string = make_string (string, len);
24348 if (NILP (props)) 24346 if (NILP (props))
24349 props = mode_line_string_face_prop; 24347 props = mode_line_string_face_prop;