LKM, problem with simple char from string.
Hello,
I am coding a linux kernel module and have problem with some string from user space (from execve system call). There is no problem with useing this string as a one, for example printk(KERN_ALERT "%s", string) works fine. Problem appears when i want to printk or compare single char, in first case it is printked with some extra '<1>' and in second case, when i compare it with other one, it doesnt fit to real char (it is "connected" with '<1>' in some way ?). I tried to copy it to kmalloced buffer:
if ((k_space=(char *)kmalloc(len, GFP_KERNEL))==NULL)
return -1;
memcpy_fromfs((void *)k_space, (void *)argv[argc], len);
but then playing with k_space[i] was the same.
Short code from module:
if ((k_space=(char *)kmalloc(len, GFP_KERNEL))==NULL)
return -1;
memset(k_space, '\0', sizeof(k_space));
memcpy_fromfs((char *)k_space, (char *)argv[argc], len);
printk(KERN_ALERT"%s\n", k_space);
printk(KERN_ALERT "%c\n",k_space[i]);And then i ll have in log file string (from first printk call) and char with <1> (from second printk call). It doesnt let me to compare chars. What it happens ?
Regards,
apacz
On Mon, 16 Aug 2004 12:31:51 +0200 authn wrote:
| Hello, | I am coding a linux kernel module and have problem with some string from user | space (from execve system call). There is no problem with useing this string | as a one, for example printk(KERN_ALERT "%s", string) works fine. | Problem appears when i want to printk or compare single char, in first case it | is printked with some extra '<1>' and in second case, when i compare it with | other one, it doesnt fit to real char (it is "connected" with '<1>' in some | way ?). I tried to copy it to kmalloced buffer: | | if ((k_space=(char *)kmalloc(len, GFP_KERNEL))==NULL) | return -1; | memcpy_fromfs((void *)k_space, (void *)argv[argc], len); | | but then playing with k_space[i] was the same. | Short code from module: | if ((k_space=(char *)kmalloc(len, GFP_KERNEL))==NULL) | return -1; | memset(k_space, '\0', sizeof(k_space));
I don't think that this is the main problem, but sizeof(k_space) here is just the sizeof a pointer (I guess, can't see entire source code), like 4 or 8.
| memcpy_fromfs((char *)k_space, (char *)argv[argc], len); | printk(KERN_ALERT"%s\n", k_space); | printk(KERN_ALERT "%c\n",k_space[i]); | And then i ll have in log file string (from first printk call) and char with | <1> (from second printk call). It doesnt let me to compare chars. | What it happens ?
--
~Randy