public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [char-misc-next 0/5] mei driver small fixes and cleanups
@ 2013-09-02  0:10 Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 1/5] mei: mei_cl_link protect open_handle_count from overflow Tomas Winkler
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Tomas Winkler @ 2013-09-02  0:10 UTC (permalink / raw)
  To: gregkh; +Cc: arnd, linux-kernel, Tomas Winkler


Alexander Usyskin (1):
  mei: mei_write correct checks for copy_from_user

Tomas Winkler (4):
  mei: mei_cl_link protect open_handle_count from overflow
  mei: make sure that me_clients_map big enough before copying
  mei: fix format compilation warrning on 32 bit architecture
  mei: revamp read and write length checks

 drivers/misc/mei/client.c |  6 ++++++
 drivers/misc/mei/hbm.c    |  7 +++++--
 drivers/misc/mei/main.c   | 23 +++++++++++++++++++----
 3 files changed, 30 insertions(+), 6 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [char-misc-next 1/5] mei: mei_cl_link protect open_handle_count from overflow
  2013-09-02  0:10 [char-misc-next 0/5] mei driver small fixes and cleanups Tomas Winkler
@ 2013-09-02  0:11 ` Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 2/5] mei: make sure that me_clients_map big enough before copying Tomas Winkler
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Tomas Winkler @ 2013-09-02  0:11 UTC (permalink / raw)
  To: gregkh; +Cc: arnd, linux-kernel, Tomas Winkler

mei_cl_link is called both from mei_open and also from
in-kernel drivers so we need to protect open_handle_count
from overflow

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/client.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
index e0684b4..a82b443 100644
--- a/drivers/misc/mei/client.c
+++ b/drivers/misc/mei/client.c
@@ -287,6 +287,12 @@ int mei_cl_link(struct mei_cl *cl, int id)
 		return -ENOENT;
 	}
 
+	if (dev->open_handle_count >= MEI_MAX_OPEN_HANDLE_COUNT) {
+		dev_err(&dev->pdev->dev, "open_handle_count exceded %d",
+			MEI_MAX_OPEN_HANDLE_COUNT);
+		return -ENOENT;
+	}
+
 	dev->open_handle_count++;
 
 	cl->host_client_id = id;
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [char-misc-next 2/5] mei: make sure that me_clients_map big enough before copying
  2013-09-02  0:10 [char-misc-next 0/5] mei driver small fixes and cleanups Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 1/5] mei: mei_cl_link protect open_handle_count from overflow Tomas Winkler
@ 2013-09-02  0:11 ` Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 3/5] mei: mei_write correct checks for copy_from_user Tomas Winkler
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Tomas Winkler @ 2013-09-02  0:11 UTC (permalink / raw)
  To: gregkh; +Cc: arnd, linux-kernel, Tomas Winkler

To make static analyzers happy validated that
sizeof me_clients_map  is larger than sizeof valid_addresses from the
enumeration response before memcpy
We can use BUILD_ON macro as both arrays are defined statically

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/hbm.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c
index 6127ab6..95d4dab 100644
--- a/drivers/misc/mei/hbm.c
+++ b/drivers/misc/mei/hbm.c
@@ -673,7 +673,10 @@ void mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
 
 	case HOST_ENUM_RES_CMD:
 		enum_res = (struct hbm_host_enum_response *) mei_msg;
-		memcpy(dev->me_clients_map, enum_res->valid_addresses, 32);
+		BUILD_BUG_ON(sizeof(dev->me_clients_map)
+				< sizeof(enum_res->valid_addresses));
+		memcpy(dev->me_clients_map, enum_res->valid_addresses,
+			sizeof(enum_res->valid_addresses));
 		if (dev->dev_state == MEI_DEV_INIT_CLIENTS &&
 		    dev->hbm_state == MEI_HBM_ENUM_CLIENTS) {
 				dev->init_clients_timer = 0;
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [char-misc-next 3/5] mei: mei_write correct checks for copy_from_user
  2013-09-02  0:10 [char-misc-next 0/5] mei driver small fixes and cleanups Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 1/5] mei: mei_cl_link protect open_handle_count from overflow Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 2/5] mei: make sure that me_clients_map big enough before copying Tomas Winkler
