mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 08:01:12 +02:00
xfs: check healthmon outbuffer space correctly
LOLLM notices that the outbuf space check in xfs_healthmon_format_pop
isn't quite correct -- it checks that there's enough space to write a
xfs_healthmon_event object, but the outbuffer is supposed to contain
xfs_health_monitor_event objects. Fix this by adding a helper, and
refactoring all three outbuf size checks to use it.
Cc: stable@vger.kernel.org # v7.0
Fixes: b3a289a2a9 ("xfs: create event queuing, formatting, and discovery infrastructure")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Assisted-by: LOLLM # finding obvious bugs
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
4c98464e12
commit
74eeb68a62
|
|
@ -735,6 +735,13 @@ static const unsigned int type_map[] = {
|
|||
[XFS_HEALTHMON_DATALOST] = XFS_HEALTH_MONITOR_TYPE_DATALOST,
|
||||
};
|
||||
|
||||
static inline bool
|
||||
xfs_healthmon_check_outbuffer_space(const struct xfs_healthmon *hm)
|
||||
{
|
||||
return hm->bufhead + sizeof(struct xfs_health_monitor_event) <=
|
||||
hm->bufsize;
|
||||
}
|
||||
|
||||
/* Render event as a V0 structure */
|
||||
STATIC int
|
||||
xfs_healthmon_format_v0(
|
||||
|
|
@ -801,10 +808,10 @@ xfs_healthmon_format_v0(
|
|||
break;
|
||||
}
|
||||
|
||||
ASSERT(hm->bufhead + sizeof(hme) <= hm->bufsize);
|
||||
ASSERT(xfs_healthmon_check_outbuffer_space(hm));
|
||||
|
||||
/* copy formatted object to the outbuf */
|
||||
if (hm->bufhead + sizeof(hme) <= hm->bufsize) {
|
||||
if (xfs_healthmon_check_outbuffer_space(hm)) {
|
||||
memcpy(hm->buffer + hm->bufhead, &hme, sizeof(hme));
|
||||
hm->bufhead += sizeof(hme);
|
||||
}
|
||||
|
|
@ -887,7 +894,11 @@ xfs_healthmon_format_pop(
|
|||
{
|
||||
struct xfs_healthmon_event *event;
|
||||
|
||||
if (hm->bufhead + sizeof(*event) > hm->bufsize)
|
||||
/*
|
||||
* Don't bother if there's not enough space to format even one event in
|
||||
* the outbuffer.
|
||||
*/
|
||||
if (!xfs_healthmon_check_outbuffer_space(hm))
|
||||
return NULL;
|
||||
|
||||
mutex_lock(&hm->lock);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user