diff mbox

[1/2] nfs4-acl-tools: Fix segfault if format of the input file is incorrect

Message ID 1311280507-28957-1-git-send-email-malahal@us.ibm.com (mailing list archive)
State New, archived
Headers show

Commit Message

malahal naineni July 21, 2011, 8:35 p.m. UTC
The sizeof operator, when applied to a parameter declared to have array,
yields the size of the adjusted (pointer) type, even if the parameter
declaration specifies a length.

Signed-off-by: Malahal Naineni <malahal@us.ibm.com>
---
 libnfs4acl/nfs4_ace_from_string.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Comments

jvrao July 26, 2011, 6:54 a.m. UTC | #1
On 07/21/2011 01:35 PM, Malahal Naineni wrote:
> The sizeof operator, when applied to a parameter declared to have array,
> yields the size of the adjusted (pointer) type, even if the parameter
> declaration specifies a length.
>
> Signed-off-by: Malahal Naineni<malahal-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> ---
>   libnfs4acl/nfs4_ace_from_string.c |    2 +-
>   1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/libnfs4acl/nfs4_ace_from_string.c b/libnfs4acl/nfs4_ace_from_string.c
> index 9d877fb..462fcc0 100644
> --- a/libnfs4acl/nfs4_ace_from_string.c
> +++ b/libnfs4acl/nfs4_ace_from_string.c
> @@ -100,7 +100,7 @@ parse_alloc_fields(char *buf, char *fields[NUMFIELDS])
>   	if (!buf)
>   		return -EINVAL;
>
> -	memset(fields, 0, sizeof(fields));
> +	memset(fields, 0, sizeof(char *) * NUMFIELDS);
>
>   	for (i = 0; buf[i] != '\0'; i++) {
>   		if (buf[i] == ':')

Could it be compiler specific? It is working fine for me


Test]$ cat sizeof.c
===========
#include <stdio.h>
#define NUMFIELDS 10
main()
{
	char *fields1[NUMFIELDS];
	char fields2[NUMFIELDS];

	printf("sizeof(fields1):%d sizeof(char *)*NUMFIELDS:%d\n", 
sizeof(fields1), sizeof(char *)*NUMFIELDS);
	printf("sizeof(fields2):%d sizeof(char)*NUMFIELDS:%d\n", 
sizeof(fields2), sizeof(char)*NUMFIELDS);
}
============

[jvrao Test]$ make sizeof
cc     sizeof.c   -o sizeof
[jvrao Test]$ ./sizeof
sizeof(fields1):80 sizeof(char *)*NUMFIELDS:80
sizeof(fields2):10 sizeof(char)*NUMFIELDS:10


[jvrao Test]$ cc -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man 
--infodir=/usr/share/info 
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap 
--enable-shared --enable-threads=posix --enable-checking=release 
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions 
--enable-gnu-unique-object 
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada 
--enable-java-awt=gtk --disable-dssi 
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre 
--enable-libgcj-multifile --enable-java-maintainer-mode 
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar 
--disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic 
--with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC)










--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
malahal naineni July 26, 2011, 5:58 p.m. UTC | #2
Venkateswararao Jujjuri [jvrao@linux.vnet.ibm.com] wrote:
> 
> On 07/21/2011 01:35 PM, Malahal Naineni wrote:
> >The sizeof operator, when applied to a parameter declared to have array,
> >yields the size of the adjusted (pointer) type, even if the parameter
> >declaration specifies a length.
> >
> >---
> >  libnfs4acl/nfs4_ace_from_string.c |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> >
> >diff --git a/libnfs4acl/nfs4_ace_from_string.c b/libnfs4acl/nfs4_ace_from_string.c
> >index 9d877fb..462fcc0 100644
> >--- a/libnfs4acl/nfs4_ace_from_string.c
> >+++ b/libnfs4acl/nfs4_ace_from_string.c
> >@@ -100,7 +100,7 @@ parse_alloc_fields(char *buf, char *fields[NUMFIELDS])
> >  	if (!buf)
> >  		return -EINVAL;
> >
> >-	memset(fields, 0, sizeof(fields));
> >+	memset(fields, 0, sizeof(char *) * NUMFIELDS);
> >
> >  	for (i = 0; buf[i] != '\0'; i++) {
> >  		if (buf[i] == ':')
> 
> Could it be compiler specific? It is working fine for me
> 
> 
> Test]$ cat sizeof.c
> ===========
> #include <stdio.h>
> #define NUMFIELDS 10
> main()
> {
> 	char *fields1[NUMFIELDS];
> 	char fields2[NUMFIELDS];
> 
> 	printf("sizeof(fields1):%d sizeof(char *)*NUMFIELDS:%d\n",
> sizeof(fields1), sizeof(char *)*NUMFIELDS);
> 	printf("sizeof(fields2):%d sizeof(char)*NUMFIELDS:%d\n",
> sizeof(fields2), sizeof(char)*NUMFIELDS);
> }

It works as expected in the definition scope. It doesn't work "when
applied to a parameter declared to have array". It looks like, this is
part of the C99 spec, so can't be compiler specific. Try this:

static void fun(char *a[10])
{
 	printf("sizeof returned: %d\n", sizeof(a));
}
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
J. Bruce Fields Aug. 5, 2011, 8:05 p.m. UTC | #3
Apologies for the delay; both patches (and some minor git-related
cleanup) applied and pushed out to

	git://linux-nfs.org/~bfields/nfs4-acl-tools.git

--b.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
malahal naineni Aug. 5, 2011, 8:50 p.m. UTC | #4
J. Bruce Fields [bfields@fieldses.org] wrote:
> Apologies for the delay; both patches (and some minor git-related
> cleanup) applied and pushed out to
> 
> 	git://linux-nfs.org/~bfields/nfs4-acl-tools.git
> 
> --b.

Thank you Bruce!
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/libnfs4acl/nfs4_ace_from_string.c b/libnfs4acl/nfs4_ace_from_string.c
index 9d877fb..462fcc0 100644
--- a/libnfs4acl/nfs4_ace_from_string.c
+++ b/libnfs4acl/nfs4_ace_from_string.c
@@ -100,7 +100,7 @@  parse_alloc_fields(char *buf, char *fields[NUMFIELDS])
 	if (!buf)
 		return -EINVAL;
 
-	memset(fields, 0, sizeof(fields));
+	memset(fields, 0, sizeof(char *) * NUMFIELDS);
 
 	for (i = 0; buf[i] != '\0'; i++) {
 		if (buf[i] == ':')