uwb: properly check kthread_run return value

Message ID 1531223353-13437-2-git-send-email-paolo.pisati@canonical.com
State New
Headers show
Series
  • uwb: properly check kthread_run return value
Related show

Commit Message

Paolo Pisati July 10, 2018, 11:49 a.m.
From: Andrey Konovalov <andreyknvl@google.com>

uwbd_start() calls kthread_run() and checks that the return value is
not NULL. But the return value is not NULL in case kthread_run() fails,
it takes the form of ERR_PTR(-EINTR).

Use IS_ERR() instead.

Also add a check to uwbd_stop().

Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit bbf26183b7a6236ba602f4d6a2f7cade35bba043)
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
---
 drivers/uwb/uwbd.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

Comments

Stefan Bader July 19, 2018, 12:23 p.m. | #1
On 10.07.2018 13:49, Paolo Pisati wrote:
> From: Andrey Konovalov <andreyknvl@google.com>
> 
> uwbd_start() calls kthread_run() and checks that the return value is
> not NULL. But the return value is not NULL in case kthread_run() fails,
> it takes the form of ERR_PTR(-EINTR).
> 
> Use IS_ERR() instead.
> 
> Also add a check to uwbd_stop().
> 
> Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
> Cc: stable <stable@vger.kernel.org>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> (cherry picked from commit bbf26183b7a6236ba602f4d6a2f7cade35bba043)
> Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
> ---
>  drivers/uwb/uwbd.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/uwb/uwbd.c b/drivers/uwb/uwbd.c
> index bdcb13c..5c98283 100644
> --- a/drivers/uwb/uwbd.c
> +++ b/drivers/uwb/uwbd.c
> @@ -303,18 +303,22 @@ static int uwbd(void *param)
>  /** Start the UWB daemon */
>  void uwbd_start(struct uwb_rc *rc)
>  {
> -	rc->uwbd.task = kthread_run(uwbd, rc, "uwbd");
> -	if (rc->uwbd.task == NULL)
> +	struct task_struct *task = kthread_run(uwbd, rc, "uwbd");
> +	if (IS_ERR(task)) {
> +		rc->uwbd.task = NULL;
>  		printk(KERN_ERR "UWB: Cannot start management daemon; "
>  		       "UWB won't work\n");
> -	else
> +	} else {
> +		rc->uwbd.task = task;
>  		rc->uwbd.pid = rc->uwbd.task->pid;
> +	}
>  }
>  
>  /* Stop the UWB daemon and free any unprocessed events */
>  void uwbd_stop(struct uwb_rc *rc)
>  {
> -	kthread_stop(rc->uwbd.task);
> +	if (rc->uwbd.task)
> +		kthread_stop(rc->uwbd.task);
>  	uwbd_flush(rc);
>  }
>  
>
Juerg Haefliger July 23, 2018, 12:20 p.m. | #2
On 07/10/2018 01:49 PM, Paolo Pisati wrote:
> From: Andrey Konovalov <andreyknvl@google.com>

Added missing CVE line.


> uwbd_start() calls kthread_run() and checks that the return value is
> not NULL. But the return value is not NULL in case kthread_run() fails,
> it takes the form of ERR_PTR(-EINTR).
> 
> Use IS_ERR() instead.
> 
> Also add a check to uwbd_stop().
> 
> Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
> Cc: stable <stable@vger.kernel.org>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> (cherry picked from commit bbf26183b7a6236ba602f4d6a2f7cade35bba043)
> Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>

Signed-off-by: Juerg Haefliger <juergh@canonical.com>

Applied to trusty master-next.

...Juerg


> ---
>  drivers/uwb/uwbd.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/uwb/uwbd.c b/drivers/uwb/uwbd.c
> index bdcb13c..5c98283 100644
> --- a/drivers/uwb/uwbd.c
> +++ b/drivers/uwb/uwbd.c
> @@ -303,18 +303,22 @@ static int uwbd(void *param)
>  /** Start the UWB daemon */
>  void uwbd_start(struct uwb_rc *rc)
>  {
> -	rc->uwbd.task = kthread_run(uwbd, rc, "uwbd");
> -	if (rc->uwbd.task == NULL)
> +	struct task_struct *task = kthread_run(uwbd, rc, "uwbd");
> +	if (IS_ERR(task)) {
> +		rc->uwbd.task = NULL;
>  		printk(KERN_ERR "UWB: Cannot start management daemon; "
>  		       "UWB won't work\n");
> -	else
> +	} else {
> +		rc->uwbd.task = task;
>  		rc->uwbd.pid = rc->uwbd.task->pid;
> +	}
>  }
>  
>  /* Stop the UWB daemon and free any unprocessed events */
>  void uwbd_stop(struct uwb_rc *rc)
>  {
> -	kthread_stop(rc->uwbd.task);
> +	if (rc->uwbd.task)
> +		kthread_stop(rc->uwbd.task);
>  	uwbd_flush(rc);
>  }
>  
>

Patch

diff --git a/drivers/uwb/uwbd.c b/drivers/uwb/uwbd.c
index bdcb13c..5c98283 100644
--- a/drivers/uwb/uwbd.c
+++ b/drivers/uwb/uwbd.c
@@ -303,18 +303,22 @@  static int uwbd(void *param)
 /** Start the UWB daemon */
 void uwbd_start(struct uwb_rc *rc)
 {
-	rc->uwbd.task = kthread_run(uwbd, rc, "uwbd");
-	if (rc->uwbd.task == NULL)
+	struct task_struct *task = kthread_run(uwbd, rc, "uwbd");
+	if (IS_ERR(task)) {
+		rc->uwbd.task = NULL;
 		printk(KERN_ERR "UWB: Cannot start management daemon; "
 		       "UWB won't work\n");
-	else
+	} else {
+		rc->uwbd.task = task;
 		rc->uwbd.pid = rc->uwbd.task->pid;
+	}
 }
 
 /* Stop the UWB daemon and free any unprocessed events */
 void uwbd_stop(struct uwb_rc *rc)
 {
-	kthread_stop(rc->uwbd.task);
+	if (rc->uwbd.task)
+		kthread_stop(rc->uwbd.task);
 	uwbd_flush(rc);
 }