ksh does a little dance to try and gift history files to their original owner
if it's somehow running as a different user. this of course only works as
root, and is probably a terrible idea.
ksh should simply refuse to open a history file that's owned by somebody else.
Index: history.c
===================================================================
RCS file: /cvs/src/bin/ksh/history.c,v
retrieving revision 1.45
diff -u -p -r1.45 history.c
--- history.c 8 Oct 2015 15:54:59 -0000 1.45
+++ history.c 8 Oct 2015 16:00:10 -0000
@@ -619,6 +619,7 @@ hist_init(Source *s)
unsigned char *base;
int lines;
int fd;
+ struct stat sb;
if (Flag(FTALKING) == 0)
return;
@@ -636,6 +637,10 @@ hist_init(Source *s)
/* we have a file and are interactive */
if ((fd = open(hname, O_RDWR|O_CREAT|O_APPEND, 0600)) < 0)
return;
+ if (fstat(fd, &sb) == -1 || sb.st_uid != getuid()) {
+ close(fd);
+ return;
+ }
histfd = savefd(fd);
if (histfd != fd)
@@ -732,7 +737,6 @@ hist_shrink(unsigned char *oldbase, int
{
int fd;
char nfile[1024];
- struct stat statb;
unsigned char *nbase = oldbase;
int nbytes = oldbytes;
@@ -759,11 +763,6 @@ hist_shrink(unsigned char *oldbase, int
unlink(nfile);
return 1;
}
- /*
- * worry about who owns this file
- */
- if (fstat(histfd, &statb) >= 0)
- fchown(fd, statb.st_uid, statb.st_gid);
close(fd);
/*