lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <500E6597.2050402@mev.co.uk>
Date:	Tue, 24 Jul 2012 10:06:31 +0100
From:	Ian Abbott <abbotti@....co.uk>
To:	bforce1729 <bforce1729@...il.com>
CC:	linux-kernel@...r.kernel.org
Subject: Re: Need to know the size of data send from Kernel to USer Ap

On 2012-07-24 09:08, bforce1729 wrote:
> Hi,
>
> I am new to kernel programming so can anyone point me to the right
> forum/reply for the question below.
>
> I would like to implement a character device and using a node of type
> character  read and write data. However I am not sure of the length of
> data from kernel which a user app will receive, so I would like to code
> safely. If the data exceeds the application gets killed.
> Any idea or API to perform the task of knowing the data length when
> passing data to and fro from kernel to user level would be appreciated.
>
> Kernel code:
>
>                  copy_to_user(buff, kernel_msg, strlen(kernel_msg));
>
> User App:
>                  fd=open("./my_device",O_RDONLY);
> ret=read(fd,buff,strlen(buf));                        //How can I know
> the size of buff, which would be sent/filled from kernel???

I doubt you really want strlen(buf) there.  You probably want 
sizeof(buf) or something similar.  You might need to read up on what 
strlen() actually does.

Anyway, the driver's "read" file operation knows the maximum amount the 
user is asking for as it is specified in the third parameter.  The 
function should return the (non-negative) amount it is actually passing 
back to the user (which will be returned by the read() function in 
userspace), or a negative error value (which will cause read() to return 
-1 and set errno appropriately).

Also, copy_to_user() might not succeed if the user passed a bad pointer 
or bad length.  It returns 0 on success and the length of the uncopied 
part on failure.  So if copy_to_user() returns a non-zero value you 
should either return -EFAULT or work out the partial amount successfully 
read (as long as it is greater than zero) and return that.

-- 
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbotti@....co.uk>        )=-
-=( Tel: +44 (0)161 477 1898   FAX: +44 (0)161 718 3587         )=-
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