aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert2019-11-26 13:53:41 -0800
committerPaul Eggert2019-11-26 13:57:00 -0800
commitcffa5703b95fba3624dc54db5e693bae559eac5f (patch)
tree7ac0719a3db6a29399ed4389ff27f1d0aeb211e5 /lib
parent75b41a38dd0735fe63457e12741656c63972d3ce (diff)
downloademacs-cffa5703b95fba3624dc54db5e693bae559eac5f.tar.gz
emacs-cffa5703b95fba3624dc54db5e693bae559eac5f.zip
etags: remove some arbitrary limits
etags had undefined behavior if input files, lines, tags, etc., had more than INT_MAX bytes. Clean up the usage of integer types to fix the overflow errors I found. * admin/merge-gnulib (GNULIB_MODULES): Add mempcpy. * lib-src/etags.c: Include inttypes.h, intprops.h. (memcpyz): New function. Use it to simplify several occurrences of memcpy followed by storing a trailing '\0'. (xnew): Use xnmalloc, to catch overflow on integer multiplication. (xrnew): Change last arg to multiplier. The type is not needed. All callers changed. (node, lineno, charno, linecharno, invalidcharno, make_tag): (pfnote, add_node, number_len, C_symtype, lbz, Makefile_targets) (readline): Use intmax_t for line numbers and character positions, instead of int or long. (linebuffer, make_tag, pfnote, total_size_of_entries, put_entry) (in_word_set, C_symtype, token, cstack, pushclass_above): (popclass_above, write_classname, consider_token, C_entries) (Ruby_functions, Makefile_targets, Lua_functions, TeX_commands) (TeX_decode_env, erlang_func, erlang_attribute, erlang_atom) (substitute, regex_tag_multiline, nocase_tail, readline_interval) (readline, savenstr, concat, etags_getcwd, relative_filename) (linebuffer_setlen): Use ptrdiff_t for object sizes, instead of int or long or unsigned or size_t. (write_classname, C_entries): Avoid sprintf, as the result could exceed INT_MAX bytes and then behavior goes haywire. (main): Use int, instead of unsigned, for argv counts. (get_language_from_filename): Use bool for boolean. (Ruby_functions): Prefer strcpy to memcpy when copying "=". (linebuffer_setlen): Use ‘if’ instead of ‘while’. (memory_full, xnmalloc, xnrealloc): New functions. (xmalloc): Use memory_full, and take a ptrdiff_t instead of a size_t. (xrealloc): Remove; no longer needed. * lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate. * lib/mempcpy.c, m4/mempcpy.m4: New files, copied from Gnulib.
Diffstat (limited to 'lib')
-rw-r--r--lib/gnulib.mk.in12
-rw-r--r--lib/mempcpy.c28
2 files changed, 40 insertions, 0 deletions
diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in
index 9a2709c22a7..8e3b569b94f 100644
--- a/lib/gnulib.mk.in
+++ b/lib/gnulib.mk.in
@@ -116,6 +116,7 @@
116# lstat \ 116# lstat \
117# manywarnings \ 117# manywarnings \
118# memmem-simple \ 118# memmem-simple \
119# mempcpy \
119# memrchr \ 120# memrchr \
120# minmax \ 121# minmax \
121# mkostemp \ 122# mkostemp \
@@ -2027,6 +2028,17 @@ EXTRA_libgnu_a_SOURCES += memmem.c
2027endif 2028endif
2028## end gnulib module memmem-simple 2029## end gnulib module memmem-simple
2029 2030
2031## begin gnulib module mempcpy
2032ifeq (,$(OMIT_GNULIB_MODULE_mempcpy))
2033
2034
2035EXTRA_DIST += mempcpy.c
2036
2037EXTRA_libgnu_a_SOURCES += mempcpy.c
2038
2039endif
2040## end gnulib module mempcpy
2041
2030## begin gnulib module memrchr 2042## begin gnulib module memrchr
2031ifeq (,$(OMIT_GNULIB_MODULE_memrchr)) 2043ifeq (,$(OMIT_GNULIB_MODULE_memrchr))
2032 2044
diff --git a/lib/mempcpy.c b/lib/mempcpy.c
new file mode 100644
index 00000000000..d0220e10fb0
--- /dev/null
+++ b/lib/mempcpy.c
@@ -0,0 +1,28 @@
1/* Copy memory area and return pointer after last written byte.
2 Copyright (C) 2003, 2007, 2009-2019 Free Software Foundation, Inc.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
7 any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, see <https://www.gnu.org/licenses/>. */
16
17#include <config.h>
18
19/* Specification. */
20#include <string.h>
21
22/* Copy N bytes of SRC to DEST, return pointer to bytes after the
23 last written byte. */
24void *
25mempcpy (void *dest, const void *src, size_t n)
26{
27 return (char *) memcpy (dest, src, n) + n;
28}