summaryrefslogtreecommitdiff
path: root/sed
Commit message (Collapse)AuthorAgeFilesLines
* maint: update Gnulib library listPaul Eggert2023-01-301-2/+2
| | | | | | | | * sed/local.mk (sed_sed_LDADD): Update for current Gnulib by using $(CLOCK_LIB__GETTIME), $(GETRANDOM_LIB), $(HARD_LOCALE_LIB), $(MBRTOWC_LIB), $(SETLOCALE_NULL_LIB) instead of $(LIB_CLOCK_GETTIME), $(LIB_GETRANDOM), $(LIB_HARD_LOCALE, $(LIB_MBRTOWC), $(LIB_SETLOCALE_NULL).
* sed: fix int width in declPaul Eggert2023-01-301-1/+1
| | | | | | * sed/sed.h (lcmd_out_line_len): Declare intmax_t, not idx_t. Problem reported by Bruno Haible in: https://lists.gnu.org/r/sed-devel/2023-01/msg00001.html
* maint: quote 'like this' not `like this'Paul Eggert2023-01-306-75/+75
|
* build: accommodate ACL change in updated gnulibBruno Haible2023-01-291-1/+1
| | | | | * sed/local.mk (sed_sed_LDADD): Add $(QCOPY_ACL_LIB). Reported in https://lists.gnu.org/r/sed-devel/2023-01/msg00001.html
* maint: reword to avoid a too-long-line warningJim Meyering2023-01-011-3/+3
| | | | | * sed/compile.c (compile_program): Improve diagnostic wording that also happens to shorten the line so it's length is < 80.
* maint: expand a few TABs to placate make syntax-checkJim Meyering2023-01-011-2/+2
| | | | * sed/execute.c (alloc): Indent with spaces, not TABs.
* maint: update copyright datesJim Meyering2023-01-0110-10/+10
|
* sed: improve integer overflow checkingPaul Eggert2022-12-198-222/+200
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix some some longstanding but unlikely integer overflows. Internally, 'sed' now more often prefers signed integer arithmetic, which can be checked automatically via 'gcc -fsanitize=undefined'. * basicdefs.h (countT): Remove. All uses replaced with a more-specific signed type, e.g., idx_t. Similarly, change uses of types like size_t to signed types like idx_t when appropriate. (REALLOC): Remove; no longer used. We now use xpalloc because that detects integer overflow in size calculations. Also, we no longer use XCALLOC since the code never relies on the storage being zero, and leaving it uninitialized is more likely to catch errors when debugging implementations are used. We use XNMALLOC instead, or xpalloc. * bootstrap.conf (gnulib_modules): Add stdckdint, strtoimax. * lib/.gitignore, m4/.gitignore: Update for new Gnulib modules. * sed/compile.c: Include stdckdint.h. (VECTOR_ALLOC_INCREMENT): Remove; no longer used. (in_integer): Return maximal value if integer overflow. All callers changed to expect this. (next_cmd_entry): Use xpalloc instead of reallocating by hand, which might suffer integer overflow. (normalize_text): Don’t rely on system-defined conversion of out-of-range size_t to int. (next_cmd_entry): Arg is now pointer, not pointer-to-pointer. All uses changed. * sed/debug.c (debug_print_function): Don’t attempt to fwrite a null pointer with a zero size. * sed/execute.c: Include <stdckdint.h>, "minmax.h". (resize_line): LEN arg is now increment, not total length, to avoid overflow when calculating total length. All uses changed. Do not assume lb->alloc * 2 cannot overflow. (resize_line, line_copy): Use xpalloc instead of doing realloc by hand, which might suffer integer overflow. (str_append_modified): Do not add n to to->length until after it's known this cannot overflow. (read_file_line): Don’t assume ssize_t fits in long. (get_backup_file_name): Don’t assume string length fits in int. Do not assume PTR-1+1 works; behavior is undefined if PTR is at buffer start. Check for integer overflow in buffer size calculation. (read_pattern_space): Check for line number overflow. (match_address_p): Check for address overflow. (debug_print_line): Omit unnecessary test for in->active being null. (execute_program): Check for Q overflow. * sed/regexp.c: Include <stdckdint.h>. (match_regex): Don’t assume TYPE_MAXIMUM (regoff_t) == INT_MAX. * sed/sed.c: Include inttypes.h, for strtoimax. (main): Use strtoimax, not atoi. * sed/utils.c (init_buffer): Use xmalloc and xpalloc instead of guessing sizes ourselves, and unnecessarily initializing. (resize_buffer): Remove; all callers changed to use xpalloc. (free_buffer): Don’t call free (NULL), since we already test whether the pointer is null.
* sed: simplify by aborting rather than assertingPaul Eggert2022-12-191-7/+6
| | | | | | * sed/debug.c: Do not include assert.h. (debug_print_function): Use plain abort () rather than assert (0). This is simpler and just as useful.
* sed: fix unlikely mkostemp-related overflowPaul Eggert2022-12-191-2/+7
| | | | | | * bootstrap.conf (gnulib_modules): Add mempcpy. * sed/utils.c (ck_mkstemp): Use mempcpy instead of sprintf, which doesn’t work with strings longer than INT_MAX.
* sed: do octal escapes ourselvesPaul Eggert2022-12-191-7/+6
| | | | | | | | * sed/execute.c (do_list): Simplify by doing octal escapes by hand (!) instead of having sprintf do it. This makes it easier for compilers and humans see that buffer overflow is impossible. And it’s quite a bit faster if the input consists mostly of odd control bytes.
* sed: simplify how diagnostics are translatedPaul Eggert2022-12-193-173/+79
| | | | | | | | | | | | | | | | | | | * basicdefs.h, sed/regexp.c (N_): Remove; no longer used. * bootstrap.conf (XGETTEXT_OPTIONS): Treat bad_prog as a function that translates its first arg. Omit unnecessary flags. * sed/compile.c, sed/regexp.c (errors): Remove this array of concatenated strings, and associated macros. All users of these macros now simply call bad_prog ("diagnostic") instead of bad_prog (_(DIAGNOSTIC_MACRO)). This is easier to read and maintain, and made it easy to catch two diagnostics that were never properly translated before: "cannot specify modifiers on empty regexp", "missing filename in r/R/w/W commands". * sed/compile.c (bad_command): Remove; no longer used. (vbad_prog): New function, with most of the old bad_prog contents. (bad_prog): Now variadic, like printf. Always translate WHY. All callers changed. (bad_prog_notranslate): New function.
* maint: fix list of libraries to link toPaul Eggert2022-12-181-1/+4
| | | | | * sed/local.mk (sed_sed_LDADD): Append all the libraries that ’bootstrap’ says should be included.
* sed: fix symlink bufsize readlink checkPaul Eggert2022-12-171-1/+1
| | | | | | | | | Problem reported by Hauke Mehrtens. * sed/utils.c (follow_symlink): Fix typo when checking size of second and later symlink, when that symlink is so large that it does not fit into the buffer. Although the bug is not a buffer overflow, it does cause sed to mishandle the symlink. * testsuite/follow-symlinks.sh: Test for the bug.
* sed: handle the unspecified "n as delimiter alias" case more sensiblyOğuz2022-10-231-2/+0
| | | | | | | | Print the less-surprising variant in a corner case of POSIX-unspecified behavior. Before, this would print "n". Now, it prints "X": printf n | sed 'sn\nnXn'; echo * sed/compile.c (match_slash): Remove special handling of 'n'. Reported in https://bugs.gnu.org/40242
* sed: fix infloop with symlink cyclesPaul Eggert2022-07-032-57/+71
| | | | | | | | | | | | | | | * bootstrap.conf (gnulib_modules): Add eloop-threshold, idx, minmax, readlink. * configure.ac: Do not check for lstat; no longer needed. (ENABLE_FOLLOW_SYMLINKS): Remove; all uses removed. (TEST_SYMLINKS): Depend only on readlink. * sed/utils.c: Include eloop-threshold.h, idx.h, minmax.h. (SSIZE_IDX_MAX): New macro. (follow_symlink): Rewrite to not loop when given a symlink cycle. Do not use lstat, since readlink suffices. Use just one memory buffer, not two; this simplifies memory management. * testsuite/follow-symlinks.sh: Adjust diagnostics to to match revised behavior. Test for symlink loops.
* sed: fix temp file cleanupPaul Eggert2022-07-025-123/+72
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Without this fix, the code would sometimes use FP after calling fclose (FP), which has undefined behavior in C. Problem found with --enable-gcc-warnings and GCC 12. * sed/execute.c (open_next_file): Do not register here, as it’s too late and this can cause the file to not be cleaned up. * sed/sed.c (G_file_to_unlink, register_cleanup_file, cancel_cleanup): Move from here to utils.c. (cleanup): Call remove_cleanup_file instead of doing it by hand. * sed/utils.c (struct open_file): Remove member temp (which was always false) and fclose_failed (which was not enough to prevent calling fclose with a bad pointer). All uses changed. (register_open_file): Do not access p->fp after it’s fclosed, as that has undefined behavior in C. Use xmalloc instead of xcalloc, since we initialize all members. (G_file_to_unlink, register_cleanup_file, cancel_cleanup): Move from utils.c to here. (remove_cleanup_file): New function. (ck_mkstemp): Fix a screwup when mkostemp succeeded but set_binary_mode or fdopen failed: we might misuse a null pointer, or forget to clean up the newly-created temp file. (ck_getdelim): Rename local to avoid confusion with global. (mark_as_fclose_failed): Remove. All uses removed. (ck_fclose): Remove entry from open_files before attempting to fclose it, so that panicking doesn’t try to fclose it again. (do_ck_fclose): New arg NAME so that there’s no need to call mark_as_fclose_failed, which inspected FP after fclosing it, which is undefined behavior. (ck_rename): Omit arg UNLINK_IF_FAIL. All callers changed. The cleanup handler removes this file now, as needed.
* maint: make update-copyrightJim Meyering2022-01-0110-10/+10
|
* sed: allow '0rFILE' (insert FILE before the first line)Assaf Gordon2021-08-164-7/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The 'r' command can be used with address zero, effectively prepending a file to the beginning of the input file, e.g.: sed '0rA.TXT' B.TXT > C.TXT is equivalent to: cat A.TXT B.TXT > C.TXT With "sed -i", this allows safe in-place prepending of files. A typical example would be adding a license header to multiple source files: sed -i '0rLICENSE' *.c *.h find -iname '*.cpp' | xargs sed -i '0rLICENSE' A current cumbersome alternative is: sed -i -e 'x;${p;x};1rA.TXT' -e '1d' B.TXT * NEWS: Mention new feature. * sed/sed.h (struct readcmd): New struct. (struct sed_cmd): Use new struct instead of a char* for the filename. * sed/compile.c (compile_program): Expand conditional detecting invalid usage of "0" address to allow "0r"; Adjust '0r' to '1r' with prepending (instead of appending). * sed/execute.c (execute_program): 'r' command: support prepending. * sed/debug.c (debug_print_function): Use the new 'struct readcmd'. * testsuite/cmd-0r.sh: New test. * testsuite/local.mk (TESTS): Add new test. * doc/sed.texi (Zero Address): New section. (Adding a header to multiple files): New example section.
* sed: extract print_file functionAssaf Gordon2021-08-111-17/+21
| | | | | * sed/execute.c (dump_append_queue): Extract code to print a file to ... (print_file): new function.
* sed: avoid potential double-fcloseJim Meyering2021-08-011-2/+26
| | | | | | | | | | | Upon a failed temp file fclose, do_ck_fclose would call panic, which would then attempt to fclose and unlink that same pointer. Caught by gcc's new -Wanalyzer-double-fclose. * sed/utils.c (struct open_file) [fclose_failed]: New member. (panic): Don't double-close. (register_open_file): Clear new member. (mark_as_fclose_failed): Use new member to avoid double fclose. (do_ck_fclose): Call mark_as_fclose_failed upon fclose failure.
* maint: avoid new warning about deprecated security_context_tJim Meyering2021-08-011-2/+2
| | | | | * sed/execute.c (open_next_file): Use char * in place of deprecated security_context_t.
* sed: silence -Wformat-nonoliteral warningAssaf Gordon2021-01-051-0/+3
| | | | | | | | | | | | | GCC compilation fails with: sed/compile.c:206:3: error: format not a string literal, argument types not checked [-Werror=format-nonliteral] sprintf (unknown_cmd, msg, ch); ^~~~~~~ While there is suppression of "-Wformat-nonliteral" in configure.ac, it later '-Wformat=2' which turns "-Wformat-nonliteral" on. * sed/compile.c (bad_command): Add explicit "#pragma GCC ... ignore". The format string is fixed and known ahead of time.
* maint: update all copyright year number rangesAssaf Gordon2021-01-0510-11/+12
| | | | | | | | | | | | | Run "make update-copyright" and then... * gnulib: Update to latest with copyright year adjusted. * bootstrap.conf (gnulib_modules): Remove getopt module, depracated in https://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=0abc38bd2a1398f0 * po/POTFILES.in: Remove getopt.c * sed/utils.h (panic): Rename _GL_ATTRIBUTE_FORMAT_PRINTF to _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD following gnulib's change: https://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=387d654cabd7bc15 * tests/init.sh: Sync with gnulib to pick up copyright year. * bootstrap: Likewise.
* sed: handle very long input lines with R (tiny change)Tobias Stoeckmann2020-01-181-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It is possible to trigger an out of bounds memory access when using the sed command R with an input file containing very long lines. The problem is that the line length of parsed file is returned as a size_t by ck_getdelim, but temporarily stored in an int and then converted back into a size_t. On systems like amd64, on which this problem can be triggered, size_t and int have different sizes. If the input line is longer than 2 GB (which is parseable on amd64 or other 64 bit systems), this means that the temporarily stored int turns negative. Converting the negative int back into a size_t will lead to an excessively large size_t, as the conversion leads to a lot of leading 1 bits. Eventually ck_fwrite is called with this huge size_t which in turn will lead to an out of bounds access on amd64 systems -- after all the parsed text was just a bit above 2 GB, not near SIZE_MAX. You can trigger this issue with GNU sed on OpenBSD like this: $ dd if=/dev/zero bs=1M count=2049 | tr '\0' e > long.txt $ sed Rlong.txt /etc/fstab Segmentation fault (core dumped) I was unable to trigger the bug on a Linux system with glibc due to a bug in glibc's fwrite implementation -- it leads to a short write and sed treats that correctly as an error. * sed/execute.c (execute_program) [case 'R']: Declare result to be of type size_t, not int. * NEWS (Bug fixes): Mention it. This addresses https://bugs.gnu.org/39166
* sed: handle very long execution lines (tiny change)Tobias Stoeckmann2020-01-181-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | If sed is called with an excessively long execution line, then it is prone to an out of bounds memory access. The problem is that the length of the execution line, which is a size_t, is temporarily stored in an int. This means that on systems which have a 64 bit size_t and a 32 bit int (e.g. linux amd64) an execution line which exceeds 2 GB will overflow int. If it is just slightly larger than 2 GB, the negative int value is used as an array index to finish the execution line string with '\0' which therefore triggers the out of bounds access. This problem is probably never triggered in reality, but can be provoked like this (given that 'e' support is compiled in): $ dd if=/dev/zero bs=1M count=2049 | tr '\0' e > e-command.txt $ sed -f e-command.txt /etc/fstab Segmentation fault (core dumped) Also adjust another int/size_t conversion, even though it is a purely cosmetic change, because it can never be larger than 4096. * sed/execute.c (execute_program) [case 'e']: Declare cmd_length to be of type size_t, not int. Likewise for "n" just below. * NEWS (Bug fixes): Mention it. This addresses https://bugs.gnu.org/39165
* sed: avoid MSVC build failureJim Meyering2020-01-111-1/+0
| | | | | | * sed/sed.c (usage): Remove unnecessary forward declaration. Reported by Bruno Haible in https://lists.gnu.org/r/sed-devel/2020-01/msg00007.html
* maint: space-before-open-paren: avoid syntax-check errorJim Meyering2020-01-051-1/+1
| | | | * sed/sed.c (selinux_support): Insert space before open-paren.
* maint: update all copyright year number rangesJim Meyering2020-01-0110-10/+10
| | | | | | | Run "make update-copyright" and then... * gnulib: Update to latest with copyright year adjusted. * tests/init.sh: Sync with gnulib to pick up copyright year. * bootstrap: Likewise.
* sed: set correct umask on temporary filesAssaf Gordon2019-09-051-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | "sed -i" now creates temporary files with correct umask (limited to u=rwx). Previously sed would incorrectly set umask, and combined with mkostemp creating file with mode 0600, the result would be a file with permission mode 0. Reported by Dr N.W. Filardo <nwf20@cam.ac.uk>: https://lists.gnu.org/r/sed-devel/2019-08/msg00000.html "The net effect is that this patch does not do what it says on the tin: it does not improve the security story at all. Things continue to function because the subsequent operations are via f*() APIs, which take the open file handle, and in particular fchmod() will put the bits back to something sensible. However, when running atop, for example, fuse-style filesystems which do not keep open descriptors to underlying files, this is catastrophic: the underlying file will have I_SRWXU of zero, and so the filesystem server will be unable to open the file for the fchmod() and that's the end of that." "fuse-overlayfs" is an example of a filesystem with such issues. This change was made in commit 5156c19b23c41f438bf8658e1b9a43a5ff136835 and was released in sed 4.2.1. * NEWS: Mention change. * sed/utils.c (ck_mkstemp): Set correct umask.
* sed: report SELinux status in --version outputAssaf Gordon2019-06-021-0/+18
| | | | | | | | | | Report whether sed was built with SELinux support (determined at compile time), and whether it is enabled on this system (determined at runtime). Relates to https://bugs.gnu.org/35997 . * sed/sed.c (selinux_support): New function, print SELinux status to stdout. (main): Call selinux_support on --version.
* maint: update copyright dates for 2019Assaf Gordon2019-01-0110-10/+10
| | | | * all files: Run "make update-copyright".
* sed: fix -b/--binary mode under windows/mingwAssaf Gordon2018-12-052-2/+29
| | | | | | | | | | | | Discussed in https://lists.gnu.org/r/sed-devel/2018-10/msg00001.html . * NEWS: Mention change. * bootstrap.conf: Add gnulib's binary-io module. * sed/sed.c (main): Set stdin/stdout to binary mode if needed. * sed/utils.c (ck_mkstemp): Explicitly set binary mode on file descriptor. It seems that on (non-cygwin) Windows the fdopen(3) call ignores the 'b' in the 'mode' argument - and the file was always opened in O_TEXT mode. Thus "--binary" was not working with "--inplace".
* sed: fix memory leakage under lintJannick2018-11-221-0/+2
| | | | | | | | | | The NULL-initialized char string in_place_extension is free'ed everytime it is redefined (using xstrdup) and at program exit with any return code. See: https://lists.gnu.org/r/sed-devel/2018-11/msg00005.html * sed/sed.c (main, cleanup): Free 'in_place_extension' if running with lint.
* build: rename stdin local variableAssaf Gordon2018-11-011-2/+2
| | | | | | | | | | | | | | | Under windows/msys2, defining 'bool stdin' variable results in compilation errors: ../sed/execute.c:1252:8: error: expected declaration specifiers or '...' before numeric constant bool stdin = (input->fp && fileno (input->fp) == 0); ^~~~~ Reported by Jannick <thirdedition@gmx.net> in https://lists.gnu.org/archive/html/sed-devel/2018-10/msg00019.html . * sed/execute.c (debug_print_input): Rename 'stdin' to 'is_stdin'.
* maint: fix a syntax-check nitJim Meyering2018-10-281-2/+2
| | | | | * sed/compile.c (MISSING_FILENAME): Insert a space before "(", and in a following comment.
* sed: avoid UMR in --debug code pathJim Meyering2018-10-271-3/+6
| | | | | | * sed/debug.c (debug_print_function) [b, t, T]: For a b, t or T command with no LABEL, do not access uninitialized memory. I.e., print the label name only when there is one.
* sed: add --debug featureAssaf Gordon2018-10-246-21/+611
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | $ seq 3 | sed --debug -e 's/./--&--/ ; 2d' SED PROGRAM: s/./--&--/ 2 d INPUT: 'STDIN' line 1 PATTERN: 1 COMMAND: s/./--&--/ MATCHED REGEX REGISTERS regex[0] = 0-1 '1' PATTERN: --1-- COMMAND: 2 d END-OF-CYCLE: --1-- INPUT: 'STDIN' line 2 PATTERN: 2 COMMAND: s/./--&--/ MATCHED REGEX REGISTERS regex[0] = 0-1 '2' PATTERN: --2-- COMMAND: 2 d END-OF-CYCLE: INPUT: 'STDIN' line 3 PATTERN: 3 COMMAND: s/./--&--/ MATCHED REGEX REGISTERS regex[0] = 0-1 '3' PATTERN: --3-- COMMAND: 2 d END-OF-CYCLE: --3-- Discussed in https://lists.gnu.org/r/sed-devel/2018-07/msg00006.html and https://lists.gnu.org/r/sed-devel/2018-10/msg00007.html . * NEWS: Mention new option. * doc/sed.texi (Program options): Mention new option. * sed/debug.c: New unit with debug printing functions. * sed/sed.h (debug_print_command, debug_print_char, debug_print_program, debug): Declare functions and global variable. (struct sed_cmd): Add label_name member variable. * sed/compile.c (compile_program): Save the label's name. (cleanup_program_filenames): extracted function to free filenames. (check_final_program) Don't delete the filenames, instead move it to ... (finish_program) ... here. * sed/execute.c (debug_print_end_of_cycle, debug_print_input, debug_print_line): New debug functions (cannot be defined in debug.c as execute's structures are private). (execute_program, process_files): Call debug functions. * sed/sed.c: (DEBUG_OPTION): New option for getoptlong. (debug): New global variable. (usage): Mention new option. (main): Process new option and call debug functions if needed. * testsuite/debug.pl: New tests. * testsuite/local.mk (T): Add new tests.
* sed: change internal storage for 'R' commandAssaf Gordon2018-10-193-7/+8
| | | | | | | | | | | | | | | | For the 'R' command, keep a pointer to 'struct output' instead of just to FILE*. No change in functionality. This will help future debug code to know the filename of the associated file. As a side effect, fix invalid code in W/w execution: The previous code checked for 'cur_cmd->x.fp' (which was related to R command, not W/w). Since 'x' is a union, 'x.fp' was not relevant to the 'x.outf' (which is the struct associted with W/w commands). * sed/sed.h (struct sed_cmd): Replace 'FILE*' with 'struct *output' for R command. * sed/compile.c (compile_program): Adjust as needed. * sed/execute.c (execute_program): Adjust as needed.
* sed: reject r/R/w/W commands without a filenameAssaf Gordon2018-10-181-1/+9
| | | | | | | | | | | | | | | | | | | | | | w/W (and s///w) commands Without a filename would print a confusing error message: $ sed w sed: couldn't open file : No such file or directory While r/R commands with empty file name were a silent no-op. With this change, sed programs with empty filename are rejected with a clear error: $ sed 's/1/2/w' sed: -e expression #1, char 7: missing filename in r/R/w/W commands $ sed r sed: -e expression #1, char 1: missing filename in r/R/w/W commands * NEWS: Mention change. * sed/compile.c (get_openfile): Exit with an error message if filename is missing. (compile_program): Same for 'r' command code. * testsuite/missing-filename.sh: New test. * testsuite/local.mk (T): Add new test.
* sed: update authorsAssaf Gordon2018-10-121-1/+3
| | | | | * sed/sed.c (AUTHORS): Update. * doc/sed.texi (@author): Update.
* maint: remove REG_PERL codeAssaf Gordon2018-08-234-180/+0
| | | | | | | | Perl-regexp syntax (PCRE) in GNU Sed is shelved indefinitely. See https://bugs.gnu.org/22801 , https://bugs.gnu.org/22647 . Remove all (unused) REG_PERL related code. * sed/sed.c, sed/sed.h, sed/regexp.c, sed/compile.c: Remove REG_PERL code.
* maint: remove EXPERIMENTAL_DASH_N_OPTIMIZATION codeAssaf Gordon2018-08-231-103/+0
| | | | | | The optimization was buggy and was never enabled in a released version. * sed/execute.c: Remove EXPERIMENTAL_DASH_N_OPTIMIZATION code.
* maint: replace street address with URL in license textAssaf Gordon2018-08-238-16/+8
| | | | | | | * basicdefs.h, sed/compile.c, sed/execute.c, sed/mbcs.c, sed/regexp.c, sed/sed.c, sed/sed.h, sed/utils.c, sed/utils.h, testsuite/get-mb-cur-max.c, testsuite/test-mbrtowc.c (GPL License notice): Replace FSF's office address with 'https://www.gnu.org/licenses/'.
* sed: mark function as attribute(malloc)Assaf Gordon2018-08-081-1/+1
| | | | | | Suggested by gcc-8.2.0. * sed/compile.c (read_label): Mark as _GL_ATTRIBUTE_MALLOC.
* sed: fix memory leakAssaf Gordon2018-08-081-1/+13
| | | | | * sed/regexp.c (match_regex): Free the previously allocated regex struct before re-building the regex during program execution.
* sed: free allocated memory under lint, remove DEBUG_LEAKSAssaf Gordon2018-08-086-10/+59
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Under normal operation there is no need for explicit freeing, as all memory will be released when sed terminates. During development (and specifically, valgrind and address-sanitizing) enabling lint prevents false-positive warnings about memory leaks. Lint mode can be enabled with CFLAGS="-Dlint". It is also automatically enabled by default when building from git (as opposed to tarball). For consistency all instances of "#ifdef DEBUG_LEAKS" are replaced with "#ifdef lint". * sed/sed.h (struct subst): Add member variable to keep the address of allocated buffer in compile.c:setup_replacement(). (release_regex): Add declaration. (finish_program): Function now takes an argument: the sed program vector. * sed/sed.c (main): Adjust call to finish_program. * sed/compile.c (finish_program): Release program allocations. (setup_replacement): Remember the allocated buffer address. (compile_program): Free temporary array in 'y' command. * sed/execute.c (execute_program): Free allocated but unused buffer in 'R' command when reaching EOF. * sed/regexp.c (release_regex): Remove 'static', free the allocated dfa struct. * sed/utils.c (panic): Free open files linked-list elements.
* sed: do not close stderr on exitAssaf Gordon2018-08-081-4/+1
| | | | | | Not needed, and prevents leak-sanitizing from working. * sed/utils.c (ck_fclose): Do not close stderr.
* maint: syntax-check: prohibit-operator-at-eolAssaf Gordon2018-08-041-4/+5
| | | | | | * cfg.mk (sc_prohibit_operator_at_end_of_line): Copied from coreutils' cfg.mk. * sed/execute.c (do_subst,execute_program): Adjust as needed.
* maint: syntax-check: add sc_prohibit_strncmpAssaf Gordon2018-08-041-1/+1
| | | | | | * cfg.mk (sc_prohibit_strncmp): Copied from coreutils' cfg.mk. * basicdefs.h (STREQ,STREQ_LEN,STRPREFIX): Copied from coreutils' system.h. * sed/execute.c (translate_mb): Replace strncmp with STREQ_LEN.