From: kernel test robot <lkp@intel.com>
To: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Cc: clang-built-linux@googlegroups.com, kbuild-all@lists.01.org,
Linux Memory Management List <linux-mm@kvack.org>,
Mike Snitzer <snitzer@redhat.com>
Subject: [linux-next:master 1957/2389] drivers/md/dm-ima.c:184:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true
Date: Thu, 22 Jul 2021 10:04:29 +0800 [thread overview]
Message-ID: <202107221020.wUjkaOTW-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 9974 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: b1347210b01daa977ea980268927aa99198ceccc
commit: c2608cebed20bb307056d202258cc96ae8a9631d [1957/2389] dm ima: measure data on table load
config: arm-randconfig-r016-20210721 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 9625ca5b602616b2f5584e8a49ba93c52c141e40)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=c2608cebed20bb307056d202258cc96ae8a9631d
git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
git fetch --no-tags linux-next master
git checkout c2608cebed20bb307056d202258cc96ae8a9631d
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/md/dm-ima.c:184:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (dm_ima_alloc_and_copy_device_data(table->md, &device_data_buf, num_targets, noio))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:325:20: note: uninitialized use occurs here
crypto_free_shash(tfm);
^~~
drivers/md/dm-ima.c:184:2: note: remove the 'if' if its condition is always false
if (dm_ima_alloc_and_copy_device_data(table->md, &device_data_buf, num_targets, noio))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:179:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!target_data_buf)
^~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:325:20: note: uninitialized use occurs here
crypto_free_shash(tfm);
^~~
drivers/md/dm-ima.c:179:2: note: remove the 'if' if its condition is always false
if (!target_data_buf)
^~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:175:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!target_metadata_buf)
^~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:325:20: note: uninitialized use occurs here
crypto_free_shash(tfm);
^~~
drivers/md/dm-ima.c:175:2: note: remove the 'if' if its condition is always false
if (!target_metadata_buf)
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:166:26: note: initialize the variable 'tfm' to silence this warning
struct crypto_shash *tfm;
^
= NULL
3 warnings generated.
vim +184 drivers/md/dm-ima.c
152
153 /*
154 * Build up the IMA data for each target, and finally measure.
155 */
156 void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_flags)
157 {
158 size_t device_data_buf_len, target_metadata_buf_len, target_data_buf_len, l = 0;
159 char *target_metadata_buf = NULL, *target_data_buf = NULL, *digest_buf = NULL;
160 char *ima_buf = NULL, *device_data_buf = NULL;
161 int digest_size, last_target_measured = -1, r;
162 status_type_t type = STATUSTYPE_IMA;
163 size_t cur_total_buf_len = 0;
164 unsigned int num_targets, i;
165 SHASH_DESC_ON_STACK(shash, NULL);
166 struct crypto_shash *tfm;
167 u8 *digest = NULL;
168 bool noio = false;
169
170 ima_buf = dm_ima_alloc(DM_IMA_MEASUREMENT_BUF_LEN, GFP_KERNEL, noio);
171 if (!ima_buf)
172 return;
173
174 target_metadata_buf = dm_ima_alloc(DM_IMA_TARGET_METADATA_BUF_LEN, GFP_KERNEL, noio);
175 if (!target_metadata_buf)
176 goto error;
177
178 target_data_buf = dm_ima_alloc(DM_IMA_TARGET_DATA_BUF_LEN, GFP_KERNEL, noio);
179 if (!target_data_buf)
180 goto error;
181
182 num_targets = dm_table_get_num_targets(table);
183
> 184 if (dm_ima_alloc_and_copy_device_data(table->md, &device_data_buf, num_targets, noio))
185 goto error;
186
187 tfm = crypto_alloc_shash("sha256", 0, 0);
188 if (IS_ERR(tfm))
189 goto error;
190
191 shash->tfm = tfm;
192 digest_size = crypto_shash_digestsize(tfm);
193 digest = dm_ima_alloc(digest_size, GFP_KERNEL, noio);
194 if (!digest)
195 goto error;
196
197 r = crypto_shash_init(shash);
198 if (r)
199 return;
200
201 device_data_buf_len = strlen(device_data_buf);
202 memcpy(ima_buf + l, device_data_buf, device_data_buf_len);
203 l += device_data_buf_len;
204
205 for (i = 0; i < num_targets; i++) {
206 struct dm_target *ti = dm_table_get_target(table, i);
207
208 if (!ti)
209 goto error;
210
211 last_target_measured = 0;
212
213 /*
214 * First retrieve the target metadata.
215 */
216 scnprintf(target_metadata_buf, DM_IMA_TARGET_METADATA_BUF_LEN,
217 "target_index=%d,target_begin=%llu,target_len=%llu,",
218 i, ti->begin, ti->len);
219 target_metadata_buf_len = strlen(target_metadata_buf);
220
221 /*
222 * Then retrieve the actual target data.
223 */
224 if (ti->type->status)
225 ti->type->status(ti, type, status_flags, target_data_buf,
226 DM_IMA_TARGET_DATA_BUF_LEN);
227 else
228 target_data_buf[0] = '\0';
229
230 target_data_buf_len = strlen(target_data_buf);
231
232 /*
233 * Check if the total data can fit into the IMA buffer.
234 */
235 cur_total_buf_len = l + target_metadata_buf_len + target_data_buf_len;
236
237 /*
238 * IMA measurements for DM targets are best-effort.
239 * If the total data buffered so far, including the current target,
240 * is too large to fit into DM_IMA_MEASUREMENT_BUF_LEN, measure what
241 * we have in the current buffer, and continue measuring the remaining
242 * targets by prefixing the device metadata again.
243 */
244 if (unlikely(cur_total_buf_len >= DM_IMA_MEASUREMENT_BUF_LEN)) {
245 dm_ima_measure_data("table_load", ima_buf, l, noio);
246 r = crypto_shash_update(shash, (const u8 *)ima_buf, l);
247 if (r < 0)
248 goto error;
249
250 memset(ima_buf, 0, DM_IMA_MEASUREMENT_BUF_LEN);
251 l = 0;
252
253 /*
254 * Each new "table_load" entry in IMA log should have device data
255 * prefix, so that multiple records from the same table_load for
256 * a given device can be linked together.
257 */
258 memcpy(ima_buf + l, device_data_buf, device_data_buf_len);
259 l += device_data_buf_len;
260
261 /*
262 * If this iteration of the for loop turns out to be the last target
263 * in the table, dm_ima_measure_data("table_load", ...) doesn't need
264 * to be called again, just the hash needs to be finalized.
265 * "last_target_measured" tracks this state.
266 */
267 last_target_measured = 1;
268 }
269
270 /*
271 * Fill-in all the target metadata, so that multiple targets for the same
272 * device can be linked together.
273 */
274 memcpy(ima_buf + l, target_metadata_buf, target_metadata_buf_len);
275 l += target_metadata_buf_len;
276
277 memcpy(ima_buf + l, target_data_buf, target_data_buf_len);
278 l += target_data_buf_len;
279 }
280
281 if (!last_target_measured) {
282 dm_ima_measure_data("table_load", ima_buf, l, noio);
283
284 r = crypto_shash_update(shash, (const u8 *)ima_buf, l);
285 if (r < 0)
286 goto error;
287 }
288
289 /*
290 * Finalize the table hash, and store it in table->md->ima.inactive_table.hash,
291 * so that the table data can be verified against the future device state change
292 * events, e.g. resume, rename, remove, table-clear etc.
293 */
294 r = crypto_shash_final(shash, digest);
295 if (r < 0)
296 goto error;
297
298 digest_buf = dm_ima_alloc((digest_size*2)+1, GFP_KERNEL, noio);
299 if (!digest_buf)
300 goto error;
301
302 for (i = 0; i < digest_size; i++)
303 snprintf((digest_buf+(i*2)), 3, "%02x", digest[i]);
304
305 if (table->md->ima.active_table.hash != table->md->ima.inactive_table.hash)
306 kfree(table->md->ima.inactive_table.hash);
307
308 table->md->ima.inactive_table.hash = digest_buf;
309 table->md->ima.inactive_table.hash_len = strlen(digest_buf);
310 table->md->ima.inactive_table.num_targets = num_targets;
311
312 if (table->md->ima.active_table.device_metadata !=
313 table->md->ima.inactive_table.device_metadata)
314 kfree(table->md->ima.inactive_table.device_metadata);
315
316 table->md->ima.inactive_table.device_metadata = device_data_buf;
317 table->md->ima.inactive_table.device_metadata_len = device_data_buf_len;
318
319 goto exit;
320 error:
321 kfree(digest_buf);
322 kfree(device_data_buf);
323 exit:
324 kfree(digest);
325 crypto_free_shash(tfm);
326 kfree(ima_buf);
327 kfree(target_metadata_buf);
328 kfree(target_data_buf);
329 }
330
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 31637 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [linux-next:master 1957/2389] drivers/md/dm-ima.c:184:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true
Date: Thu, 22 Jul 2021 10:04:29 +0800 [thread overview]
Message-ID: <202107221020.wUjkaOTW-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 10217 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: b1347210b01daa977ea980268927aa99198ceccc
commit: c2608cebed20bb307056d202258cc96ae8a9631d [1957/2389] dm ima: measure data on table load
config: arm-randconfig-r016-20210721 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 9625ca5b602616b2f5584e8a49ba93c52c141e40)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=c2608cebed20bb307056d202258cc96ae8a9631d
git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
git fetch --no-tags linux-next master
git checkout c2608cebed20bb307056d202258cc96ae8a9631d
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/md/dm-ima.c:184:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (dm_ima_alloc_and_copy_device_data(table->md, &device_data_buf, num_targets, noio))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:325:20: note: uninitialized use occurs here
crypto_free_shash(tfm);
^~~
drivers/md/dm-ima.c:184:2: note: remove the 'if' if its condition is always false
if (dm_ima_alloc_and_copy_device_data(table->md, &device_data_buf, num_targets, noio))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:179:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!target_data_buf)
^~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:325:20: note: uninitialized use occurs here
crypto_free_shash(tfm);
^~~
drivers/md/dm-ima.c:179:2: note: remove the 'if' if its condition is always false
if (!target_data_buf)
^~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:175:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!target_metadata_buf)
^~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:325:20: note: uninitialized use occurs here
crypto_free_shash(tfm);
^~~
drivers/md/dm-ima.c:175:2: note: remove the 'if' if its condition is always false
if (!target_metadata_buf)
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/md/dm-ima.c:166:26: note: initialize the variable 'tfm' to silence this warning
struct crypto_shash *tfm;
^
= NULL
3 warnings generated.
vim +184 drivers/md/dm-ima.c
152
153 /*
154 * Build up the IMA data for each target, and finally measure.
155 */
156 void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_flags)
157 {
158 size_t device_data_buf_len, target_metadata_buf_len, target_data_buf_len, l = 0;
159 char *target_metadata_buf = NULL, *target_data_buf = NULL, *digest_buf = NULL;
160 char *ima_buf = NULL, *device_data_buf = NULL;
161 int digest_size, last_target_measured = -1, r;
162 status_type_t type = STATUSTYPE_IMA;
163 size_t cur_total_buf_len = 0;
164 unsigned int num_targets, i;
165 SHASH_DESC_ON_STACK(shash, NULL);
166 struct crypto_shash *tfm;
167 u8 *digest = NULL;
168 bool noio = false;
169
170 ima_buf = dm_ima_alloc(DM_IMA_MEASUREMENT_BUF_LEN, GFP_KERNEL, noio);
171 if (!ima_buf)
172 return;
173
174 target_metadata_buf = dm_ima_alloc(DM_IMA_TARGET_METADATA_BUF_LEN, GFP_KERNEL, noio);
175 if (!target_metadata_buf)
176 goto error;
177
178 target_data_buf = dm_ima_alloc(DM_IMA_TARGET_DATA_BUF_LEN, GFP_KERNEL, noio);
179 if (!target_data_buf)
180 goto error;
181
182 num_targets = dm_table_get_num_targets(table);
183
> 184 if (dm_ima_alloc_and_copy_device_data(table->md, &device_data_buf, num_targets, noio))
185 goto error;
186
187 tfm = crypto_alloc_shash("sha256", 0, 0);
188 if (IS_ERR(tfm))
189 goto error;
190
191 shash->tfm = tfm;
192 digest_size = crypto_shash_digestsize(tfm);
193 digest = dm_ima_alloc(digest_size, GFP_KERNEL, noio);
194 if (!digest)
195 goto error;
196
197 r = crypto_shash_init(shash);
198 if (r)
199 return;
200
201 device_data_buf_len = strlen(device_data_buf);
202 memcpy(ima_buf + l, device_data_buf, device_data_buf_len);
203 l += device_data_buf_len;
204
205 for (i = 0; i < num_targets; i++) {
206 struct dm_target *ti = dm_table_get_target(table, i);
207
208 if (!ti)
209 goto error;
210
211 last_target_measured = 0;
212
213 /*
214 * First retrieve the target metadata.
215 */
216 scnprintf(target_metadata_buf, DM_IMA_TARGET_METADATA_BUF_LEN,
217 "target_index=%d,target_begin=%llu,target_len=%llu,",
218 i, ti->begin, ti->len);
219 target_metadata_buf_len = strlen(target_metadata_buf);
220
221 /*
222 * Then retrieve the actual target data.
223 */
224 if (ti->type->status)
225 ti->type->status(ti, type, status_flags, target_data_buf,
226 DM_IMA_TARGET_DATA_BUF_LEN);
227 else
228 target_data_buf[0] = '\0';
229
230 target_data_buf_len = strlen(target_data_buf);
231
232 /*
233 * Check if the total data can fit into the IMA buffer.
234 */
235 cur_total_buf_len = l + target_metadata_buf_len + target_data_buf_len;
236
237 /*
238 * IMA measurements for DM targets are best-effort.
239 * If the total data buffered so far, including the current target,
240 * is too large to fit into DM_IMA_MEASUREMENT_BUF_LEN, measure what
241 * we have in the current buffer, and continue measuring the remaining
242 * targets by prefixing the device metadata again.
243 */
244 if (unlikely(cur_total_buf_len >= DM_IMA_MEASUREMENT_BUF_LEN)) {
245 dm_ima_measure_data("table_load", ima_buf, l, noio);
246 r = crypto_shash_update(shash, (const u8 *)ima_buf, l);
247 if (r < 0)
248 goto error;
249
250 memset(ima_buf, 0, DM_IMA_MEASUREMENT_BUF_LEN);
251 l = 0;
252
253 /*
254 * Each new "table_load" entry in IMA log should have device data
255 * prefix, so that multiple records from the same table_load for
256 * a given device can be linked together.
257 */
258 memcpy(ima_buf + l, device_data_buf, device_data_buf_len);
259 l += device_data_buf_len;
260
261 /*
262 * If this iteration of the for loop turns out to be the last target
263 * in the table, dm_ima_measure_data("table_load", ...) doesn't need
264 * to be called again, just the hash needs to be finalized.
265 * "last_target_measured" tracks this state.
266 */
267 last_target_measured = 1;
268 }
269
270 /*
271 * Fill-in all the target metadata, so that multiple targets for the same
272 * device can be linked together.
273 */
274 memcpy(ima_buf + l, target_metadata_buf, target_metadata_buf_len);
275 l += target_metadata_buf_len;
276
277 memcpy(ima_buf + l, target_data_buf, target_data_buf_len);
278 l += target_data_buf_len;
279 }
280
281 if (!last_target_measured) {
282 dm_ima_measure_data("table_load", ima_buf, l, noio);
283
284 r = crypto_shash_update(shash, (const u8 *)ima_buf, l);
285 if (r < 0)
286 goto error;
287 }
288
289 /*
290 * Finalize the table hash, and store it in table->md->ima.inactive_table.hash,
291 * so that the table data can be verified against the future device state change
292 * events, e.g. resume, rename, remove, table-clear etc.
293 */
294 r = crypto_shash_final(shash, digest);
295 if (r < 0)
296 goto error;
297
298 digest_buf = dm_ima_alloc((digest_size*2)+1, GFP_KERNEL, noio);
299 if (!digest_buf)
300 goto error;
301
302 for (i = 0; i < digest_size; i++)
303 snprintf((digest_buf+(i*2)), 3, "%02x", digest[i]);
304
305 if (table->md->ima.active_table.hash != table->md->ima.inactive_table.hash)
306 kfree(table->md->ima.inactive_table.hash);
307
308 table->md->ima.inactive_table.hash = digest_buf;
309 table->md->ima.inactive_table.hash_len = strlen(digest_buf);
310 table->md->ima.inactive_table.num_targets = num_targets;
311
312 if (table->md->ima.active_table.device_metadata !=
313 table->md->ima.inactive_table.device_metadata)
314 kfree(table->md->ima.inactive_table.device_metadata);
315
316 table->md->ima.inactive_table.device_metadata = device_data_buf;
317 table->md->ima.inactive_table.device_metadata_len = device_data_buf_len;
318
319 goto exit;
320 error:
321 kfree(digest_buf);
322 kfree(device_data_buf);
323 exit:
324 kfree(digest);
325 crypto_free_shash(tfm);
326 kfree(ima_buf);
327 kfree(target_metadata_buf);
328 kfree(target_data_buf);
329 }
330
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 31637 bytes --]
next reply other threads:[~2021-07-22 3:37 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-22 2:04 kernel test robot [this message]
2021-07-22 2:04 ` [linux-next:master 1957/2389] drivers/md/dm-ima.c:184:6: warning: variable 'tfm' is used uninitialized whenever 'if' condition is true kernel test robot
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=202107221020.wUjkaOTW-lkp@intel.com \
--to=lkp@intel.com \
--cc=clang-built-linux@googlegroups.com \
--cc=kbuild-all@lists.01.org \
--cc=linux-mm@kvack.org \
--cc=snitzer@redhat.com \
--cc=tusharsu@linux.microsoft.com \
/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.