@ 2013-09-02  0:11 ` Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 4/5] mei: fix format compilation warrning on 32 bit architecture Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 5/5] mei: revamp read and write length checks Tomas Winkler
  4 siblings, 0 replies; 7+ messages in thread
From: Tomas Winkler @ 2013-09-02  0:11 UTC (permalink / raw)
  To: gregkh; +Cc: arnd, linux-kernel, Alexander Usyskin, Tomas Winkler

From: Alexander Usyskin <alexander.usyskin@intel.com>

1. return -EFUALT when copy_from_user fails
2. display error message on failure in error level

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/main.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 173ff09..5ff810b 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -404,8 +404,11 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
 		goto out;
 
 	rets = copy_from_user(write_cb->request_buffer.data, ubuf, length);
-	if (rets)
+	if (rets) {
+		dev_err(&dev->pdev->dev, "failed to copy data from userland\n");
+		rets = -EFAULT;
 		goto out;
+	}
 
 	if (cl == &dev->iamthif_cl) {
 		rets = mei_amthif_write(dev, write_cb);
@@ -567,7 +570,7 @@ static long mei_ioctl(struct file *file, unsigned int cmd, unsigned long data)
 	dev_dbg(&dev->pdev->dev, "copy connect data from user\n");
 	if (copy_from_user(connect_data, (char __user *)data,
 				sizeof(struct mei_connect_client_data))) {
-		dev_dbg(&dev->pdev->dev, "failed to copy data from userland\n");
+		dev_err(&dev->pdev->dev, "failed to copy data from userland\n");
 		rets = -EFAULT;
 		goto out;
 	}
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [char-misc-next 4/5] mei: fix format compilation warrning on 32 bit architecture
  2013-09-02  0:10 [char-misc-next 0/5] mei driver small fixes and cleanups Tomas Winkler
                   ` (2 preceding siblings ...)
  2013-09-02  0:11 ` [char-misc-next 3/5] mei: mei_write correct checks for copy_from_user Tomas Winkler
@ 2013-09-02  0:11 ` Tomas Winkler
  2013-09-02  0:11 ` [char-misc-next 5/5] mei: revamp read and write length checks Tomas Winkler
  4 siblings, 0 replies; 7+ messages in thread
From: Tomas Winkler @ 2013-09-02  0:11 UTC (permalink / raw)
  To: gregkh; +Cc: arnd, linux-kernel, Tomas Winkler

hbm.c: In function mei_hbm_me_cl_allocate:
hbm.c:52:212: warning: format %zd expects argument of type signed size_t but argument 4 has type long unsigned

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/hbm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c
index 95d4dab..f706fe8 100644
--- a/drivers/misc/mei/hbm.c
+++ b/drivers/misc/mei/hbm.c
@@ -45,7 +45,7 @@ static void mei_hbm_me_cl_allocate(struct mei_device *dev)
 	kfree(dev->me_clients);
 	dev->me_clients = NULL;
 
-	dev_dbg(&dev->pdev->dev, "memory allocation for ME clients size=%zd.\n",
+	dev_dbg(&dev->pdev->dev, "memory allocation for ME clients size=%ld.\n",
 		dev->me_clients_num * sizeof(struct mei_me_client));
 	/* allocate storage for ME clients representation */
 	clients = kcalloc(dev->me_clients_num,
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [char-misc-next 5/5] mei: revamp read and write length checks
  2013-09-02  0:10 [char-misc-next 0/5] mei driver small fixes and cleanups Tomas Winkler
                   ` (3 preceding siblings ...)
  2013-09-02  0:11 ` [char-misc-next 4/5] mei: fix format compilation warrning on 32 bit architecture Tomas Winkler
@ 2013-09-02  0:11 ` Tomas Winkler
  2013-09-26 15:22   ` Greg KH
  4 siblings, 1 reply; 7+ messages in thread
From: Tomas Winkler @ 2013-09-02  0:11 UTC (permalink / raw)
  To: gregkh; +Cc: arnd, linux-kernel, Tomas Winkler

1. Return zero on zero length read and writes
2. For a too large write return -EFBIG as defined in man write(2)
EFBIG  An attempt was made to write a file that
        exceeds the implementation-defined maximum
        file size or the process's file size limit,
        or to  write  at  a  position  past  the  maximum
        allowed offset.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/misc/mei/main.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 5ff810b..7404584 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -203,12 +203,18 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
 
 	dev = cl->dev;
 
+
 	mutex_lock(&dev->device_lock);
 	if (dev->dev_state != MEI_DEV_ENABLED) {
 		rets = -ENODEV;
 		goto out;
 	}
 
+	if (length == 0) {
+		rets = 0;
+		goto out;
+	}
+
 	if (cl == &dev->iamthif_cl) {
 		rets = mei_amthif_read(dev, file, ubuf, length, offset);
 		goto out;
@@ -350,8 +356,14 @@ static ssize_t mei_write(struct file *file, const char __user *ubuf,
 		rets = -ENODEV;
 		goto out;
 	}
-	if (length > dev->me_clients[id].props.max_msg_length || length <= 0) {
-		rets = -EMSGSIZE;
+
+	if (length == 0) {
+		rets = 0;
+		goto out;
+	}
+
+	if (length > dev->me_clients[id].props.max_msg_length) {
+		rets = -EFBIG;
 		goto out;
 	}
 
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [char-misc-next 5/5] mei: revamp read and write length checks
  2013-09-02  0:11 ` [char-misc-next 5/5] mei: revamp read and write length checks Tomas Winkler
