lkml.org 
[lkml]   [2010]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] Repalce strncmp by memcmp
On 29.11.2010 17:58, Steven Rostedt wrote:
> On Mon, 2010-11-29 at 05:09 +0300, Pavel Vasilyev wrote:
>> This patch replace all strncmp(a, b, c) by memcmp(a, b, c).
> But these are not the same. strncmp() will stop when a or b hit a null.
> I'm not sure if memcmp() must do so, It may for some reason check
> anything within the memory of a+c-1 or b+c-1. What happens if a or b are
> right at the end of a vmalloc page, and is just a single character and
> null?
>
> x = vmalloc(32);
> strcpy(x, "some 31 byte string + null");
>
> call_func(x + 31);
>
> in call_func we have:
>
> call_func(char *a) {
>
> strncmp(a, "this is some big string", 23);
>
> With strncmp() when we hit a+1, it will stop comparing because a+1 is
> null. With memcmp there's no such guarantee. We can then take a kernel
> oops.
>
> That will be a nice thing to try to debug.
>
> Yes the above is contrived, but it demonstrates a possible problem with
> this conversion.
#include <stdio.h>
#include <errno.h>

char STR[5] = {'X','X','\0','X','X'};
char *XXX = "XX\0XX";

int main ()
{
int a, b;
a = memcmp (XXX, STR, 5);
b = strcmp (XXX, STR);
printf (": %d %d \n", a, b);
return 0;
}
./a.out
0 0

:)

#gdb ./a.out
(gdb) b main
Breakpoint 1 at 0x4005dc: file test.c, line 10.
(gdb) run
Starting program: /tmp/a.out

Breakpoint 1, main () at test.c:10
10 a = memcmp (STR, XXX, 5);
(gdb) print XXX
$1 = 0x400731 "XX"
(gdb) print STR
$2 = "XX\000XX"
....
Oops, variable XXX set to XX, var. STR not changed.
Seems to me, that they into strsmp() and memcmp() already gets without
the null character.

P.S.
pavel@suse64:/tmp> gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib64/gcc/x86_64-suse-linux/4.5/lto-wrapper
Target: x86_64-suse-linux
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info
--mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64
--enable-languages=c,c++,objc,fortran,obj-c++,java,ada
--enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.5
--enable-ssp --disable-libssp --disable-plugin
--with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux'
--disable-libgcj --disable-libmudflap --with-slibdir=/lib64
--with-system-zlib --enable-__cxa_atexit
--enable-libstdcxx-allocator=new --disable-libstdcxx-pch
--enable-version-specific-runtime-libs --program-suffix=-4.5
--enable-linux-futex --without-system-libunwind --enable-gold
--with-plugin-ld=/usr/bin/gold --with-arch-32=i586 --with-tune=generic
--build=x86_64-suse-linux
Thread model: posix
gcc version 4.5.1 20101116 [gcc-4_5-branch revision 166793] (SUSE Linux
--

Pavel.



\
 
 \ /
  Last update: 2010-11-29 20:43    [W:0.079 / U:0.028 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site