On Sat, 2020-10-10 at 17:21 +0200, Christian Weisgerber wrote: > Changing basename(3) and dirname(3) to the POSIX-mandated non-const > parameters produces this warnings when compiling sed(1): > > /usr/src/usr.bin/sed/main.c:401:16: warning: passing 'const char *' to > parameter > of type 'char *' discards qualifiers > [-Wincompatible-pointer-types-discards-qua > lifiers] > > Here's a fix to accommodate a basename(3) that takes a non-const > parameter and may in fact modify the string buffer. Based on FreeBSD > like the surrounding in-place editing code. > > OK? > Wouldn't the following diff be a little simpler? No need to check the return value of strlcpy, since we do a lstat before, which can return a ENAMETOOLONG.
martijn@ Index: main.c =================================================================== RCS file: /cvs/src/usr.bin/sed/main.c,v retrieving revision 1.40 diff -u -p -r1.40 main.c --- main.c 8 Dec 2018 23:11:24 -0000 1.40 +++ main.c 10 Oct 2020 17:51:53 -0000 @@ -343,6 +343,7 @@ mf_fgets(SPACE *sp, enum e_spflag spflag { struct stat sb; size_t len; + char dirbuf[PATH_MAX]; char *p; int c, fd; static int firstfile; @@ -397,8 +398,9 @@ mf_fgets(SPACE *sp, enum e_spflag spflag if (len > sizeof(oldfname)) error(FATAL, "%s: name too long", fname); } - len = snprintf(tmpfname, sizeof(tmpfname), "%s/sedXXXXXXXXXX", - dirname(fname)); + strlcpy(dirbuf, fname, sizeof(dirbuf)); + len = snprintf(tmpfname, sizeof(tmpfname), + "%s/sedXXXXXXXXXX", dirname(dirbuf)); if (len >= sizeof(tmpfname)) error(FATAL, "%s: name too long", fname); if ((fd = mkstemp(tmpfname)) == -1)