Re: discussion [patch] /lib/kobject.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 10 Mar 2010, walter harms wrote:

> 
> 
> Julia Lawall schrieb:
> >> @julia:
> >> i did not check but i can imagine that the pattern
> >> A=kmalloc() ... sprintf(a," ",b);
> >>
> >> come up at some points inside the kernel since a lot of programmers
> >> do not know about asprint().
> > 
> > I came up with the following.  Does it seem ok aside from the stray line 
> > over 80 characters?
> > 
> > If it look slike it is going in the right direction, I will make a proer 
> > patch.  The thing one could be worried about is if the buffer is used for 
> > something else, that requires a larger size than that of the string.  I 
> > haven't yet looked into that.
> > 
> 
> Hi Julia,
> IMHO this is a big improvement.
> 1. it is easy to understand
> 1a. the real janitor work now can start, like cleaning statements as shown below
> 2. strange calculations of length is avoided
> 2a. simple changes do not cause an overflow anymore
> 3. this will actually reduce codesize (only by a few bytes but that does not matter)

Thanks for the feedback.  I will look into making a proper patch.

julia


> I do not thing that reuse of the buffer is a problem, i would prefer
> a policy that uses "%99s" to avoid potential attacks if the source
> is exposed to userspace somehow. (i thing 99.99% of programmer can live
> with that).
> 
> btw: i did  CC the mail to the janitor-ml. I am a janitor only and it is better
> to have more eyes on the code and make a broader discussion; involving people who
> can actually make a  commit.
> 
> NTL your patch was very fast !
> 
> re,
>  wh
> 
> 
> 
> /parport/share.c
> name = kasprintf(GFP_KERNEL, "parport%d", tmp->portnum = tmp->number);
> 
> cachefiles/key.c
> key = kasprintf(GFP_KERNEL, "@%02x%c+", (unsigned)csum, 0);
> /* not to mention the len=0 ;...; len=5 what shows up now. */
> 
> > julia
> > 
> > diff -u -p a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
> > --- a/arch/ia64/pci/pci.c 2010-03-01 07:52:48.000000000 +0100
> > +++ b/arch/ia64/pci/pci.c 2010-03-09 23:32:51.000000000 +0100
> > @@ -366,11 +366,10 @@ pci_acpi_scan_root(struct acpi_device *d
> >  		if (!controller->window)
> >  			goto out2;
> >  
> > -		name = kmalloc(16, GFP_KERNEL);
> > +		name = kasprintf(GFP_KERNEL, "PCI Bus %04x:%02x", domain, bus);
> >  		if (!name)
> >  			goto out3;
> >  
> > -		sprintf(name, "PCI Bus %04x:%02x", domain, bus);
> >  		info.bridge = device;
> >  		info.controller = controller;
> >  		info.name = name;
> > diff -u -p a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
> > --- a/arch/powerpc/platforms/pseries/dlpar.c 2010-01-20 13:04:05.000000000 +0100
> > +++ b/arch/powerpc/platforms/pseries/dlpar.c 2010-03-09 23:32:45.000000000 +0100
> > @@ -78,13 +78,12 @@ static struct device_node *dlpar_parse_c
> >  	 * prepend this to the full_name.
> >  	 */
> >  	name = (char *)ccwa + ccwa->name_offset;
> > -	dn->full_name = kmalloc(strlen(name) + 2, GFP_KERNEL);
> > +	dn->full_name = kasprintf(GFP_KERNEL, "/%s", name);
> >  	if (!dn->full_name) {
> >  		kfree(dn);
> >  		return NULL;
> >  	}
> >  
> > -	sprintf(dn->full_name, "/%s", name);
> >  	return dn;
> >  }
> >  
> > @@ -409,15 +408,13 @@ static ssize_t dlpar_cpu_probe(const cha
> >  	 * directory of the device tree.  CPUs actually live in the
> >  	 * cpus directory so we need to fixup the full_name.
> >  	 */
> > -	cpu_name = kzalloc(strlen(dn->full_name) + strlen("/cpus") + 1,
> > -			   GFP_KERNEL);
> > +	cpu_name = kasprintf(GFP_KERNEL, "/cpus%s", dn->full_name);
> >  	if (!cpu_name) {
> >  		dlpar_free_cc_nodes(dn);
> >  		rc = -ENOMEM;
> >  		goto out;
> >  	}
> >  
> > -	sprintf(cpu_name, "/cpus%s", dn->full_name);
> >  	kfree(dn->full_name);
> >  	dn->full_name = cpu_name;
> >  
> > diff -u -p a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
> > --- a/arch/s390/hypfs/inode.c 2010-01-29 18:29:07.000000000 +0100
> > +++ b/arch/s390/hypfs/inode.c 2010-03-09 23:32:47.000000000 +0100
> > @@ -426,10 +426,9 @@ struct dentry *hypfs_create_str(struct s
> >  	char *buffer;
> >  	struct dentry *dentry;
> >  
> > -	buffer = kmalloc(strlen(string) + 2, GFP_KERNEL);
> > +	buffer = kasprintf(GFP_KERNEL, "%s\n", string);
> >  	if (!buffer)
> >  		return ERR_PTR(-ENOMEM);
> > -	sprintf(buffer, "%s\n", string);
> >  	dentry =
> >  	    hypfs_create_file(sb, dir, name, buffer, S_IFREG | REG_FILE_MODE);
> >  	if (IS_ERR(dentry)) {
> > diff -u -p a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
> > --- a/arch/x86/pci/acpi.c 2010-03-01 07:52:48.000000000 +0100
> > +++ b/arch/x86/pci/acpi.c 2010-03-09 23:32:58.000000000 +0100
> > @@ -198,10 +198,9 @@ get_current_resources(struct acpi_device
> >  	if (!info.res)
> >  		goto res_alloc_fail;
> >  
> > -	info.name = kmalloc(16, GFP_KERNEL);
> > +	info.name = kasprintf(GFP_KERNEL, "PCI Bus %04x:%02x", domain, busnum);
> >  	if (!info.name)
> >  		goto name_alloc_fail;
> > -	sprintf(info.name, "PCI Bus %04x:%02x", domain, busnum);
> >  
> >  	info.res_num = 0;
> >  	acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource,
> > diff -u -p a/drivers/acpi/video.c b/drivers/acpi/video.c
> > --- a/drivers/acpi/video.c 2010-03-01 07:52:48.000000000 +0100
> > +++ b/drivers/acpi/video.c 2010-03-09 23:33:11.000000000 +0100
> > @@ -1005,11 +1005,10 @@ static void acpi_video_device_find_cap(s
> >  		result = acpi_video_init_brightness(device);
> >  		if (result)
> >  			return;
> > -		name = kzalloc(MAX_NAME_LEN, GFP_KERNEL);
> > +		name = kasprintf(GFP_KERNEL, "acpi_video%d", count++);
> >  		if (!name)
> >  			return;
> >  
> > -		sprintf(name, "acpi_video%d", count++);
> >  		device->backlight = backlight_device_register(name,
> >  			NULL, device, &acpi_backlight_ops);
> >  		kfree(name);
> > @@ -1056,10 +1055,9 @@ static void acpi_video_device_find_cap(s
> >  		if (device->cap._DCS && device->cap._DSS) {
> >  			static int count;
> >  			char *name;
> > -			name = kzalloc(MAX_NAME_LEN, GFP_KERNEL);
> > +			name = kasprintf(GFP_KERNEL, "acpi_video%d", count++);
> >  			if (!name)
> >  				return;
> > -			sprintf(name, "acpi_video%d", count++);
> >  			device->output_dev = video_output_register(name,
> >  					NULL, device, &acpi_output_properties);
> >  			kfree(name);
> > diff -u -p a/drivers/base/module.c b/drivers/base/module.c
> > --- a/drivers/base/module.c 2008-12-07 19:29:06.000000000 +0100
> > +++ b/drivers/base/module.c 2010-03-09 23:33:15.000000000 +0100
> > @@ -14,12 +14,10 @@ static char *make_driver_name(struct dev
> >  {
> >  	char *driver_name;
> >  
> > -	driver_name = kmalloc(strlen(drv->name) + strlen(drv->bus->name) + 2,
> > -			      GFP_KERNEL);
> > +	driver_name = kasprintf(GFP_KERNEL, "%s:%s", drv->bus->name, drv->name);
> >  	if (!driver_name)
> >  		return NULL;
> >  
> > -	sprintf(driver_name, "%s:%s", drv->bus->name, drv->name);
> >  	return driver_name;
> >  }
> >  
> > diff -u -p a/drivers/char/ppdev.c b/drivers/char/ppdev.c
> > --- a/drivers/char/ppdev.c 2009-06-24 21:18:49.000000000 +0200
> > +++ b/drivers/char/ppdev.c 2010-03-09 23:33:01.000000000 +0100
> > @@ -286,12 +286,10 @@ static int register_device (int minor, s
> >  	char *name;
> >  	int fl;
> >  
> > -	name = kmalloc (strlen (CHRDEV) + 3, GFP_KERNEL);
> > +	name = kasprintf(GFP_KERNEL, CHRDEV"%x", minor);
> >  	if (name == NULL)
> >  		return -ENOMEM;
> >  
> > -	sprintf (name, CHRDEV "%x", minor);
> > -
> >  	port = parport_find_number (minor);
> >  	if (!port) {
> >  		printk (KERN_WARNING "%s: no associated port!\n", name);
> > diff -u -p a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> > --- a/drivers/gpu/drm/drm_ioctl.c 2009-06-24 21:18:49.000000000 +0200
> > +++ b/drivers/gpu/drm/drm_ioctl.c 2010-03-09 23:33:14.000000000 +0100
> > @@ -101,14 +101,10 @@ int drm_setunique(struct drm_device *dev
> >  
> >  	master->unique[master->unique_len] = '\0';
> >  
> > -	dev->devname = kmalloc(strlen(dev->driver->pci_driver.name) +
> > -			       strlen(master->unique) + 2, GFP_KERNEL);
> > +	dev->devname = kasprintf(GFP_KERNEL, "%s@%s", dev->driver->pci_driver.name, master->unique);
> >  	if (!dev->devname)
> >  		return -ENOMEM;
> >  
> > -	sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
> > -		master->unique);
> > -
> >  	/* Return error if the busid submitted doesn't match the device's actual
> >  	 * busid.
> >  	 */
> > @@ -151,14 +147,10 @@ static int drm_set_busid(struct drm_devi
> >  	else
> >  		master->unique_len = len;
> >  
> > -	dev->devname = kmalloc(strlen(dev->driver->pci_driver.name) +
> > -			       master->unique_len + 2, GFP_KERNEL);
> > +	dev->devname = kasprintf(GFP_KERNEL, "%s@%s", dev->driver->pci_driver.name, master->unique);
> >  	if (dev->devname == NULL)
> >  		return -ENOMEM;
> >  
> > -	sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
> > -		master->unique);
> > -
> >  	return 0;
> >  }
> >  
> > diff -u -p a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
> > --- a/drivers/mtd/devices/block2mtd.c 2008-12-07 19:29:06.000000000 +0100
> > +++ b/drivers/mtd/devices/block2mtd.c 2010-03-09 23:32:50.000000000 +0100
> > @@ -275,12 +275,10 @@ static struct block2mtd_dev *add_device(
> >  
> >  	/* Setup the MTD structure */
> >  	/* make the name contain the block device in */
> > -	name = kmalloc(sizeof("block2mtd: ") + strlen(devname) + 1,
> > -			GFP_KERNEL);
> > +	name = kasprintf(GFP_KERNEL, "block2mtd: %s", devname);
> >  	if (!name)
> >  		goto devinit_err;
> >  
> > -	sprintf(name, "block2mtd: %s", devname);
> >  	dev->mtd.name = name;
> >  
> >  	dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
> > diff -u -p a/drivers/mtd/maps/vmu-flash.c b/drivers/mtd/maps/vmu-flash.c
> > --- a/drivers/mtd/maps/vmu-flash.c 2009-12-03 14:09:47.000000000 +0100
> > +++ b/drivers/mtd/maps/vmu-flash.c 2010-03-09 23:32:48.000000000 +0100
> > @@ -531,12 +531,10 @@ static void vmu_queryblocks(struct maple
> >  	part_cur->user_blocks = card->tempA;
> >  	part_cur->root_block = card->tempB;
> >  	part_cur->numblocks = card->tempB + 1;
> > -	part_cur->name = kmalloc(12, GFP_KERNEL);
> > +	part_cur->name = kasprintf(GFP_KERNEL, "vmu%d.%d.%d", mdev->port, mdev->unit, card->partition);
> >  	if (!part_cur->name)
> >  		goto fail_name;
> >  
> > -	sprintf(part_cur->name, "vmu%d.%d.%d",
> > -		mdev->port, mdev->unit, card->partition);
> >  	mtd_cur = &card->mtd[card->partition];
> >  	mtd_cur->name = part_cur->name;
> >  	mtd_cur->type = 8;
> > diff -u -p a/drivers/parport/share.c b/drivers/parport/share.c
> > --- a/drivers/parport/share.c 2009-06-05 12:16:39.000000000 +0200
> > +++ b/drivers/parport/share.c 2010-03-09 23:33:23.000000000 +0100
> > @@ -311,7 +311,7 @@ struct parport *parport_register_port(un
> >  	atomic_set (&tmp->ref_count, 1);
> >  	INIT_LIST_HEAD(&tmp->full_list);
> >  
> > -	name = kmalloc(15, GFP_KERNEL);
> > +	name = kasprintf(GFP_KERNEL, "parport%d", tmp->portnum = tmp->number);
> >  	if (!name) {
> >  		printk(KERN_ERR "parport: memory squeeze\n");
> >  		kfree(tmp);
> > @@ -332,7 +332,6 @@ struct parport *parport_register_port(un
> >  	/*
> >  	 * Now that the portnum is known finish doing the Init.
> >  	 */
> > -	sprintf(name, "parport%d", tmp->portnum = tmp->number);
> >  	tmp->name = name;
> >  
> >  	for (device = 0; device < 5; device++)
> > diff -u -p a/fs/cachefiles/key.c b/fs/cachefiles/key.c
> > --- a/fs/cachefiles/key.c 2009-04-13 16:04:31.000000000 +0200
> > +++ b/fs/cachefiles/key.c 2010-03-09 23:35:18.000000000 +0100
> > @@ -78,14 +78,13 @@ char *cachefiles_cook_key(const u8 *raw,
> >  
> >  	_debug("max: %d", max);
> >  
> > -	key = kmalloc(max, GFP_KERNEL);
> > +	key = kasprintf(GFP_KERNEL, "@%02x%c+", (unsigned)csum, 0);
> >  	if (!key)
> >  		return NULL;
> >  
> >  	len = 0;
> >  
> >  	/* build the cooked key */
> > -	sprintf(key, "@%02x%c+", (unsigned) csum, 0);
> >  	len = 5;
> >  	mark = len - 1;
> >  
> > diff -u -p a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
> > --- a/fs/hostfs/hostfs_kern.c 2009-07-04 21:27:34.000000000 +0200
> > +++ b/fs/hostfs/hostfs_kern.c 2010-03-09 23:35:19.000000000 +0100
> > @@ -187,13 +187,12 @@ static char *follow_link(char *link)
> >  	*(end + 1) = '\0';
> >  	len = strlen(link) + strlen(name) + 1;
> >  
> > -	resolved = kmalloc(len, GFP_KERNEL);
> > +	resolved = kasprintf(GFP_KERNEL, "%s%s", link, name);
> >  	if (resolved == NULL) {
> >  		n = -ENOMEM;
> >  		goto out_free;
> >  	}
> >  
> > -	sprintf(resolved, "%s%s", link, name);
> >  	kfree(name);
> >  	kfree(link);
> >  	return resolved;
> > @@ -979,13 +978,10 @@ static int hostfs_fill_sb_common(struct 
> >  		req_root = "";
> >  
> >  	err = -ENOMEM;
> > -	host_root_path = kmalloc(strlen(root_ino) + 1
> > -				 + strlen(req_root) + 1, GFP_KERNEL);
> > +	host_root_path = kasprintf(GFP_KERNEL, "%s/%s", root_ino, req_root);
> >  	if (host_root_path == NULL)
> >  		goto out;
> >  
> > -	sprintf(host_root_path, "%s/%s", root_ino, req_root);
> > -
> >  	root_inode = hostfs_iget(sb);
> >  	if (IS_ERR(root_inode)) {
> >  		err = PTR_ERR(root_inode);
> > diff -u -p a/lib/kobject.c b/lib/kobject.c
> > --- a/lib/kobject.c 2010-01-29 18:29:09.000000000 +0100
> > +++ b/lib/kobject.c 2010-03-09 23:35:27.000000000 +0100
> > @@ -415,12 +415,11 @@ int kobject_rename(struct kobject *kobj,
> >  		error = -ENOMEM;
> >  		goto out;
> >  	}
> > -	devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
> > +	devpath_string = kasprintf(GFP_KERNEL, "DEVPATH_OLD=%s", devpath);
> >  	if (!devpath_string) {
> >  		error = -ENOMEM;
> >  		goto out;
> >  	}
> > -	sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
> >  	envp[0] = devpath_string;
> >  	envp[1] = NULL;
> >  
> > @@ -480,12 +479,11 @@ int kobject_move(struct kobject *kobj, s
> >  		error = -ENOMEM;
> >  		goto out;
> >  	}
> > -	devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
> > +	devpath_string = kasprintf(GFP_KERNEL, "DEVPATH_OLD=%s", devpath);
> >  	if (!devpath_string) {
> >  		error = -ENOMEM;
> >  		goto out;
> >  	}
> > -	sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
> >  	envp[0] = devpath_string;
> >  	envp[1] = NULL;
> >  	error = sysfs_move_dir(kobj, new_parent);
> > diff -u -p a/net/atm/proc.c b/net/atm/proc.c
> > --- a/net/atm/proc.c 2010-02-16 11:28:04.000000000 +0100
> > +++ b/net/atm/proc.c 2010-03-09 23:37:33.000000000 +0100
> > @@ -420,10 +420,9 @@ int atm_proc_dev_register(struct atm_dev
> >  	if (!digits)
> >  		digits++;
> >  
> > -	dev->proc_name = kmalloc(strlen(dev->type) + digits + 2, GFP_KERNEL);
> > +	dev->proc_name = kasprintf(GFP_KERNEL, "%s:%d", dev->type, dev->number);
> >  	if (!dev->proc_name)
> >  		goto err_out;
> > -	sprintf(dev->proc_name, "%s:%d", dev->type, dev->number);
> >  
> >  	dev->proc_entry = proc_create_data(dev->proc_name, 0, atm_proc_root,
> >  					   &proc_atm_dev_ops, dev);
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux