sizeof(rq->cmd) does not return the size of cmd buffer in rq,
it will return the size of the pointer, i.e. 4 - on 32-bit systems,
and 8 - on 64-bit systems. This happens, because cmd is a pointer to
__cmd[BLK_MAX_CDB] in struct request in the kernel (see linux/blkdev.h):

        unsigned char __cmd[BLK_MAX_CDB];
        unsigned char *cmd;
        unsigned short cmd_len;

and is not a static buffer by itself.

Therefore on 32-bit systems 'sizeof(rq->cmd) - inter->cmd_len)' will be
'4 - 6', and this is not what we want.

Corrected this, so now we rely on inter->cmd containing  a null-terminated 
string,
and inter->cmd_len containing the exact number of bytes to store this string.

Signed-off-by: Stanislav Kholmanskikh <stanislav.kholmansk...@oracle.com>
---
 .../device-drivers/tbio/tbio_kernel/ltp_tbio.c     |   11 ++++++++---
 .../kernel/device-drivers/tbio/tbio_kernel/tbio.h  |    2 +-
 .../kernel/device-drivers/tbio/tbio_user/tbio.c    |    4 ++--
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/testcases/kernel/device-drivers/tbio/tbio_kernel/ltp_tbio.c 
b/testcases/kernel/device-drivers/tbio/tbio_kernel/ltp_tbio.c
index 4e38fe7..48cc588 100644
--- a/testcases/kernel/device-drivers/tbio/tbio_kernel/ltp_tbio.c
+++ b/testcases/kernel/device-drivers/tbio/tbio_kernel/ltp_tbio.c
@@ -85,14 +85,19 @@ static int send_request(struct request_queue *q, struct bio 
*bio,
                return -EFAULT;
        }
 
+       if ((!inter->cmd_len) || (inter->cmd_len > rq->cmd_len)) {
+               prk_err("invalid inter->cmd_len");
+               return -EFAULT;
+       }
+
        rq->cmd_len = inter->cmd_len;
 
        if (copy_from_user(rq->cmd, inter->cmd, inter->cmd_len))
                goto out_request;
 
-       if (sizeof(rq->cmd) != inter->cmd_len) {
-               memset(rq->cmd + inter->cmd_len, 0,
-                       sizeof(rq->cmd) - inter->cmd_len);
+       if (*(rq->cmd + rq->cmd_len - 1)) {
+               prk_err("rq->cmd is not null-terminated");
+               return -EFAULT;
        }
 
        rq->__sector = bio->bi_sector;
diff --git a/testcases/kernel/device-drivers/tbio/tbio_kernel/tbio.h 
b/testcases/kernel/device-drivers/tbio/tbio_kernel/tbio.h
index cf6df73..4cf0f46 100644
--- a/testcases/kernel/device-drivers/tbio/tbio_kernel/tbio.h
+++ b/testcases/kernel/device-drivers/tbio/tbio_kernel/tbio.h
@@ -66,6 +66,6 @@ struct tbio_interface {
        int data_len;   /* input data length */
        int direction;  /* read or write form DEV */
        char *cmd;      /* read or write */
-       int cmd_len;    /* length of cmd */
+       unsigned short cmd_len; /* length of cmd */
 };
 typedef struct tbio_interface tbio_interface_t;
diff --git a/testcases/kernel/device-drivers/tbio/tbio_user/tbio.c 
b/testcases/kernel/device-drivers/tbio/tbio_user/tbio.c
index 8249054..80c2665 100644
--- a/testcases/kernel/device-drivers/tbio/tbio_user/tbio.c
+++ b/testcases/kernel/device-drivers/tbio/tbio_user/tbio.c
@@ -212,14 +212,14 @@ int tbio_from_dev(int fd, int flag)
 
        bif.data_len = 1024;
        bif.direction = TBIO_FROM_DEV;
-       bif.cmd = SAFE_MALLOC(cleanup, 6);
+       bif.cmd = SAFE_MALLOC(cleanup, 5);
        if (bif.cmd == NULL) {
                tst_resm(TINFO, "malloc cmd space failed");
                free(bif.data);
                return -1;
        }
        strcpy(bif.cmd, "READ");
-       bif.cmd_len = 6;
+       bif.cmd_len = 5;
 
        rc = ioctl(fd, flag, &bif);
        if (rc) {
-- 
1.7.1


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to