Package: busybox
Version: 1:1.1.3-3
Followup-For: Bug #373704

Hi,

Frans Pop noticed a mistake in the latest patch. The last fix (-2)
changed the way 'end' turns up at the end of the loop for no separator
but still removed one from it. Sort did then crop the end of key by
one without separator.

Patch 3 attached.

MfG
        Goswin

-- System Information:
Debian Release: 4.0
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-frosties
Locale: LANG=C, LC_CTYPE=de_DE (charmap=ISO-8859-1)

Versions of packages busybox depends on:
ii  libc6                        2.3.6.ds1-9 GNU C Library: Shared libraries

busybox recommends no packages.

-- no debconf information
diff -u busybox-1.1.3/coreutils/sort.c busybox-1.1.3/coreutils/sort.c
--- busybox-1.1.3/coreutils/sort.c
+++ busybox-1.1.3/coreutils/sort.c
@@ -62,7 +62,7 @@
 
 	/* Special case whole string, so we don't have to make a copy */
 	if(key->range[0]==1 && !key->range[1] && !key->range[2] && !key->range[3]
-		&& !(flags&(FLAG_b&FLAG_d&FLAG_f&FLAG_i&FLAG_bb))) return str;
+		&& !(flags&(FLAG_b|FLAG_d|FLAG_f|FLAG_i|FLAG_bb))) return str;
 	/* Find start of key on first pass, end on second pass*/
 	len=strlen(str);
 
@@ -72,23 +72,24 @@
 		else {
 			end=0;
 			for(i=1;i<key->range[2*j]+j;i++) {
-				/* Skip leading blanks or first separator */
-				if(str[end]) {
-					if(!key_separator && isspace(str[end]))
-						while(isspace(str[end])) end++;
-				}
-				/* Skip body of key */
-				for(;str[end];end++) {
+				/* Skip leading blanks */
+				if(str[end] && !key_separator)
+				    while(isspace(str[end])) end++;
+				/* Skip body of key and one blank or seperator */
+				while(str[end]) {
 					if(key_separator) {
-						if(str[end]==key_separator) break;
-					} else if(isspace(str[end])) break;
+						if(str[end++]==key_separator) break;
+					} else {
+						if(isspace(str[end])) break;
+						end++;
+					}
 				}
 			}
 		}
 		if(!j) start=end;
 	}
-	/* Key with explicit separator starts after separator */
-	if(key_separator && str[start]==key_separator) start++;
+	/* Don't include the last separator */
+	if (key_separator && str[end]) end--;
 	/* Strip leading whitespace if necessary */
 	if(flags&FLAG_b) while(isspace(str[start])) start++;
 	/* Strip trailing whitespace if necessary */

Reply via email to