On Mon, 2022-01-10 at 08:21 -0700, Todd C. Miller wrote:
> On Mon, 10 Jan 2022 15:23:42 +0100, Martijn van Duren wrote:
>
> > The lputs case is fairly straight forward and I'd like to get an OK
> > for that part.
>
> I agree that fixing lputs() to honor psl is the best approach.
> Wouldn't the diff be simpler if you left the handling of 's' as-is
> but make the loop invariant l > 0 and decrement l accordingly?
> Using len instead of l is probably a little easier to read.
>
> - todd
sure
Index: process.c
===================================================================
RCS file: /cvs/src/usr.bin/sed/process.c,v
retrieving revision 1.34
diff -u -p -r1.34 process.c
--- process.c 14 Nov 2018 10:59:33 -0000 1.34
+++ process.c 10 Jan 2022 15:52:26 -0000
@@ -60,7 +60,7 @@ static SPACE HS, PS, SS;
static inline int applies(struct s_command *);
static void flush_appends(void);
-static void lputs(char *);
+static void lputs(char *, size_t);
static inline int regexec_e(regex_t *, const char *, int, int, size_t,
size_t);
static void regsub(SPACE *, char *, char *);
@@ -158,7 +158,7 @@ redirect:
(void)fprintf(outfile, "%s", cp->t);
break;
case 'l':
- lputs(ps);
+ lputs(ps, psl);
break;
case 'n':
if (!nflag && !pd)
@@ -478,14 +478,14 @@ flush_appends(void)
}
static void
-lputs(char *s)
+lputs(char *s, size_t len)
{
int count;
extern int termwidth;
const char *escapes;
char *p;
- for (count = 0; *s; ++s) {
+ for (count = 0; len > 0; len--, s++) {
if (count >= termwidth) {
(void)fprintf(outfile, "\\\n");
count = 0;
@@ -501,7 +501,7 @@ lputs(char *s)
} else {
escapes = "\\\a\b\f\r\t\v";
(void)fputc('\\', outfile);
- if ((p = strchr(escapes, *s))) {
+ if ((p = strchr(escapes, *s)) && *s != '\0') {
(void)fputc("\\abfrtv"[p - escapes], outfile);
count += 2;
} else {