All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: "Mickaël Salaün" <mic@linux.microsoft.com>
Cc: oe-kbuild-all@lists.linux.dev, linux-kernel@vger.kernel.org,
	James Morris <jamorris@linux.microsoft.com>,
	Kees Cook <keescook@chromium.org>, Jann Horn <jannh@google.com>
Subject: security/landlock/ruleset.c:96:9: warning: 'memcpy' accessing 4294967295 bytes at offsets 20 and 0 overlaps 6442450943 bytes at offset -2147483648
Date: Sat, 4 Jan 2025 07:26:27 +0800	[thread overview]
Message-ID: <202501040747.S3LYfvYq-lkp@intel.com> (raw)

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   0bc21e701a6ffacfdde7f04f87d664d82e8a13bf
commit: ae271c1b14de343b888e77f74f640e3dcbdeb4c9 landlock: Add ruleset and domain management
date:   3 years, 8 months ago
config: csky-randconfig-r026-20230729 (https://download.01.org/0day-ci/archive/20250104/202501040747.S3LYfvYq-lkp@intel.com/config)
compiler: csky-linux-gcc (GCC) 12.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250104/202501040747.S3LYfvYq-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501040747.S3LYfvYq-lkp@intel.com/

All warnings (new ones prefixed by >>):

   security/landlock/ruleset.c: In function 'create_rule':
>> security/landlock/ruleset.c:96:9: warning: 'memcpy' accessing 4294967295 bytes at offsets 20 and 0 overlaps 6442450943 bytes at offset -2147483648 [-Wrestrict]
      96 |         memcpy(new_rule->layers, layers,
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      97 |                         flex_array_size(new_rule, layers, num_layers));
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
   Use of uninitialized value $param in regexp compilation at scripts/kernel-doc line 1532, <IN_FILE> line 146.
   Use of uninitialized value $actual in substitution (s///) at scripts/kernel-doc line 1484, <IN_FILE> line 146.
   Use of uninitialized value $actual in substitution (s///) at scripts/kernel-doc line 1484, <IN_FILE> line 146.
   Use of uninitialized value $param in substitution (s///) at scripts/kernel-doc line 1588, <IN_FILE> line 146.
   Use of uninitialized value $param in pattern match (m//) at scripts/kernel-doc line 1616, <IN_FILE> line 146.
   Use of uninitialized value $param in hash element at scripts/kernel-doc line 1626, <IN_FILE> line 146.
   Use of uninitialized value $param in pattern match (m//) at scripts/kernel-doc line 1626, <IN_FILE> line 146.
   Use of uninitialized value $param in hash element at scripts/kernel-doc line 1627, <IN_FILE> line 146.
   Use of uninitialized value $param in pattern match (m//) at scripts/kernel-doc line 1629, <IN_FILE> line 146.
   Use of uninitialized value $param in concatenation (.) or string at scripts/kernel-doc line 1630, <IN_FILE> line 146.
>> security/landlock/ruleset.c:146: warning: Function parameter or struct member '' not described in 'insert_rule'
   Use of uninitialized value $param in hash element at scripts/kernel-doc line 1645, <IN_FILE> line 146.
   Use of uninitialized value $parameterlist[2] in join or string at scripts/kernel-doc line 1806, <IN_FILE> line 146.
>> security/landlock/ruleset.c:146: warning: Excess function parameter 'layers' description in 'insert_rule'


vim +/memcpy +96 security/landlock/ruleset.c

    68	
    69	static struct landlock_rule *create_rule(
    70			struct landlock_object *const object,
    71			const struct landlock_layer (*const layers)[],
    72			const u32 num_layers,
    73			const struct landlock_layer *const new_layer)
    74	{
    75		struct landlock_rule *new_rule;
    76		u32 new_num_layers;
    77	
    78		build_check_rule();
    79		if (new_layer) {
    80			/* Should already be checked by landlock_merge_ruleset(). */
    81			if (WARN_ON_ONCE(num_layers >= LANDLOCK_MAX_NUM_LAYERS))
    82				return ERR_PTR(-E2BIG);
    83			new_num_layers = num_layers + 1;
    84		} else {
    85			new_num_layers = num_layers;
    86		}
    87		new_rule = kzalloc(struct_size(new_rule, layers, new_num_layers),
    88				GFP_KERNEL_ACCOUNT);
    89		if (!new_rule)
    90			return ERR_PTR(-ENOMEM);
    91		RB_CLEAR_NODE(&new_rule->node);
    92		landlock_get_object(object);
    93		new_rule->object = object;
    94		new_rule->num_layers = new_num_layers;
    95		/* Copies the original layer stack. */
  > 96		memcpy(new_rule->layers, layers,
    97				flex_array_size(new_rule, layers, num_layers));
    98		if (new_layer)
    99			/* Adds a copy of @new_layer on the layer stack. */
   100			new_rule->layers[new_rule->num_layers - 1] = *new_layer;
   101		return new_rule;
   102	}
   103	
   104	static void free_rule(struct landlock_rule *const rule)
   105	{
   106		might_sleep();
   107		if (!rule)
   108			return;
   109		landlock_put_object(rule->object);
   110		kfree(rule);
   111	}
   112	
   113	static void build_check_ruleset(void)
   114	{
   115		const struct landlock_ruleset ruleset = {
   116			.num_rules = ~0,
   117			.num_layers = ~0,
   118		};
   119	
   120		BUILD_BUG_ON(ruleset.num_rules < LANDLOCK_MAX_NUM_RULES);
   121		BUILD_BUG_ON(ruleset.num_layers < LANDLOCK_MAX_NUM_LAYERS);
   122	}
   123	
   124	/**
   125	 * insert_rule - Create and insert a rule in a ruleset
   126	 *
   127	 * @ruleset: The ruleset to be updated.
   128	 * @object: The object to build the new rule with.  The underlying kernel
   129	 *          object must be held by the caller.
   130	 * @layers: One or multiple layers to be copied into the new rule.
   131	 * @num_layers: The number of @layers entries.
   132	 *
   133	 * When user space requests to add a new rule to a ruleset, @layers only
   134	 * contains one entry and this entry is not assigned to any level.  In this
   135	 * case, the new rule will extend @ruleset, similarly to a boolean OR between
   136	 * access rights.
   137	 *
   138	 * When merging a ruleset in a domain, or copying a domain, @layers will be
   139	 * added to @ruleset as new constraints, similarly to a boolean AND between
   140	 * access rights.
   141	 */
   142	static int insert_rule(struct landlock_ruleset *const ruleset,
   143			struct landlock_object *const object,
   144			const struct landlock_layer (*const layers)[],
   145			size_t num_layers)
 > 146	{
   147		struct rb_node **walker_node;
   148		struct rb_node *parent_node = NULL;
   149		struct landlock_rule *new_rule;
   150	
   151		might_sleep();
   152		lockdep_assert_held(&ruleset->lock);
   153		if (WARN_ON_ONCE(!object || !layers))
   154			return -ENOENT;
   155		walker_node = &(ruleset->root.rb_node);
   156		while (*walker_node) {
   157			struct landlock_rule *const this = rb_entry(*walker_node,
   158					struct landlock_rule, node);
   159	
   160			if (this->object != object) {
   161				parent_node = *walker_node;
   162				if (this->object < object)
   163					walker_node = &((*walker_node)->rb_right);
   164				else
   165					walker_node = &((*walker_node)->rb_left);
   166				continue;
   167			}
   168	
   169			/* Only a single-level layer should match an existing rule. */
   170			if (WARN_ON_ONCE(num_layers != 1))
   171				return -EINVAL;
   172	
   173			/* If there is a matching rule, updates it. */
   174			if ((*layers)[0].level == 0) {
   175				/*
   176				 * Extends access rights when the request comes from
   177				 * landlock_add_rule(2), i.e. @ruleset is not a domain.
   178				 */
   179				if (WARN_ON_ONCE(this->num_layers != 1))
   180					return -EINVAL;
   181				if (WARN_ON_ONCE(this->layers[0].level != 0))
   182					return -EINVAL;
   183				this->layers[0].access |= (*layers)[0].access;
   184				return 0;
   185			}
   186	
   187			if (WARN_ON_ONCE(this->layers[0].level == 0))
   188				return -EINVAL;
   189	
   190			/*
   191			 * Intersects access rights when it is a merge between a
   192			 * ruleset and a domain.
   193			 */
   194			new_rule = create_rule(object, &this->layers, this->num_layers,
   195					&(*layers)[0]);
   196			if (IS_ERR(new_rule))
   197				return PTR_ERR(new_rule);
   198			rb_replace_node(&this->node, &new_rule->node, &ruleset->root);
   199			free_rule(this);
   200			return 0;
   201		}
   202	
   203		/* There is no match for @object. */
   204		build_check_ruleset();
   205		if (ruleset->num_rules >= LANDLOCK_MAX_NUM_RULES)
   206			return -E2BIG;
   207		new_rule = create_rule(object, layers, num_layers, NULL);
   208		if (IS_ERR(new_rule))
   209			return PTR_ERR(new_rule);
   210		rb_link_node(&new_rule->node, parent_node, walker_node);
   211		rb_insert_color(&new_rule->node, &ruleset->root);
   212		ruleset->num_rules++;
   213		return 0;
   214	}
   215	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

             reply	other threads:[~2025-01-03 23:27 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-03 23:26 kernel test robot [this message]
2025-01-06 17:04 ` security/landlock/ruleset.c:96:9: warning: 'memcpy' accessing 4294967295 bytes at offsets 20 and 0 overlaps 6442450943 bytes at offset -2147483648 Mickaël Salaün
2025-01-07  0:27   ` Kees Cook
2025-02-21 16:00     ` Mickaël Salaün

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202501040747.S3LYfvYq-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=jamorris@linux.microsoft.com \
    --cc=jannh@google.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mic@linux.microsoft.com \
    --cc=oe-kbuild-all@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.