@ 2013-09-26 15:22   ` Greg KH
  0 siblings, 0 replies; 7+ messages in thread
From: Greg KH @ 2013-09-26 15:22 UTC (permalink / raw)
  To: Tomas Winkler; +Cc: arnd, linux-kernel

On Mon, Sep 02, 2013 at 03:11:04AM +0300, Tomas Winkler wrote:
> 1. Return zero on zero length read and writes
> 2. For a too large write return -EFBIG as defined in man write(2)
> EFBIG  An attempt was made to write a file that
>         exceeds the implementation-defined maximum
>         file size or the process's file size limit,
>         or to  write  at  a  position  past  the  maximum
>         allowed offset.
> 
> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
> ---
>  drivers/misc/mei/main.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
> index 5ff810b..7404584 100644
> --- a/drivers/misc/mei/main.c
> +++ b/drivers/misc/mei/main.c
> @@ -203,12 +203,18 @@ static ssize_t mei_read(struct file *file, char __user *ubuf,
>  
>  	dev = cl->dev;
>  
> +
>  	mutex_lock(&dev->device_lock);

Not a big deal, but why the extra line?

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-09-26 15:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-02  0:10 [char-misc-next 0/5] mei driver small fixes and cleanups Tomas Winkler
2013-09-02  0:11 ` [char-misc-next 1/5] mei: mei_cl_link protect open_handle_count from overflow Tomas Winkler
2013-09-02  0:11 ` [char-misc-next 2/5] mei: make sure that me_clients_map big enough before copying Tomas Winkler
2013-09-02  0:11 ` [char-misc-next 3/5] mei: mei_write correct checks for copy_from_user Tomas Winkler
2013-09-02  0:11 ` [char-misc-next 4/5] mei: fix format compilation warrning on 32 bit architecture Tomas Winkler
2013-09-02  0:11 ` [char-misc-next 5/5] mei: revamp read and write length checks Tomas Winkler
2013-09-26 15:22   ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox