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
next 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.