On Tue, 2020-12-15 at 15:10 +0300, Vadim Zhukov wrote: > > I very rarely use fortune and I'm not familiar with the codebase, but > > from some quick testing and code-scanning I found the following: > > is_fortfile appends .dat to the input file and sees if it's accessible. > > Adding a symlink to the corresponding .dat file make the thing work > > perfectly well for me. Your diff seems to work, because you resolve > > the path, which in turn gives back the correct location for the .dat, > > not because symlinks are not suported. > > Thank you very much for review. Indeed, adding second symlink fixes > the initial issue, so the patch now seems useless... > > > Personally I don't see good reason to add the additional logic which > > can be solved with a second simple symlink, but if others think it's > > worth it, comments inline. > > ... but following your comments I've discovered that copy() function > in fortune.c can return NULL, and that value isn't checked. > > So I'm posting the whole diff for the sake of completeness, and what > I really think worths committing is the last chunk, replacing "return > NULL" with "err(1, NULL)" in copy(). Okay for it?
OK martijn@ for this last bit. > > > martijn@ > > > > On Tue, 2020-12-15 at 01:09 +0300, Vadim Zhukov wrote: > > > Hello, all. > > > > > > This allows fortune(6) to open fortune files via symlinks. > > > Maybe this is a stupid idea, I dunno, but it seems inconsistent > > > that I can't put a symlink to my fortunes collection in > > > /usr/share/games/fortune and then simply call "fortune foo" > > > instead of "fortune /usr/local/share/games/fortune/ru/foo". > > > > > > I decided to call readlink(2) explicitly rather than adding > > > check of file type being open, since that resulted in less code. > > > > > > Ah, and yes, I have a port of Russian fortune files pending, > > > but that's for another list and another day. > > > > > > So... okay/notokay anyone? :) > > -- > WBR, > Vadim Zhukov > > > Index: fortune.c > =================================================================== > RCS file: /cvs/src/games/fortune/fortune/fortune.c,v > retrieving revision 1.60 > diff -u -p -r1.60 fortune.c > --- fortune.c 10 Aug 2017 17:00:08 -0000 1.60 > +++ fortune.c 15 Dec 2020 11:46:00 -0000 > @@ -39,6 +39,7 @@ > #include <ctype.h> > #include <dirent.h> > #include <err.h> > +#include <errno.h> > #include <fcntl.h> > #include <limits.h> > #include <locale.h> > @@ -388,8 +389,9 @@ add_file(int percent, char *file, char * > FILEDESC *parent) > { > FILEDESC *fp; > + ssize_t lnklen; > int fd; > - char *path, *offensive; > + char *path, *offensive, lnkpath[PATH_MAX]; > bool was_malloc; > bool isdir; > > @@ -420,8 +422,22 @@ add_file(int percent, char *file, char * > } > > DPRINTF(1, (stderr, "adding file \"%s\"\n", path)); > + > over: > + lnklen = readlink(path, lnkpath, sizeof(lnkpath)); > + if (lnklen == -1) { > + if (errno != EINVAL) > + goto openfailed; > + } else { > + lnkpath[lnklen] = '\0'; > + if (was_malloc) > + free(path); > + path = copy(lnkpath, NULL); > + was_malloc = 1; > + } > + > if ((fd = open(path, O_RDONLY)) < 0) { > +openfailed: > /* > * This is a sneak. If the user said -a, and if the > * file we're given isn't a file, we check to see if > @@ -718,7 +734,7 @@ copy(char *str, char *suf) > char *new; > > if (asprintf(&new, "%s%s", str, suf ? suf : "") == -1) > - return NULL; > + err(1, NULL); > return new; > } >