diff --git a/namedev.c b/namedev.c
index e9b3babd566..9182ed1fdc7 100644
--- 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 {
diff --git a/udev-add.c b/udev-add.c
index 9562cb5dbbc..de1fb953c4e 100644
--- a/udev-add.c
+++ b/udev-add.c
@@ -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);
diff --git a/udev-remove.c b/udev-remove.c
index 93adcc7806f..195b9874111 100644
--- a/udev-remove.c
+++ b/udev-remove.c
@@ -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 9327e90913a..32fda379e54 100644
--- 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)
diff --git a/udevdb.c b/udevdb.c
index 22d439d6388..b12f5b3d46e 100644
--- 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))