1 #include "check_debug.h"
   2 
   3 void memset(void *ptr, char c, int size){}
   4 
   5 int copy_to_user(void *dest, void *data, int size){}
   6 int some_func(struct foo *p){}
   7 
   8 typedef struct zr364xx_pipeinfo {
   9         char x;
  10         int y;
  11 } aa_policy_t;
  12 
  13 struct aa_policy {
  14         int x;
  15 };
  16 
  17 struct foo {
  18         struct aa_policy a;
  19         int x;
  20         int y;
  21 };
  22 
  23 struct foo *p;
  24 struct foo global_dec;
  25 void *ptr;
  26 
  27 int main(void)
  28 {
  29         struct zr364xx_pipeinfo one;
  30         struct aa_policy two;
  31         aa_policy_t three;
  32         struct foo four;
  33         struct foo five;
  34         struct foo six;
  35         struct foo seven;
  36         struct foo eight;
  37         struct foo nine;
  38 
  39         p->a.x = 0;
  40         global_dec.x = 0;
  41         memset(&two, 0, sizeof(two));
  42         four.x = 0;
  43         six = five;
  44         some_func(&seven);
  45         eight.x = (four.x < 5 ? four.x : 5);
  46         eight.y = !five.y;
  47         if (some_func()) {
  48                 nine.x = 1;
  49                 nine.y = 2;
  50         }
  51 
  52         copy_to_user(ptr, &p->a, sizeof(struct aa_policy));
  53         copy_to_user(ptr, &global_dec, sizeof(global_dec));
  54         copy_to_user(ptr, &one, sizeof(one));
  55         copy_to_user(ptr, &two, sizeof(two));
  56         copy_to_user(ptr, &three, sizeof(three));
  57         copy_to_user(ptr, &four, sizeof(four));
  58         copy_to_user(ptr, &five, sizeof(five));
  59         copy_to_user(ptr, &six, sizeof(six));
  60         copy_to_user(ptr, &seven, sizeof(seven));
  61         copy_to_user(ptr, &eight, sizeof(eight));
  62         copy_to_user(ptr, &nine, sizeof(nine));
  63         return 0;
  64 }
  65 /*
  66  * check-name: Rosenberg Leaks
  67  * check-command: smatch -p=kernel -I.. sm_rosenberg.c
  68  *
  69  * check-output-start
  70 sm_rosenberg.c:54 main() warn: check that 'one' doesn't leak information (struct has a hole after 'x')
  71 sm_rosenberg.c:56 main() warn: check that 'three' doesn't leak information (struct has a hole after 'x')
  72 sm_rosenberg.c:57 main() warn: check that 'four.y' doesn't leak information
  73 sm_rosenberg.c:62 main() warn: check that 'nine.x' doesn't leak information
  74  * check-output-end
  75  */