1 /* { dg-do compile } */
2 /* { dg-additional-options "-fanalyzer -Wno-pedantic" } */
3 /* { dg-require-effective-target analyzer } */
5 /* See notes in this header. */
6 #include "taint-CVE-2011-0521.h"
8 /* Adapted from drivers/media/dvb/ttpci/av7110_ca.c */
10 int dvb_ca_ioctl(struct file
*file
, unsigned int cmd
, void *parg
)
12 struct dvb_device
*dvbdev
= file
->private_data
;
13 struct av7110
*av7110
= dvbdev
->priv
;
14 unsigned long arg
= (unsigned long) parg
;
16 /* case CA_GET_SLOT_INFO: */
18 ca_slot_info_t
*info
=(ca_slot_info_t
*)parg
;
22 av7110
->ci_slot
[info
->num
].num
= info
->num
; /* { dg-warning "attacker-controlled value" "" { xfail *-*-* } } */
23 av7110
->ci_slot
[info
->num
].type
= FW_CI_LL_SUPPORT(av7110
->arm_app
) ?
25 memcpy(info
, &av7110
->ci_slot
[info
->num
], sizeof(ca_slot_info_t
));
30 static struct dvb_device dvbdev_ca
= {
33 .kernel_ioctl
= dvb_ca_ioctl
,
36 /* Adapted from drivers/media/dvb/dvb-core/dvbdev.c */
38 static DEFINE_MUTEX(dvbdev_mutex
);
40 int dvb_usercopy(struct file
*file
,
41 unsigned int cmd
, unsigned long arg
,
42 int (*func
)(struct file
*file
,
43 unsigned int cmd
, void *arg
))
50 /* Copy arguments into temp kernel buffer */
51 switch (_IOC_DIR(cmd
)) {
54 * For this command, the pointer is actually an integer
59 case _IOC_READ
: /* some v4l ioctls are marked wrong ... */
61 case (_IOC_WRITE
| _IOC_READ
):
62 if (_IOC_SIZE(cmd
) <= sizeof(sbuf
)) {
65 /* too big to allocate from stack */
66 mbuf
= kmalloc(_IOC_SIZE(cmd
),GFP_KERNEL
);
73 if (copy_from_user(parg
, (void __user
*)arg
, _IOC_SIZE(cmd
)))
79 mutex_lock(&dvbdev_mutex
);
80 if ((err
= func(file
, cmd
, parg
)) == -ENOIOCTLCMD
)
82 mutex_unlock(&dvbdev_mutex
);
87 /* Copy results into user buffer */
88 switch (_IOC_DIR(cmd
))
91 case (_IOC_WRITE
| _IOC_READ
):
92 if (copy_to_user((void __user
*)arg
, parg
, _IOC_SIZE(cmd
)))
102 long dvb_generic_ioctl(struct file
*file
,
103 unsigned int cmd
, unsigned long arg
)
105 struct dvb_device
*dvbdev
= file
->private_data
;
110 if (!dvbdev
->kernel_ioctl
)
113 return dvb_usercopy(file
, cmd
, arg
, dvbdev
->kernel_ioctl
);