Skip to content

Commit 7cfe487

Browse files
authored
Merge pull request syslog-ng#5168 from HofiOne/Error-invoking-seek-on-file-filename=devkmsg-error
file-reader: added a more detailed, direct check if seek can be called on the file descriptor
2 parents 6113797 + 2cd1f3a commit 7cfe487

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

modules/affile/file-reader.c

+19-3
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,26 @@ _recover_state(LogPipe *s, GlobalConfig *cfg, LogProtoServer *proto)
163163
}
164164

165165
static gboolean
166-
_can_check_eof(gint fd)
166+
_can_check_eof(FileReader *self, gint fd)
167167
{
168168
struct stat st;
169-
return fstat(fd, &st) == 0 && S_ISFIFO(st.st_mode) == 0;
169+
170+
if (fstat(fd, &st) == -1 || S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode) || S_ISCHR(st.st_mode))
171+
return FALSE;
172+
173+
off_t pos = lseek(fd, 0, SEEK_CUR);
174+
if (pos == -1)
175+
return FALSE;
176+
177+
off_t reset = lseek(fd, pos, SEEK_SET);
178+
if (reset != pos)
179+
{
180+
msg_trace("File seek pos is different after testing if seekable",
181+
evt_tag_str("follow_filename", self->filename->str),
182+
evt_tag_int("fn", fd));
183+
}
184+
185+
return TRUE;
170186
}
171187

172188
static gboolean
@@ -263,7 +279,7 @@ _construct_poll_events(FileReader *self, gint fd)
263279
return NULL;
264280
}
265281

266-
if (_can_check_eof(fd))
282+
if (_can_check_eof(self, fd))
267283
poll_events_set_checker(poll_events, _reader_check_watches, self);
268284

269285
return poll_events;

0 commit comments

Comments
 (0)