landlock: Clarify BUILD_BUG_ON check in scoping logic

The BUILD_BUG_ON check in domain_is_scoped() and
unmask_scoped_access() should check that the loop that counts down
client_layer finishes.  We therefore check that the numbers
LANDLOCK_MAX_NUM_LAYERS-1 and -1 are both representable by that
integer.  If they are representable, the numbers in between are
representable too, and the loop finishes.

Signed-off-by: Günther Noack <gnoack3000@gmail.com>
Link: https://lore.kernel.org/r/20260327164838.38231-6-gnoack3000@gmail.com
Signed-off-by: Mickaël Salaün <mic@digikod.net>
This commit is contained in:
Günther Noack
2026-03-27 17:48:30 +01:00
committed by Mickaël Salaün
parent ae97330d1b
commit a46e32db1f
2 changed files with 12 additions and 6 deletions

View File

@@ -1595,10 +1595,13 @@ static void unmask_scoped_access(const struct landlock_ruleset *const client,
return; return;
/* /*
* client_layer must be a signed integer with greater capacity * client_layer must be able to represent all numbers from
* than client->num_layers to ensure the following loop stops. * LANDLOCK_MAX_NUM_LAYERS - 1 to -1 for the loop below to terminate.
* (It must be large enough, and it must be signed.)
*/ */
BUILD_BUG_ON(sizeof(client_layer) > sizeof(client->num_layers)); BUILD_BUG_ON(!is_signed_type(typeof(client_layer)));
BUILD_BUG_ON(LANDLOCK_MAX_NUM_LAYERS - 1 >
type_max(typeof(client_layer)));
client_layer = client->num_layers - 1; client_layer = client->num_layers - 1;
client_walker = client->hierarchy; client_walker = client->hierarchy;

View File

@@ -191,10 +191,13 @@ static bool domain_is_scoped(const struct landlock_ruleset *const client,
client_layer = client->num_layers - 1; client_layer = client->num_layers - 1;
client_walker = client->hierarchy; client_walker = client->hierarchy;
/* /*
* client_layer must be a signed integer with greater capacity * client_layer must be able to represent all numbers from
* than client->num_layers to ensure the following loop stops. * LANDLOCK_MAX_NUM_LAYERS - 1 to -1 for the loop below to terminate.
* (It must be large enough, and it must be signed.)
*/ */
BUILD_BUG_ON(sizeof(client_layer) > sizeof(client->num_layers)); BUILD_BUG_ON(!is_signed_type(typeof(client_layer)));
BUILD_BUG_ON(LANDLOCK_MAX_NUM_LAYERS - 1 >
type_max(typeof(client_layer)));
server_layer = server ? (server->num_layers - 1) : -1; server_layer = server ? (server->num_layers - 1) : -1;
server_walker = server ? server->hierarchy : NULL; server_walker = server ? server->hierarchy : NULL;