Skip to contentSkip to conversation

LKM, problem with simple char from string.

DISCUSSION authn 2 participants 2 messages Aug 16, 2004

lore
Share & tools
lore

authn

author
#0 lore raw

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

#1 lore raw

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