diff options
author | Jilles Tjoelker <jilles@FreeBSD.org> | 2011-08-14 13:37:38 +0000 |
---|---|---|
committer | Jilles Tjoelker <jilles@FreeBSD.org> | 2011-08-14 13:37:38 +0000 |
commit | 54d34ff63deb6b929444de83db4c9fa96e7ba6e5 (patch) | |
tree | 22b6d2a5e4c8f8391e3a145ad422b9b837a4901b /usr.bin | |
parent | a3427d6a49ac4e6f57a50304d5ac651c48f95b21 (diff) | |
download | src-54d34ff63deb6b929444de83db4c9fa96e7ba6e5.tar.gz src-54d34ff63deb6b929444de83db4c9fa96e7ba6e5.zip |
tail: Fix crash if -F'ed file's filesystem disappears.
If tail notices that a file it is following no longer exists (because stat()
fails), it will output any final lines and then close the file. If the read
operation also causes an error, such as when the filesystem is forcefully
unmounted, it closes the file as well, leading to fclose(NULL) and a
segmentation fault.
PR: bin/159750
Submitted by: swills
Approved by: re (kib)
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=224865
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/tail/forward.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/usr.bin/tail/forward.c b/usr.bin/tail/forward.c index 6ed5691c366f..e1e0638d7ad3 100644 --- a/usr.bin/tail/forward.c +++ b/usr.bin/tail/forward.c @@ -361,8 +361,10 @@ follow(file_info_t *files, enum STYLE style, off_t off) if (errno != ENOENT) ierr(file->file_name); show(file); - fclose(file->fp); - file->fp = NULL; + if (file->fp != NULL) { + fclose(file->fp); + file->fp = NULL; + } ev_change++; continue; } |