On Monday 24 March 2003 07:34 pm, Angelo Dell'Aera wanted us to know: > On Mon, 24 Mar 2003 19:06:52 +0530 > > "Omanakuttan" <omanakuttan@tataelxsi.co.in> wrote: > > Hi, > > I am trying to debug some code I have written. I could not understand > > some code in the kernel. > > function sys_create_module() in module.c > > As far as I understand the functionality is as follows. > > > > in this mod is defined as a struct module *. > > checks the user is capable of loading the module. > > locks the kernel. > > the module name is taken from userspace into the variable 'name', defined > > locally. > > memset the vmalloc-ed (module_map) pointer with zeros. > > set the size_of_struct to size of the module structure. > > Next statement > > mod->name = (char *) (mod + 1) ; puzzles me. > > what does this statement do? > > if my knowledge of C is corrrect, since mod is a pointer of type struct > > module , mod+1 will point to ((void *) &mod)+(sizeof (*mod)), which is an > > invalid pointer here. > > Then how does this piece of code work? > > any idea? > > Quite simple. Let's see it.. > [..] > if ((namelen = get_mod_name(name_user, &name)) < 0) { > error = namelen; > goto err0; > } > if (size < sizeof(struct module)+namelen) { > error = -EINVAL; > goto err1; > } > > As you can see, size can't be less than sizeof(struct module)+ namelen so > you are vmalloc'ing enough space for a (struct module) and LKM name. > > [..] > memset(mod, 0, sizeof(*mod)); > mod->size_of_struct = sizeof(*mod); > mod->name = (char *)(mod + 1); > > Now mod->name points to the first char below struct module.... > > mod->size = size; > memcpy((char*)(mod+1), name, namelen+1); > > .... and you memcpy module name just there. Thanks, In my hurry, I overlooked this. Thanks a lot. -- ------------------------------------------------------ "why shall I be afraid now? strange men have always come to kill me ever since I was twelve years of age" -- vito corleone, The godfather. -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/