chiark / gitweb /
[PATCH] better fix for NAME="foo-%c{N}" gets a truncated name
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Fri, 5 Mar 2004 02:55:34 +0000 (18:55 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:35:08 +0000 (21:35 -0700)
On Wed, Mar 03, 2004 at 04:56:34PM -0800, Greg KH wrote:
> On Wed, Mar 03, 2004 at 03:57:04PM -0800, Patrick Mansfield wrote:
> >
> > Here is a patch for some new tests.
>
> Applied, thanks.

Here is a small improvement, which looks much better.

Hey Pat, thanks a lot for finding the recent bug, hope this one will
not break it again :)

namedev.c
udev-add.c
udev-remove.c
udev.h
udevdb.c

index e9b3babd566c3f451a9fd8199163458eff4233b3..9182ed1fdc7b8c4e8cf322df315b919541a75bf0 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -220,8 +220,9 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
        char *attr;
        int len;
        int i;
-       int spos, slen;
        char c;
+       char *spos;
+       int slen;
        struct sysfs_attribute *tmpattr;
 
        pos = string;
@@ -278,7 +279,6 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
                                i = atoi(attr);
                        if (i > 0) {
                                foreach_strpart(udev->program_result, " \n\r", spos, slen) {
-                                       strnfieldcpy(temp2, udev->program_result + spos, slen+1);
                                        i--;
                                        if (i == 0)
                                                break;
@@ -287,6 +287,7 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
                                        dbg("requested part of result string not found");
                                        break;
                                }
+                               strnfieldcpy(temp2, spos, slen+1);
                                strnfieldcat(string, temp2, maxsize);
                                dbg("substitute part of result string '%s'", temp2);
                        } else {
index 9562cb5dbbc5de2ab956fc0352e2f1915b81b5a8..de1fb953c4e774c8427bbb4d1646ab9d53f88e5c 100644 (file)
@@ -195,7 +195,8 @@ static int create_node(struct udevice *dev, int fake)
        gid_t gid = 0;
        int i;
        int tail;
-       int pos, len;
+       char *pos;
+       int len;
 
        strfieldcpy(filename, udev_root);
        strfieldcat(filename, dev->name);
@@ -281,7 +282,7 @@ static int create_node(struct udevice *dev, int fake)
 
        /* create symlink if requested */
        foreach_strpart(dev->symlink, " ", pos, len) {
-               strnfieldcpy(linkname, dev->symlink + pos, len+1);
+               strnfieldcpy(linkname, pos, len+1);
                strfieldcpy(filename, udev_root);
                strfieldcat(filename, linkname);
                dbg("symlink '%s' to node '%s' requested", filename, dev->name);
index 93adcc7806fe0d1c2211838c4b259297960fa5d8..195b9874111b2269e0746082984810bb32722ab1 100644 (file)
@@ -72,7 +72,8 @@ static int delete_node(struct udevice *dev)
        char partitionname[NAME_SIZE];
        int retval;
        int i;
-       int pos, len;
+       char *pos;
+       int len;
 
        strfieldcpy(filename, udev_root);
        strfieldcat(filename, dev->name);
@@ -102,7 +103,7 @@ static int delete_node(struct udevice *dev)
                delete_path(filename);
 
        foreach_strpart(dev->symlink, " ", pos, len) {
-               strnfieldcpy(linkname, dev->symlink + pos, len+1);
+               strnfieldcpy(linkname, pos, len+1);
                strfieldcpy(filename, udev_root);
                strfieldcat(filename, linkname);
 
diff --git a/udev.h b/udev.h
index 9327e90913a9ca4d0355856528177ed3deca4b6b..32fda379e54e467965bce37735580ab2540c6f92 100644 (file)
--- a/udev.h
+++ b/udev.h
@@ -98,9 +98,9 @@ do { \
 } while (0)
 
 #define foreach_strpart(str, separator, pos, len) \
-       for(pos = 0, len = strcspn(str, separator); \
-           (pos) < strlen(str); \
-           pos = pos + (len) + 1, len = strcspn((str) + pos, separator)) \
+       for(pos = str, len = 0; \
+           (pos) < ((str) + strlen(str)); \
+           pos = pos + len + strspn(pos, separator), len = strcspn(pos, separator)) \
                if (len > 0)
 
 static inline char *get_action(void)
index 22d439d6388d0bea47157e799309340bf2aef618..b12f5b3d46e5538b948cf8799f7269090293f9fa 100644 (file)
--- a/udevdb.c
+++ b/udevdb.c
@@ -179,7 +179,8 @@ static int find_found;
 
 static int find_device_by_name(char *path, struct udevice *dev)
 {
-       int pos, len;
+       char *pos;
+       int len;
 
        if (strncmp(dev->name, find_name, sizeof(dev->name)) == 0) {
                memcpy(find_dev, dev, sizeof(struct udevice));
@@ -190,7 +191,7 @@ static int find_device_by_name(char *path, struct udevice *dev)
        }
        /* look for matching symlink*/
        foreach_strpart(dev->symlink, " ", pos, len) {
-               if (strncmp(&dev->symlink[pos], find_name, len) != 0)
+               if (strncmp(pos, find_name, len) != 0)
                        continue;
 
                if (len != strlen(find_name))