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