[PATCH 0/9] avoid mixing __user and kernel pointers

Ian Abbott abbotti at mev.co.uk
Wed Sep 19 18:37:34 UTC 2012


Revert the patch that removes the `__user` tag from pointer members of
`struct comedi_cmd` because it's a useful tag to have.  There are two
pointer members, `chanlist` and `data`, but `data` isn't actually used
for anything currently.  `chanlist` points to a channel list, but can be
`NULL` when "testing" a command with the `COMEDI_CMDTEST` ioctl.

We want to avoid using the `chanlist` pointer in `struct comedi_cmd` to
point to kernel-space memory as that conflicts with the `__user` tag.
Instead, use the following approach:

(a) Add a parameter to all the `do_cmdtest()` handlers to pass a
pointer to the kernel copy of the channel list (and change the handlers
to use it instead of the one in the `struct comedi_cmd`).

(b) Add a `chanlist` member to `struct comedi_async` to point to the
kernel copy of the channel list. Change the `do_cmd()` handlers (and
related functions) in the low-level drivers to use this pointer to
access the channel list.

There are a few other things I noticed on the way that needed fixing,
that are included in this series of patches.  Patches 4 and 9 contain
the "meat" of this series and are the longest of the patches.

Patch 1) Revert "staging: comedi: comedi.h: remove __user tag from
         chanlist"
Patch 2) staging: comedi: remove unneeded chanlist pointer casts
Patch 3) staging: comedi: ni_labpc: pass ai scan mode through various
         functions
Patch 4) staging: comedi: add chanlist to do_cmdtest() handlers
Patch 5) staging: comedi: fix memory leak for saved channel list
Patch 6) staging: comedi: das16: pass struct comedi_cmd by reference
Patch 7) staging: comedi: das1800: don't pass struct comedi_cmd by value
Patch 8) staging: comedi: ni_labpc: don't pass struct comedi_cmd by
         value
Patch 9) staging: comedi: put command channel list in async structure

Confession time:  Patch 9 contains a couple of overlength lines in
"pcmmio.c" and "pcmuio.c" which I'm too tired to fix right now, but I
haven't made them any worse than they are already!  (The affected
functions need a lot of refactoring - some of the lines have indentation
that *starts* beyond column 80!)

 drivers/staging/comedi/comedi.h                    |   2 +-
 drivers/staging/comedi/comedi_fops.c               |  30 ++--
 drivers/staging/comedi/comedidev.h                 |   3 +-
 drivers/staging/comedi/drivers/8255.c              |   3 +-
 .../staging/comedi/drivers/addi-data/addi_common.h |   2 +-
 .../comedi/drivers/addi-data/hwdrv_apci3120.c      |  36 +++--
 .../comedi/drivers/addi-data/hwdrv_apci3120.h      |   6 +-
 .../comedi/drivers/addi-data/hwdrv_apci3200.c      |  55 +++----
 .../comedi/drivers/addi-data/hwdrv_apci3200.h      |   6 +-
 drivers/staging/comedi/drivers/adl_pci9111.c       |  20 +--
 drivers/staging/comedi/drivers/adl_pci9118.c       |  15 +-
 drivers/staging/comedi/drivers/adv_pci1710.c       |  15 +-
 drivers/staging/comedi/drivers/amplc_dio200.c      |  12 +-
 drivers/staging/comedi/drivers/amplc_pc236.c       |   3 +-
 drivers/staging/comedi/drivers/amplc_pci224.c      |  24 +--
 drivers/staging/comedi/drivers/amplc_pci230.c      |  61 +++----
 drivers/staging/comedi/drivers/cb_das16_cs.c       |   3 +-
 drivers/staging/comedi/drivers/cb_pcidas.c         |  41 ++---
 drivers/staging/comedi/drivers/cb_pcidas64.c       | 117 +++++++-------
 drivers/staging/comedi/drivers/cb_pcidda.c         |   3 +-
 drivers/staging/comedi/drivers/comedi_parport.c    |   3 +-
 drivers/staging/comedi/drivers/comedi_test.c       |  10 +-
 drivers/staging/comedi/drivers/das16.c             |  37 ++---
 drivers/staging/comedi/drivers/das16m1.c           |  12 +-
 drivers/staging/comedi/drivers/das1800.c           |  92 ++++++-----
 drivers/staging/comedi/drivers/das800.c            |  21 +--
 drivers/staging/comedi/drivers/dmm32at.c           |  23 +--
 drivers/staging/comedi/drivers/dt2814.c            |   9 +-
 drivers/staging/comedi/drivers/dt282x.c            |  14 +-
 drivers/staging/comedi/drivers/dt3000.c            |  13 +-
 drivers/staging/comedi/drivers/gsc_hpdi.c          |  12 +-
 drivers/staging/comedi/drivers/me4000.c            |  46 +++---
 drivers/staging/comedi/drivers/me_daq.c            |   3 +-
 drivers/staging/comedi/drivers/ni_6527.c           |   3 +-
 drivers/staging/comedi/drivers/ni_65xx.c           |   3 +-
 drivers/staging/comedi/drivers/ni_660x.c           |   5 +-
 drivers/staging/comedi/drivers/ni_at_a2150.c       |  22 +--
 drivers/staging/comedi/drivers/ni_atmio16d.c       |  11 +-
 drivers/staging/comedi/drivers/ni_labpc.c          | 180 +++++++++++----------
 drivers/staging/comedi/drivers/ni_mio_common.c     |  58 ++++---
 drivers/staging/comedi/drivers/ni_pcidio.c         |   6 +-
 drivers/staging/comedi/drivers/ni_tio.h            |   3 +-
 drivers/staging/comedi/drivers/ni_tiocmd.c         |   3 +-
 drivers/staging/comedi/drivers/pcl711.c            |   9 +-
 drivers/staging/comedi/drivers/pcl812.c            |   9 +-
 drivers/staging/comedi/drivers/pcl816.c            |  29 ++--
 drivers/staging/comedi/drivers/pcl818.c            |  28 ++--
 drivers/staging/comedi/drivers/pcm_common.c        |   3 +-
 drivers/staging/comedi/drivers/pcm_common.h        |   3 +-
 drivers/staging/comedi/drivers/pcmmio.c            |  21 +--
 drivers/staging/comedi/drivers/pcmuio.c            |  21 +--
 drivers/staging/comedi/drivers/quatech_daqp_cs.c   |   9 +-
 drivers/staging/comedi/drivers/rtd520.c            |  12 +-
 drivers/staging/comedi/drivers/s626.c              |  26 +--
 drivers/staging/comedi/drivers/skel.c              |   6 +-
 drivers/staging/comedi/drivers/usbdux.c            |  21 ++-
 drivers/staging/comedi/drivers/usbduxfast.c        |  27 ++--
 drivers/staging/comedi/drivers/usbduxsigma.c       |  16 +-
 58 files changed, 710 insertions(+), 576 deletions(-)



More information about the devel mailing list