Hi there,

My name is Shaobo He and I am a graduate student at University of Utah. I am using a static analysis tool to search for null pointer dereferences and came across a couple of potentially invalid memory accesses in the file drivers/media/v4l2-core/videobuf-core.c. Basically the expansion of the macro `CALL_PTR` is never examined although it can evaluate to NULL. The following is its definition and two uses:

#define CALLPTR(q, f, arg...)                                           \
        ((q->int_ops->f) ? q->int_ops->f(arg) : NULL)

static int __videobuf_copy_to_user(struct videobuf_queue *q,
                                   struct videobuf_buffer *buf,
                                   char __user *data, size_t count,
                                   int nonblocking)
{
        void *vaddr = CALLPTR(q, vaddr, buf);

        /* copy to userspace */
        if (count > buf->size - q->read_off)
                count = buf->size - q->read_off;

        if (copy_to_user(data, vaddr + q->read_off, count))
                return -EFAULT;

        return count;
}

static int __videobuf_copy_stream(struct videobuf_queue *q,
                                  struct videobuf_buffer *buf,
                                  char __user *data, size_t count, size_t pos,
                                  int vbihack, int nonblocking)
{
        unsigned int *fc = CALLPTR(q, vaddr, buf);

        if (vbihack) {
                /* dirty, undocumented hack -- pass the frame counter
                        * within the last four bytes of each vbi data block.
                        * We need that one to maintain backward compatibility
                        * to all vbi decoding software out there ... */
                fc += (buf->size >> 2) - 1;
                *fc = buf->field_count >> 1;
                dprintk(1, "vbihack: %d\n", *fc);
        }

        /* copy stuff using the common method */
        count = __videobuf_copy_to_user(q, buf, data, count, nonblocking);

        if ((count == -EFAULT) && (pos == 0))
                return -EFAULT;

        return count;
}

Both of the two functions could contain invalid memory accesses. The second function `__videobuf_copy_stream` is more problematic since if `buf-?size >> 2` evaluates to 1, which seems not totally impossible to me, then a NULL pointer dereference would occur.

Please let me know if it makes sense. Thanks for your time and I am looking forward to your reply.

Shaobo

Reply via email to