@@ -168,6 +168,7 @@ static int dm_ima_alloc_and_copy_capacity_str(struct mapped_device *md, char **c
168
168
void dm_ima_reset_data (struct mapped_device * md )
169
169
{
170
170
memset (& (md -> ima ), 0 , sizeof (md -> ima ));
171
+ md -> ima .dm_version_str_len = strlen (DM_IMA_VERSION_STR );
171
172
}
172
173
173
174
/*
@@ -223,6 +224,9 @@ void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_fl
223
224
if (r )
224
225
goto error ;
225
226
227
+ memcpy (ima_buf + l , DM_IMA_VERSION_STR , table -> md -> ima .dm_version_str_len );
228
+ l += table -> md -> ima .dm_version_str_len ;
229
+
226
230
device_data_buf_len = strlen (device_data_buf );
227
231
memcpy (ima_buf + l , device_data_buf , device_data_buf_len );
228
232
l += device_data_buf_len ;
@@ -280,6 +284,9 @@ void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_fl
280
284
* prefix, so that multiple records from the same table_load for
281
285
* a given device can be linked together.
282
286
*/
287
+ memcpy (ima_buf + l , DM_IMA_VERSION_STR , table -> md -> ima .dm_version_str_len );
288
+ l += table -> md -> ima .dm_version_str_len ;
289
+
283
290
memcpy (ima_buf + l , device_data_buf , device_data_buf_len );
284
291
l += device_data_buf_len ;
285
292
@@ -367,6 +374,7 @@ void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap)
367
374
unsigned int active_len = strlen (active ), capacity_len = 0 ;
368
375
unsigned int l = 0 ;
369
376
bool noio = true;
377
+ bool nodata = true;
370
378
int r ;
371
379
372
380
device_table_data = dm_ima_alloc (DM_IMA_DEVICE_BUF_LEN , GFP_KERNEL , noio );
@@ -377,6 +385,9 @@ void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap)
377
385
if (r )
378
386
goto error ;
379
387
388
+ memcpy (device_table_data + l , DM_IMA_VERSION_STR , md -> ima .dm_version_str_len );
389
+ l += md -> ima .dm_version_str_len ;
390
+
380
391
if (swap ) {
381
392
if (md -> ima .active_table .hash != md -> ima .inactive_table .hash )
382
393
kfree (md -> ima .active_table .hash );
@@ -412,8 +423,11 @@ void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap)
412
423
}
413
424
414
425
if (md -> ima .active_table .device_metadata ) {
415
- l = md -> ima .active_table .device_metadata_len ;
416
- memcpy (device_table_data , md -> ima .active_table .device_metadata , l );
426
+ memcpy (device_table_data + l , md -> ima .active_table .device_metadata ,
427
+ md -> ima .active_table .device_metadata_len );
428
+ l += md -> ima .active_table .device_metadata_len ;
429
+
430
+ nodata = false;
417
431
}
418
432
419
433
if (md -> ima .active_table .hash ) {
@@ -426,16 +440,18 @@ void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap)
426
440
427
441
memcpy (device_table_data + l , ";" , 1 );
428
442
l ++ ;
443
+
444
+ nodata = false;
429
445
}
430
446
431
- if (! l ) {
447
+ if (nodata ) {
432
448
r = dm_ima_alloc_and_copy_name_uuid (md , & dev_name , & dev_uuid , noio );
433
449
if (r )
434
450
goto error ;
435
451
436
452
scnprintf (device_table_data , DM_IMA_DEVICE_BUF_LEN ,
437
- "name =%s,uuid=%s;device_resume=no_data;" ,
438
- dev_name , dev_uuid );
453
+ "%sname =%s,uuid=%s;device_resume=no_data;" ,
454
+ DM_IMA_VERSION_STR , dev_name , dev_uuid );
439
455
l += strlen (device_table_data );
440
456
441
457
}
@@ -472,6 +488,7 @@ void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all)
472
488
unsigned int capacity_len = 0 ;
473
489
unsigned int l = 0 ;
474
490
bool noio = true;
491
+ bool nodata = true;
475
492
int r ;
476
493
477
494
device_table_data = dm_ima_alloc (DM_IMA_DEVICE_BUF_LEN * 2 , GFP_KERNEL , noio );
@@ -484,13 +501,18 @@ void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all)
484
501
goto exit ;
485
502
}
486
503
504
+ memcpy (device_table_data + l , DM_IMA_VERSION_STR , md -> ima .dm_version_str_len );
505
+ l += md -> ima .dm_version_str_len ;
506
+
487
507
if (md -> ima .active_table .device_metadata ) {
488
508
memcpy (device_table_data + l , device_active_str , device_active_len );
489
509
l += device_active_len ;
490
510
491
511
memcpy (device_table_data + l , md -> ima .active_table .device_metadata ,
492
512
md -> ima .active_table .device_metadata_len );
493
513
l += md -> ima .active_table .device_metadata_len ;
514
+
515
+ nodata = false;
494
516
}
495
517
496
518
if (md -> ima .inactive_table .device_metadata ) {
@@ -500,6 +522,8 @@ void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all)
500
522
memcpy (device_table_data + l , md -> ima .inactive_table .device_metadata ,
501
523
md -> ima .inactive_table .device_metadata_len );
502
524
l += md -> ima .inactive_table .device_metadata_len ;
525
+
526
+ nodata = false;
503
527
}
504
528
505
529
if (md -> ima .active_table .hash ) {
@@ -512,6 +536,8 @@ void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all)
512
536
513
537
memcpy (device_table_data + l , "," , 1 );
514
538
l ++ ;
539
+
540
+ nodata = false;
515
541
}
516
542
517
543
if (md -> ima .inactive_table .hash ) {
@@ -524,19 +550,21 @@ void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all)
524
550
525
551
memcpy (device_table_data + l , "," , 1 );
526
552
l ++ ;
553
+
554
+ nodata = false;
527
555
}
528
556
/*
529
557
* In case both active and inactive tables, and corresponding
530
558
* device metadata is cleared/missing - record the name and uuid
531
559
* in IMA measurements.
532
560
*/
533
- if (! l ) {
561
+ if (nodata ) {
534
562
if (dm_ima_alloc_and_copy_name_uuid (md , & dev_name , & dev_uuid , noio ))
535
563
goto error ;
536
564
537
565
scnprintf (device_table_data , DM_IMA_DEVICE_BUF_LEN ,
538
- "name =%s,uuid=%s;device_remove=no_data;" ,
539
- dev_name , dev_uuid );
566
+ "%sname =%s,uuid=%s;device_remove=no_data;" ,
567
+ DM_IMA_VERSION_STR , dev_name , dev_uuid );
540
568
l += strlen (device_table_data );
541
569
}
542
570
@@ -582,6 +610,7 @@ void dm_ima_measure_on_table_clear(struct mapped_device *md, bool new_map)
582
610
char inactive_str [] = "inactive_table_hash=" ;
583
611
unsigned int inactive_len = strlen (inactive_str );
584
612
bool noio = true;
613
+ bool nodata = true;
585
614
int r ;
586
615
587
616
device_table_data = dm_ima_alloc (DM_IMA_DEVICE_BUF_LEN , GFP_KERNEL , noio );
@@ -592,6 +621,9 @@ void dm_ima_measure_on_table_clear(struct mapped_device *md, bool new_map)
592
621
if (r )
593
622
goto error1 ;
594
623
624
+ memcpy (device_table_data + l , DM_IMA_VERSION_STR , md -> ima .dm_version_str_len );
625
+ l += md -> ima .dm_version_str_len ;
626
+
595
627
if (md -> ima .inactive_table .device_metadata_len &&
596
628
md -> ima .inactive_table .hash_len ) {
597
629
memcpy (device_table_data + l , md -> ima .inactive_table .device_metadata ,
@@ -608,14 +640,17 @@ void dm_ima_measure_on_table_clear(struct mapped_device *md, bool new_map)
608
640
609
641
memcpy (device_table_data + l , ";" , 1 );
610
642
l ++ ;
643
+
644
+ nodata = false;
611
645
}
612
646
613
- if (! l ) {
647
+ if (nodata ) {
614
648
if (dm_ima_alloc_and_copy_name_uuid (md , & dev_name , & dev_uuid , noio ))
615
649
goto error2 ;
616
650
617
651
scnprintf (device_table_data , DM_IMA_DEVICE_BUF_LEN ,
618
- "name=%s,uuid=%s;table_clear=no_data;" , dev_name , dev_uuid );
652
+ "%sname=%s,uuid=%s;table_clear=no_data;" ,
653
+ DM_IMA_VERSION_STR , dev_name , dev_uuid );
619
654
l += strlen (device_table_data );
620
655
}
621
656
@@ -694,8 +729,9 @@ void dm_ima_measure_on_device_rename(struct mapped_device *md)
694
729
md -> ima .active_table .device_metadata = new_device_data ;
695
730
md -> ima .active_table .device_metadata_len = strlen (new_device_data );
696
731
697
- scnprintf (combined_device_data , DM_IMA_DEVICE_BUF_LEN * 2 , "%snew_name=%s,new_uuid=%s;%s" ,
698
- old_device_data , new_dev_name , new_dev_uuid , capacity_str );
732
+ scnprintf (combined_device_data , DM_IMA_DEVICE_BUF_LEN * 2 ,
733
+ "%s%snew_name=%s,new_uuid=%s;%s" , DM_IMA_VERSION_STR , old_device_data ,
734
+ new_dev_name , new_dev_uuid , capacity_str );
699
735
700
736
dm_ima_measure_data ("device_rename" , combined_device_data , strlen (combined_device_data ),
701
737
noio );
0 commit comments