lkml.org 
[lkml]   [2007]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 2.6.20] kobject net ifindex + rename
    On 28-02-2007 02:27, Jean Tourrilhes wrote:
    > Hi all,
    ...
    > Patch for 2.6.20 is attached. The patch was tested on a system
    > running the hotplug scripts, and on another system running udev.
    >
    > Have fun...
    >
    > Jean
    >
    > Signed-off-by: Jean Tourrilhes <jt@hpl.hp.com>
    >
    > ---------------------------------------------------------
    ...
    > diff -u -p linux/net/core/net-sysfs.j1.c linux/net/core/net-sysfs.c
    > --- linux/net/core/net-sysfs.j1.c 2007-02-27 15:01:08.000000000 -0800
    > +++ linux/net/core/net-sysfs.c 2007-02-27 15:06:49.000000000 -0800
    > @@ -412,6 +412,17 @@ static int netdev_uevent(struct class_de
    > if ((size <= 0) || (i >= num_envp))
    > return -ENOMEM;
    >
    > + /* pass ifindex to uevent.
    > + * ifindex is useful as it won't change (interface name may change)
    > + * and is what RtNetlink uses natively. */
    > + envp[i++] = buf;
    > + n = snprintf(buf, size, "IFINDEX=%d", dev->ifindex) + 1;
    > + buf += n;
    > + size -= n;
    > +
    > + if ((size <= 0) || (i >= num_envp))

    Btw.:
    1. if size == 10 and snprintf returns 9 (without NULL)
    then n == 10 (with NULL), so isn't it enough (here and above):

    if ((size < 0) || (i >= num_envp))

    2. shouldn't there be (here and above):

    envp[--i] = NULL;

    > + return -ENOMEM;
    > +
    > envp[i] = NULL;
    > return 0;
    > }
    ...
    > diff -u -p linux/drivers/base/class.j1.c linux/drivers/base/class.c
    > --- linux/drivers/base/class.j1.c 2007-02-26 18:38:10.000000000 -0800
    > +++ linux/drivers/base/class.c 2007-02-27 15:52:37.000000000 -0800
    > @@ -841,6 +841,8 @@ int class_device_rename(struct class_dev
    > {
    > int error = 0;
    > char *old_class_name = NULL, *new_class_name = NULL;
    > + char *devname_string = NULL;
    > + char *envp[2];
    >
    > class_dev = class_device_get(class_dev);
    > if (!class_dev)
    > @@ -849,6 +851,15 @@ int class_device_rename(struct class_dev
    > pr_debug("CLASS: renaming '%s' to '%s'\n", class_dev->class_id,
    > new_name);
    >
    > + devname_string = kmalloc(strlen(class_dev->class_id) + 15, GFP_KERNEL);
    > + if (!devname_string) {
    > + class_device_put(class_dev);
    > + return -ENOMEM;
    > + }
    > + sprintf(devname_string, "INTERFACE_OLD=%s", class_dev->class_id);
    > + envp[0] = devname_string;
    > + envp[1] = NULL;
    > +
    > #ifdef CONFIG_SYSFS_DEPRECATED
    > if (class_dev->dev)
    > old_class_name = make_class_name(class_dev->class->name,
    > @@ -868,8 +879,16 @@ int class_device_rename(struct class_dev
    > sysfs_remove_link(&class_dev->dev->kobj, old_class_name);
    > }
    > #endif
    > +
    > + /* This function is only used for network interface.
    > + * Some hotplug package track interfaces by their name and
    > + * therefore want to know when the name is changed by the user. */
    > + if(!error)
    > + kobject_uevent_env(&class_dev->kobj, KOBJ_RENAME, envp);
    > +
    > class_device_put(class_dev);
    >
    > + kfree(devname_string);

    Maybe I miss something, but it seems kobject_uevent_env copies
    pointers from envp instead of buffers' contents.

    Regards,
    Jarek P.
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-02-28 10:33    [W:6.893 / U:0.432 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site