diff options
author | jilles <jilles@FreeBSD.org> | 2011-08-14 13:37:38 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2011-08-14 13:37:38 +0000 |
commit | bb4511c618d6c97201f6fc608f173ceb0e8c496c (patch) | |
tree | 22b6d2a5e4c8f8391e3a145ad422b9b837a4901b | |
parent | 0920e246c699770e57b13150e8b18fb73a484a76 (diff) | |
download | FreeBSD-src-bb4511c618d6c97201f6fc608f173ceb0e8c496c.zip FreeBSD-src-bb4511c618d6c97201f6fc608f173ceb0e8c496c.tar.gz |
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
-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 6ed5691..e1e0638 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; } |