mirror of
https://github.com/troglobit/finit.git
synced 2026-11-01 13:10:32 +00:00
plugins: pidfile: validate against read() length, not buffer size
Fix ev->len validation; must check against sz read(), not total buffer size. Also, fix off-by-one in comparison. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
1 parent
24f274c126
commit
5badf4d376
1 file changed
+5
-4
+5
-4
@@ -151,7 +151,8 @@ static void pidfile_callback(void *arg, int fd, int events)
|
|||||||
{
|
{
|
||||||
static char ev_buf[8 *(sizeof(struct inotify_event) + NAME_MAX + 1) + 1];
|
static char ev_buf[8 *(sizeof(struct inotify_event) + NAME_MAX + 1) + 1];
|
||||||
struct inotify_event *ev;
|
struct inotify_event *ev;
|
||||||
ssize_t sz, off;
|
ssize_t sz;
|
||||||
|
size_t off;
|
||||||
|
|
||||||
sz = read(fd, ev_buf, sizeof(ev_buf) - 1);
|
sz = read(fd, ev_buf, sizeof(ev_buf) - 1);
|
||||||
if (sz <= 0) {
|
if (sz <= 0) {
|
||||||
@@ -160,14 +161,14 @@ static void pidfile_callback(void *arg, int fd, int events)
|
|||||||
}
|
}
|
||||||
ev_buf[sz] = 0;
|
ev_buf[sz] = 0;
|
||||||
|
|
||||||
for (off = 0; off < sz; off += sizeof(*ev) + ev->len) {
|
for (off = 0; off < (size_t)sz; off += sizeof(*ev) + ev->len) {
|
||||||
struct iwatch_path *iwp;
|
struct iwatch_path *iwp;
|
||||||
|
|
||||||
if (off + sizeof(*ev) >= sizeof(ev_buf))
|
if (off + sizeof(*ev) > (size_t)sz)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ev = (struct inotify_event *)&ev_buf[off];
|
ev = (struct inotify_event *)&ev_buf[off];
|
||||||
if (off + sizeof(*ev) + ev->len >= sizeof(ev_buf))
|
if (off + sizeof(*ev) + ev->len > (size_t)sz)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!ev->mask)
|
if (!ev->mask)
|
||||||
|
|||||||
Reference in new issue
Block a user