Commit 8a83e8d7 authored by Peter Korsgaard's avatar Peter Korsgaard
Browse files

busybox: 1.15.1 fixes

parent e7da301b
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
diff -urpN busybox-1.15.1/shell/ash.c busybox-1.15.1-ash/shell/ash.c
--- busybox-1.15.1/shell/ash.c	2009-09-12 17:56:11.000000000 +0200
+++ busybox-1.15.1-ash/shell/ash.c	2009-09-16 16:29:09.609276492 +0200
@@ -5553,7 +5553,7 @@ exptilde(char *startp, char *p, int flag
 	char *name;
 	struct passwd *pw;
 	const char *home;
-	int quotes = flag & (EXP_FULL | EXP_CASE);
+	int quotes = flag & (EXP_FULL | EXP_CASE | EXP_REDIR);
 	int startloc;
 
 	name = p + 1;
@@ -6321,7 +6321,7 @@ varvalue(char *name, int varflags, int f
 	int syntax;
 	int quoted = varflags & VSQUOTE;
 	int subtype = varflags & VSTYPE;
-	int quotes = flags & (EXP_FULL | EXP_CASE);
+	int quotes = flags & (EXP_FULL | EXP_CASE | EXP_REDIR);
 
 	if (quoted && (flags & EXP_FULL))
 		sep = 1 << CHAR_BIT;
@@ -6558,6 +6558,7 @@ evalvar(char *p, int flag, struct strlis
 		patloc = expdest - (char *)stackblock();
 		if (0 == subevalvar(p, /* str: */ NULL, patloc, subtype,
 				startloc, varflags,
+//TODO: | EXP_REDIR too? All other such places do it too
 				/* quotes: */ flag & (EXP_FULL | EXP_CASE),
 				var_str_list)
 		) {
+34 −0
Original line number Diff line number Diff line
diff -urpN busybox-1.15.1/miscutils/hdparm.c busybox-1.15.1-buildsys/miscutils/hdparm.c
--- busybox-1.15.1/miscutils/hdparm.c	2009-09-12 17:55:36.000000000 +0200
+++ busybox-1.15.1-buildsys/miscutils/hdparm.c	2009-09-22 23:13:25.000000000 +0200
@@ -15,6 +15,9 @@
 /* must be _after_ libbb.h: */
 #include <linux/hdreg.h>
 #include <sys/mount.h>
+#if !defined(BLKGETSIZE64)
+# define BLKGETSIZE64 _IOR(0x12,114,size_t)
+#endif
 
 /* device types */
 /* ------------ */
diff -urpN busybox-1.15.1/util-linux/fdisk.c busybox-1.15.1-buildsys/util-linux/fdisk.c
--- busybox-1.15.1/util-linux/fdisk.c	2009-09-12 17:55:37.000000000 +0200
+++ busybox-1.15.1-buildsys/util-linux/fdisk.c	2009-09-22 23:13:25.000000000 +0200
@@ -9,13 +9,16 @@
 
 #ifndef _LARGEFILE64_SOURCE
 /* For lseek64 */
-#define _LARGEFILE64_SOURCE
+# define _LARGEFILE64_SOURCE
 #endif
 #include <assert.h>             /* assert */
 #include <sys/mount.h>
 #if !defined(BLKSSZGET)
 # define BLKSSZGET _IO(0x12, 104)
 #endif
+#if !defined(BLKGETSIZE64)
+# define BLKGETSIZE64 _IOR(0x12,114,size_t)
+#endif
 #include "libbb.h"
 
 /* Looks like someone forgot to add this to config system */
+35 −0
Original line number Diff line number Diff line
diff -urpN busybox-1.15.1/coreutils/dd.c busybox-1.15.1-dd/coreutils/dd.c
--- busybox-1.15.1/coreutils/dd.c	2009-09-12 17:55:58.000000000 +0200
+++ busybox-1.15.1-dd/coreutils/dd.c	2009-09-18 20:48:22.000000000 +0200
@@ -286,25 +286,26 @@ int dd_main(int argc UNUSED_PARAM, char 
 	}
 
 	while (!(flags & FLAG_COUNT) || (G.in_full + G.in_part != count)) {
-		if (flags & FLAG_NOERROR) /* Pre-zero the buffer if conv=noerror */
-			memset(ibuf, 0, ibs);
 		n = safe_read(ifd, ibuf, ibs);
 		if (n == 0)
 			break;
 		if (n < 0) {
+			/* "Bad block" */
 			if (!(flags & FLAG_NOERROR))
 				goto die_infile;
-			n = ibs;
 			bb_simple_perror_msg(infile);
-			/* GNU dd with conv=noerror skips over "bad blocks" */
+			/* GNU dd with conv=noerror skips over bad blocks */
 			xlseek(ifd, ibs, SEEK_CUR);
+			/* conv=noerror,sync writes NULs,
+			 * conv=noerror just ignores input bad blocks */
+			n = 0;
 		}
 		if ((size_t)n == ibs)
 			G.in_full++;
 		else {
 			G.in_part++;
 			if (flags & FLAG_SYNC) {
-				memset(ibuf + n, '\0', ibs - n);
+				memset(ibuf + n, 0, ibs - n);
 				n = ibs;
 			}
 		}
+250 −0
Original line number Diff line number Diff line
diff -urpN busybox-1.15.1/libbb/procps.c busybox-1.15.1-pidof_killall/libbb/procps.c
--- busybox-1.15.1/libbb/procps.c	2009-09-12 17:55:58.000000000 +0200
+++ busybox-1.15.1-pidof_killall/libbb/procps.c	2009-09-22 23:03:59.000000000 +0200
@@ -134,8 +134,8 @@ static unsigned long fast_strtoul_16(cha
 	return n;
 }
 /* TOPMEM uses fast_strtoul_10, so... */
-#undef ENABLE_FEATURE_FAST_TOP
-#define ENABLE_FEATURE_FAST_TOP 1
+# undef ENABLE_FEATURE_FAST_TOP
+# define ENABLE_FEATURE_FAST_TOP 1
 #endif
 
 #if ENABLE_FEATURE_FAST_TOP
@@ -198,14 +198,16 @@ procps_status_t* FAST_FUNC procps_scan(p
 		if (errno)
 			continue;
 
-		/* After this point we have to break, not continue
-		 * ("continue" would mean that current /proc/NNN
-		 * is not a valid process info) */
+		/* After this point we can:
+		 * "break": stop parsing, return the data
+		 * "continue": try next /proc/XXX
+		 */
 
 		memset(&sp->vsz, 0, sizeof(*sp) - offsetof(procps_status_t, vsz));
 
 		sp->pid = pid;
-		if (!(flags & ~PSSCAN_PID)) break;
+		if (!(flags & ~PSSCAN_PID))
+			break; /* we needed only pid, we got it */
 
 #if ENABLE_SELINUX
 		if (flags & PSSCAN_CONTEXT) {
@@ -218,7 +220,7 @@ procps_status_t* FAST_FUNC procps_scan(p
 
 		if (flags & PSSCAN_UIDGID) {
 			if (stat(filename, &sb))
-				break;
+				continue; /* process probably exited */
 			/* Effective UID/GID, not real */
 			sp->uid = sb.st_uid;
 			sp->gid = sb.st_gid;
@@ -234,10 +236,10 @@ procps_status_t* FAST_FUNC procps_scan(p
 			strcpy(filename_tail, "stat");
 			n = read_to_buf(filename, buf);
 			if (n < 0)
-				break;
+				continue; /* process probably exited */
 			cp = strrchr(buf, ')'); /* split into "PID (cmd" and "<rest>" */
 			/*if (!cp || cp[1] != ' ')
-				break;*/
+				continue;*/
 			cp[0] = '\0';
 			if (sizeof(sp->comm) < 16)
 				BUG_comm_size();
@@ -257,12 +259,12 @@ procps_status_t* FAST_FUNC procps_scan(p
 				"%lu "                 /* start_time */
 				"%lu "                 /* vsize */
 				"%lu "                 /* rss */
-#if ENABLE_FEATURE_TOP_SMP_PROCESS
+# if ENABLE_FEATURE_TOP_SMP_PROCESS
 				"%*s %*s %*s %*s %*s %*s " /*rss_rlim, start_code, end_code, start_stack, kstk_esp, kstk_eip */
 				"%*s %*s %*s %*s "         /*signal, blocked, sigignore, sigcatch */
 				"%*s %*s %*s %*s "         /*wchan, nswap, cnswap, exit_signal */
 				"%d"                       /*cpu last seen on*/
-#endif
+# endif
 				,
 				sp->state, &sp->ppid,
 				&sp->pgid, &sp->sid, &tty,
@@ -271,17 +273,17 @@ procps_status_t* FAST_FUNC procps_scan(p
 				&sp->start_time,
 				&vsz,
 				&rss
-#if ENABLE_FEATURE_TOP_SMP_PROCESS
+# if ENABLE_FEATURE_TOP_SMP_PROCESS
 				, &sp->last_seen_on_cpu
-#endif
+# endif
 				);
 
 			if (n < 11)
-				break;
-#if ENABLE_FEATURE_TOP_SMP_PROCESS
+				continue; /* bogus data, get next /proc/XXX */
+# if ENABLE_FEATURE_TOP_SMP_PROCESS
 			if (n < 11+15)
 				sp->last_seen_on_cpu = 0;
-#endif
+# endif
 
 			/* vsz is in bytes and we want kb */
 			sp->vsz = vsz >> 10;
@@ -311,14 +313,14 @@ procps_status_t* FAST_FUNC procps_scan(p
 			sp->vsz = fast_strtoul_10(&cp) >> 10;
 			/* vsz is in bytes but rss is in *PAGES*! Can you believe that? */
 			sp->rss = fast_strtoul_10(&cp) << sp->shift_pages_to_kb;
-#if ENABLE_FEATURE_TOP_SMP_PROCESS
+# if ENABLE_FEATURE_TOP_SMP_PROCESS
 			/* (6): rss_rlim, start_code, end_code, start_stack, kstk_esp, kstk_eip */
 			/* (4): signal, blocked, sigignore, sigcatch */
 			/* (4): wchan, nswap, cnswap, exit_signal */
 			cp = skip_fields(cp, 14);
 //FIXME: is it safe to assume this field exists?
 			sp->last_seen_on_cpu = fast_strtoul_10(&cp);
-#endif
+# endif
 #endif /* end of !ENABLE_FEATURE_TOP_SMP_PROCESS */
 
 #if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
@@ -343,48 +345,48 @@ procps_status_t* FAST_FUNC procps_scan(p
 
 			strcpy(filename_tail, "smaps");
 			file = fopen_for_read(filename);
-			if (!file)
-				break;
-			while (fgets(buf, sizeof(buf), file)) {
-				unsigned long sz;
-				char *tp;
-				char w;
+			if (file) {
+				while (fgets(buf, sizeof(buf), file)) {
+					unsigned long sz;
+					char *tp;
+					char w;
 #define SCAN(str, name) \
 	if (strncmp(buf, str, sizeof(str)-1) == 0) { \
 		tp = skip_whitespace(buf + sizeof(str)-1); \
 		sp->name += fast_strtoul_10(&tp); \
 		continue; \
 	}
-				SCAN("Shared_Clean:" , shared_clean );
-				SCAN("Shared_Dirty:" , shared_dirty );
-				SCAN("Private_Clean:", private_clean);
-				SCAN("Private_Dirty:", private_dirty);
+					SCAN("Shared_Clean:" , shared_clean );
+					SCAN("Shared_Dirty:" , shared_dirty );
+					SCAN("Private_Clean:", private_clean);
+					SCAN("Private_Dirty:", private_dirty);
 #undef SCAN
-				// f7d29000-f7d39000 rw-s ADR M:m OFS FILE
-				tp = strchr(buf, '-');
-				if (tp) {
-					*tp = ' ';
-					tp = buf;
-					sz = fast_strtoul_16(&tp); /* start */
-					sz = (fast_strtoul_16(&tp) - sz) >> 10; /* end - start */
-					// tp -> "rw-s" string
-					w = tp[1];
-					// skipping "rw-s ADR M:m OFS "
-					tp = skip_whitespace(skip_fields(tp, 4));
-					// filter out /dev/something (something != zero)
-					if (strncmp(tp, "/dev/", 5) != 0 || strcmp(tp, "/dev/zero\n") == 0) {
-						if (w == 'w') {
-							sp->mapped_rw += sz;
-						} else if (w == '-') {
-							sp->mapped_ro += sz;
+					// f7d29000-f7d39000 rw-s ADR M:m OFS FILE
+					tp = strchr(buf, '-');
+					if (tp) {
+						*tp = ' ';
+						tp = buf;
+						sz = fast_strtoul_16(&tp); /* start */
+						sz = (fast_strtoul_16(&tp) - sz) >> 10; /* end - start */
+						// tp -> "rw-s" string
+						w = tp[1];
+						// skipping "rw-s ADR M:m OFS "
+						tp = skip_whitespace(skip_fields(tp, 4));
+						// filter out /dev/something (something != zero)
+						if (strncmp(tp, "/dev/", 5) != 0 || strcmp(tp, "/dev/zero\n") == 0) {
+							if (w == 'w') {
+								sp->mapped_rw += sz;
+							} else if (w == '-') {
+								sp->mapped_ro += sz;
+							}
 						}
-					}
 //else printf("DROPPING %s (%s)\n", buf, tp);
-					if (strcmp(tp, "[stack]\n") == 0)
-						sp->stack += sz;
+						if (strcmp(tp, "[stack]\n") == 0)
+							sp->stack += sz;
+					}
 				}
+				fclose(file);
 			}
-			fclose(file);
 		}
 #endif /* TOPMEM */
 #if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
@@ -393,23 +395,34 @@ procps_status_t* FAST_FUNC procps_scan(p
 
 			strcpy(filename_tail, "status");
 			file = fopen_for_read(filename);
-			if (!file)
-				break;
-			while (fgets(buf, sizeof(buf), file)) {
-				char *tp;
+			if (file) {
+				while (fgets(buf, sizeof(buf), file)) {
+					char *tp;
 #define SCAN_TWO(str, name, statement) \
 	if (strncmp(buf, str, sizeof(str)-1) == 0) { \
 		tp = skip_whitespace(buf + sizeof(str)-1); \
 		sscanf(tp, "%u", &sp->name); \
 		statement; \
 	}
-				SCAN_TWO("Uid:", ruid, continue);
-				SCAN_TWO("Gid:", rgid, break);
+					SCAN_TWO("Uid:", ruid, continue);
+					SCAN_TWO("Gid:", rgid, break);
 #undef SCAN_TWO
+				}
+				fclose(file);
 			}
-			fclose(file);
 		}
 #endif /* PS_ADDITIONAL_COLUMNS */
+		if (flags & PSSCAN_EXE) {
+			strcpy(filename_tail, "exe");
+			free(sp->exe);
+			sp->exe = xmalloc_readlink(filename);
+		}
+		/* Note: if /proc/PID/cmdline is empty,
+		 * code below "breaks". Therefore it must be
+		 * the last code to parse /proc/PID/xxx data
+		 * (we used to have /proc/PID/exe parsing after it
+		 * and were getting stale sp->exe).
+		 */
 #if 0 /* PSSCAN_CMD is not used */
 		if (flags & (PSSCAN_CMD|PSSCAN_ARGV0)) {
 			free(sp->argv0);
@@ -452,13 +465,9 @@ procps_status_t* FAST_FUNC procps_scan(p
 			}
 		}
 #endif
-		if (flags & PSSCAN_EXE) {
-			strcpy(filename_tail, "exe");
-			free(sp->exe);
-			sp->exe = xmalloc_readlink(filename);
-		}
 		break;
-	}
+	} /* for (;;) */
+
 	return sp;
 }
 
+15 −0
Original line number Diff line number Diff line
diff -urpN busybox-1.15.1/editors/sed.c busybox-1.15.1-sed/editors/sed.c
--- busybox-1.15.1/editors/sed.c	2009-09-12 17:55:58.000000000 +0200
+++ busybox-1.15.1-sed/editors/sed.c	2009-09-22 03:01:59.000000000 +0200
@@ -690,10 +690,8 @@ static int do_subst_command(sed_cmd_t *s
 		if (sed_cmd->which_match)
 			break;
 
-		if (*line == '\0')
-			break;
 //maybe (G.regmatch[0].rm_eo ? REG_NOTBOL : 0) instead of unconditional REG_NOTBOL?
-	} while (regexec(current_regex, line, 10, G.regmatch, REG_NOTBOL) != REG_NOMATCH);
+	} while (*line && regexec(current_regex, line, 10, G.regmatch, REG_NOTBOL) != REG_NOMATCH);
 
 	/* Copy rest of string into output pipeline */
 	while (1) {