Re: [media] drivers:media:radio: wl128x: FM Driver Common sources

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jul 13, 2012 at 3:36 PM, Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote:
> On Fri, Jul 13, 2012 at 01:17:11PM -0500, halli manjunatha wrote:
>> On Fri, Jul 13, 2012 at 6:51 AM, Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote:
>> >
>> > Hello Manjunatha Halli,
>> >
>> > The patch e8454ff7b9a4: "[media] drivers:media:radio: wl128x: FM
>> > Driver Common sources" from Jan 11, 2011, leads to the following
>> > warning:
>> > drivers/media/radio/wl128x/fmdrv_common.c:596
>> > fm_irq_handle_flag_getcmd_resp()
>> >          error: untrusted 'fm_evt_hdr->dlen' is not capped properly
>> >
>> > [ this is on my private Smatch stuff with too many false positives for
>> >   general release ].
>> >
>> >    584  static void fm_irq_handle_flag_getcmd_resp(struct fmdev *fmdev)
>> >    585  {
>> >    586          struct sk_buff *skb;
>> >    587          struct fm_event_msg_hdr *fm_evt_hdr;
>> >    588
>> >    589          if (check_cmdresp_status(fmdev, &skb))
>> >    590                  return;
>> >    591
>> >    592          fm_evt_hdr = (void *)skb->data;
>> >    593
>> >    594          /* Skip header info and copy only response data */
>> >    595          skb_pull(skb, sizeof(struct fm_event_msg_hdr));
>> >    596          memcpy(&fmdev->irq_info.flag, skb->data,
>> > fm_evt_hdr->dlen);
>> >                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> >
>> >    597
>> >    598          fmdev->irq_info.flag = be16_to_cpu(fmdev->irq_info.flag);
>> >    599          fmdbg("irq: flag register(0x%x)\n", fmdev->irq_info.flag);
>> >    600
>> >    601          /* Continue next function in interrupt handler table */
>> >    602          fm_irq_call_stage(fmdev, FM_HW_MAL_FUNC_IDX);
>> >    603  }
>> >
>> > What are we copying here?  How do we know that ->dlen doesn't overflow
>> > the buffer?  Why do we memcpy() and the overwrite part of the data on
>> > the next line?
>>
>> Here I am trying to get the current value of the flag register which
>> is of maximum 16bit wide.
>>
>> So ->dlen value never overflow the buffer.
>>
>> In memcopy() case I am just trying to avoid 1 more variable so first I
>> memcopy the skb->data to  ->irq_info.flag then I will correct the
>> endianness of
>>
>> ->irq_info.flag in next line.
>>
>
> I am sorry but your email makes no sense at all.  This is a remote
> security hole because ->dlen is a u8 that is chosen from over the
> network.  The memcpy would let us copy over some function pointers
> in fmdev->irq_info->timer and use that to become root.
>
> ->dlen is not checked anywhere.
>
> You say it copies 16 bits of data (in other words ->dlen is a
> maximum of 2 (2 bytes).  fmdev->irq_info.flag is 16 bits.  In other
> words the memcpy() can be removed.
>
> Then you contradict yourself and say it copies other unspecified
> data as well.

Pardon my previous answer I didn’t checked the ->dlen.

Yes you are right ->dlen is just a u8 and flag is of 16 bits and I am
not checking the validity of ->dlen.

I will remove the memcpy() and submit the patch

Regards
manju
>
> Can someone else take a look?
>
> regards,
> dan carpenter



-- 
Regards
Halli
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux