In vsock_update_buffer_size(), the buffer size was being clamped to the
maximum first, and then to the minimum. If a user sets a minimum buffer
size larger than the maximum, the minimum check overrides the maximum
check, inverting the constraint.

This breaks the intended socket memory boundaries by allowing the
vsk->buffer_size to grow beyond the configured vsk->buffer_max_size.

Fix this by checking the minimum first, and then the maximum. This
ensures the buffer size never exceeds the buffer_max_size.

Fixes: b9f2b0ffde0c ("vsock: handle buffer_size sockopts in the core")
Suggested-by: Stefano Garzarella <[email protected]>
Signed-off-by: Norbert Szetei <[email protected]>
---
v3: 
 - Added Fixes and Suggested-by tags.

 net/vmw_vsock/af_vsock.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index d912ed2f012a..08f4dfb9782c 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -1951,12 +1951,12 @@ static void vsock_update_buffer_size(struct vsock_sock 
*vsk,
                                     const struct vsock_transport *transport,
                                     u64 val)
 {
-       if (val > vsk->buffer_max_size)
-               val = vsk->buffer_max_size;
-
        if (val < vsk->buffer_min_size)
                val = vsk->buffer_min_size;
 
+       if (val > vsk->buffer_max_size)
+               val = vsk->buffer_max_size;
+
        if (val != vsk->buffer_size &&
            transport && transport->notify_buffer_size)
                transport->notify_buffer_size(vsk, &val);
-- 
2.53.0


Reply via email to