1 /* Reduced from false positive in Linux kernel in
2 drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c. */
4 /* { dg-do compile } */
5 /* { dg-options "-fanalyzer" } */
6 /* { dg-require-effective-target analyzer } */
8 typedef unsigned char __u8
;
9 typedef unsigned short __u16
;
10 extern unsigned int __max_logical_packages
;
12 copy_from_user(void* to
, const void* from
, unsigned long n
);
14 copy_to_user(void* to
, const void* from
, unsigned long n
);
15 struct isst_tpmi_instance_count
21 struct tpmi_per_power_domain_info
25 struct tpmi_sst_struct
27 int number_of_power_domains
;
28 struct tpmi_per_power_domain_info
* power_domain_info
;
30 struct tpmi_sst_common_struct
33 struct tpmi_sst_struct
** sst_inst
;
35 static struct tpmi_sst_common_struct isst_common
;
37 isst_if_get_tpmi_instance_count(void* argp
)
39 struct isst_tpmi_instance_count tpmi_inst
;
40 struct tpmi_sst_struct
* sst_inst
;
42 if (copy_from_user(&tpmi_inst
, argp
, sizeof(tpmi_inst
)))
44 if (tpmi_inst
.socket_id
>= (__max_logical_packages
))
47 isst_common
.sst_inst
[tpmi_inst
.socket_id
]->number_of_power_domains
; /* { dg-bogus "use of attacker-controlled value as offset without upper-bounds checking" } */
48 sst_inst
= isst_common
.sst_inst
[tpmi_inst
.socket_id
];
49 tpmi_inst
.valid_mask
= 0;
50 for (i
= 0; i
< sst_inst
->number_of_power_domains
; ++i
) {
51 struct tpmi_per_power_domain_info
* pd_info
;
52 pd_info
= &sst_inst
->power_domain_info
[i
];
53 if (pd_info
->sst_base
)
54 tpmi_inst
.valid_mask
|= ((((1UL))) << (i
));
56 if (copy_to_user(argp
, &tpmi_inst
, sizeof(tpmi_inst
)))