Re: [PATCH] USB: console: fix potential use after free

2015-02-15 Thread Ben Hutchings
On Wed, 2015-02-11 at 14:55 +0800, Johan Hovold wrote:
 On Tue, Feb 10, 2015 at 08:39:26PM +, Ben Hutchings wrote:
  On Mon, 2015-01-05 at 16:04 +0100, Johan Hovold wrote:
   Use tty kref to release the fake tty in usb_console_setup to avoid use
   after free if the underlying serial driver has acquired a reference.
   
   Note that using the tty destructor release_one_tty requires some more
   state to be initialised.
  [...]
   --- a/drivers/usb/serial/console.c
   +++ b/drivers/usb/serial/console.c
  [...]
   @@ -137,14 +139,17 @@ static int usb_console_setup(struct console *co, 
   char *options)
 goto reset_open_count;
 }
 kref_init(tty-kref);
   - tty_port_tty_set(port-port, tty);
 tty-driver = usb_serial_tty_driver;
 tty-index = co-index;
 init_ldsem(tty-ldisc_sem);
   + INIT_LIST_HEAD(tty-tty_files);
   + kref_get(tty-driver-kref);
   + tty-ops = usb_console_fake_tty_ops;
  [...]
  
  Do we also need:
  __module_get(tty-driver-owner);
  or am I missing something?
 
 When the console setup code is running, and while the console is open,
 everything is pinned through a reference to the usb-serial-driver module
 (the tty layer also pins usb-serial core directly).

 We should be holding a reference to the usb-serial driver module (which
 in turns pins usb-serial core, which is the tty driver) for when the
 console isn't open as well, although that is not directly related to the
 fix in question.

Sure, but release_one_tty() expects that the tty has a reference to the
module and it will drop that reference.  (Normally tty_init_dev() takes
that reference.)  I think that means that for a USB serial console we
take one reference to the module when setting up but drop two references
when cleaning up.

Ben.

 Yes, the USB console is a bit of a hack.


-- 
Ben Hutchings
Never attribute to conspiracy what can adequately be explained by stupidity.


signature.asc
Description: This is a digitally signed message part


Re: [PATCH] USB: console: fix potential use after free

2015-02-15 Thread Johan Hovold
On Mon, Feb 16, 2015 at 03:49:17AM +, Ben Hutchings wrote:
 On Wed, 2015-02-11 at 14:55 +0800, Johan Hovold wrote:
  On Tue, Feb 10, 2015 at 08:39:26PM +, Ben Hutchings wrote:
   On Mon, 2015-01-05 at 16:04 +0100, Johan Hovold wrote:
Use tty kref to release the fake tty in usb_console_setup to avoid use
after free if the underlying serial driver has acquired a reference.

Note that using the tty destructor release_one_tty requires some more
state to be initialised.
   [...]
--- a/drivers/usb/serial/console.c
+++ b/drivers/usb/serial/console.c
   [...]
@@ -137,14 +139,17 @@ static int usb_console_setup(struct console *co, 
char *options)
goto reset_open_count;
}
kref_init(tty-kref);
-   tty_port_tty_set(port-port, tty);
tty-driver = usb_serial_tty_driver;
tty-index = co-index;
init_ldsem(tty-ldisc_sem);
+   INIT_LIST_HEAD(tty-tty_files);
+   kref_get(tty-driver-kref);
+   tty-ops = usb_console_fake_tty_ops;
   [...]
   
   Do we also need:
 __module_get(tty-driver-owner);
   or am I missing something?
  
  When the console setup code is running, and while the console is open,
  everything is pinned through a reference to the usb-serial-driver module
  (the tty layer also pins usb-serial core directly).
 
  We should be holding a reference to the usb-serial driver module (which
  in turns pins usb-serial core, which is the tty driver) for when the
  console isn't open as well, although that is not directly related to the
  fix in question.
 
 Sure, but release_one_tty() expects that the tty has a reference to the
 module and it will drop that reference.  (Normally tty_init_dev() takes
 that reference.)  I think that means that for a USB serial console we
 take one reference to the module when setting up but drop two references
 when cleaning up.

Ah, but the tty-driver owner will be null as usb-serial has to be
compiled in to enable the usb console (and therefore the point I made
above about a missing reference is also moot).

So nothing is leaking, but I should probably add a comment or a call to
__module_get() nonetheless to make this clear.

  Yes, the USB console is a bit of a hack.

Thanks,
Johan
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] USB: console: fix potential use after free

2015-02-10 Thread Ben Hutchings
On Mon, 2015-01-05 at 16:04 +0100, Johan Hovold wrote:
 Use tty kref to release the fake tty in usb_console_setup to avoid use
 after free if the underlying serial driver has acquired a reference.
 
 Note that using the tty destructor release_one_tty requires some more
 state to be initialised.
[...]
 --- a/drivers/usb/serial/console.c
 +++ b/drivers/usb/serial/console.c
[...]
 @@ -137,14 +139,17 @@ static int usb_console_setup(struct console *co, char 
 *options)
   goto reset_open_count;
   }
   kref_init(tty-kref);
 - tty_port_tty_set(port-port, tty);
   tty-driver = usb_serial_tty_driver;
   tty-index = co-index;
   init_ldsem(tty-ldisc_sem);
 + INIT_LIST_HEAD(tty-tty_files);
 + kref_get(tty-driver-kref);
 + tty-ops = usb_console_fake_tty_ops;
[...]

Do we also need:
__module_get(tty-driver-owner);
or am I missing something?

Ben.

-- 
Ben Hutchings
I say we take off; nuke the site from orbit.  It's the only way to be sure.


signature.asc
Description: This is a digitally signed message part


Re: [PATCH] USB: console: fix potential use after free

2015-02-10 Thread Johan Hovold
On Tue, Feb 10, 2015 at 08:39:26PM +, Ben Hutchings wrote:
 On Mon, 2015-01-05 at 16:04 +0100, Johan Hovold wrote:
  Use tty kref to release the fake tty in usb_console_setup to avoid use
  after free if the underlying serial driver has acquired a reference.
  
  Note that using the tty destructor release_one_tty requires some more
  state to be initialised.
 [...]
  --- a/drivers/usb/serial/console.c
  +++ b/drivers/usb/serial/console.c
 [...]
  @@ -137,14 +139,17 @@ static int usb_console_setup(struct console *co, char 
  *options)
  goto reset_open_count;
  }
  kref_init(tty-kref);
  -   tty_port_tty_set(port-port, tty);
  tty-driver = usb_serial_tty_driver;
  tty-index = co-index;
  init_ldsem(tty-ldisc_sem);
  +   INIT_LIST_HEAD(tty-tty_files);
  +   kref_get(tty-driver-kref);
  +   tty-ops = usb_console_fake_tty_ops;
 [...]
 
 Do we also need:
   __module_get(tty-driver-owner);
 or am I missing something?

When the console setup code is running, and while the console is open,
everything is pinned through a reference to the usb-serial-driver module
(the tty layer also pins usb-serial core directly).

We should be holding a reference to the usb-serial driver module (which
in turns pins usb-serial core, which is the tty driver) for when the
console isn't open as well, although that is not directly related to the
fix in question.

Yes, the USB console is a bit of a hack.

Johan
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html