aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2016-05-16 09:33:03 +0100
committerRon Yorston <rmy@pobox.com>2016-05-16 09:33:03 +0100
commit35d2f5bccb0f3dde600702ebcdb5424d4d50be4a (patch)
tree6e0ff0341c69839e268459a199682628bae734ed
parent248a2600a2f4b442101ad568d1994b908bb28d4b (diff)
parentf2559e5c2b7bd2c5fa0dd8e88d0a931da92a23af (diff)
downloadbusybox-w32-35d2f5bccb0f3dde600702ebcdb5424d4d50be4a.tar.gz
busybox-w32-35d2f5bccb0f3dde600702ebcdb5424d4d50be4a.tar.bz2
busybox-w32-35d2f5bccb0f3dde600702ebcdb5424d4d50be4a.zip
Merge branch 'busybox' into merge
-rw-r--r--Makefile7
-rw-r--r--archival/cpio.c4
-rw-r--r--archival/libarchive/common.c2
-rw-r--r--archival/lzop.c7
-rw-r--r--archival/rpm.c5
-rw-r--r--archival/tar.c3
-rw-r--r--archival/unzip.c138
-rw-r--r--console-tools/dumpkmap.c2
-rw-r--r--console-tools/resize.c6
-rw-r--r--coreutils/catv.c5
-rw-r--r--coreutils/cksum.c4
-rw-r--r--coreutils/date.c4
-rw-r--r--coreutils/dd.c4
-rw-r--r--coreutils/du.c5
-rw-r--r--coreutils/expr.c5
-rw-r--r--coreutils/ls.c4
-rw-r--r--coreutils/od_bloaty.c4
-rw-r--r--coreutils/split.c3
-rw-r--r--coreutils/stat.c5
-rw-r--r--coreutils/stty.c9
-rw-r--r--coreutils/sum.c7
-rw-r--r--coreutils/tail.c5
-rw-r--r--coreutils/tee.c4
-rw-r--r--debianutils/run_parts.c5
-rw-r--r--debianutils/start_stop_daemon.c4
-rw-r--r--e2fsprogs/e2fs_lib.c4
-rw-r--r--e2fsprogs/fsck.c4
-rw-r--r--editors/diff.c2
-rw-r--r--editors/ed.c6
-rw-r--r--editors/sed.c77
-rw-r--r--editors/vi.c2
-rw-r--r--findutils/find.c4
-rw-r--r--findutils/grep.c4
-rw-r--r--findutils/xargs.c4
-rw-r--r--include/.gitignore1
-rw-r--r--include/libbb.h4
-rw-r--r--init/bootchartd.c7
-rw-r--r--libbb/appletlib.c3
-rw-r--r--libbb/common_bufsiz.c74
-rw-r--r--libbb/lineedit.c7
-rw-r--r--libbb/messages.c5
-rw-r--r--libbb/mode_string.c4
-rw-r--r--libbb/pw_encrypt.c2
-rw-r--r--libbb/u_signal_names.c2
-rw-r--r--loginutils/login.c5
-rw-r--r--miscutils/adjtimex.c6
-rw-r--r--miscutils/chat.c4
-rw-r--r--miscutils/conspy.c7
-rw-r--r--miscutils/crond.c4
-rw-r--r--miscutils/dc.c4
-rw-r--r--miscutils/eject.c2
-rw-r--r--miscutils/fbsplash.c5
-rw-r--r--miscutils/hdparm.c4
-rw-r--r--miscutils/i2c_tools.c1
-rw-r--r--miscutils/inotifyd.c6
-rw-r--r--miscutils/ionice.c2
-rw-r--r--miscutils/less.c7
-rw-r--r--miscutils/microcom.c6
-rw-r--r--miscutils/setserial.c8
-rw-r--r--networking/arp.c4
-rw-r--r--networking/arping.c4
-rw-r--r--networking/ftpd.c4
-rw-r--r--networking/ftpgetput.c4
-rw-r--r--networking/httpd.c11
-rw-r--r--networking/ifupdown.c5
-rw-r--r--networking/inetd.c4
-rw-r--r--networking/isrv_identd.c5
-rw-r--r--networking/libiproute/ipaddress.c8
-rw-r--r--networking/libiproute/ipneigh.c8
-rw-r--r--networking/libiproute/iproute.c6
-rw-r--r--networking/libiproute/libnetlink.c37
-rw-r--r--networking/libiproute/ll_proto.c2
-rw-r--r--networking/libiproute/ll_types.c4
-rw-r--r--networking/nc.c6
-rw-r--r--networking/ping.c8
-rw-r--r--networking/slattach.c5
-rw-r--r--networking/tc.c4
-rw-r--r--networking/tcpudp.c4
-rw-r--r--networking/telnet.c4
-rw-r--r--networking/telnetd.c4
-rw-r--r--networking/telnetd.ctrlSQ.patch4
-rw-r--r--networking/tftp.c7
-rw-r--r--networking/udhcp/common.h1
-rw-r--r--networking/udhcp/d6_dhcpc.c2
-rw-r--r--networking/udhcp/dhcpc.c4
-rw-r--r--networking/udhcp/dhcpd.c8
-rw-r--r--networking/udhcp/dhcpd.h2
-rw-r--r--networking/udhcp/dhcprelay.c5
-rw-r--r--networking/udhcp/files.c46
-rw-r--r--networking/wget.c6
-rw-r--r--networking/zcip.c5
-rw-r--r--procps/free.c5
-rw-r--r--procps/fuser.c4
-rw-r--r--procps/nmeter.c10
-rw-r--r--procps/ps.c5
-rw-r--r--procps/top.c10
-rw-r--r--runit/runsv.c4
-rw-r--r--runit/runsvdir.c5
-rw-r--r--runit/sv.c5
-rw-r--r--runit/svlogd.c9
-rwxr-xr-xscripts/generate_BUFSIZ.sh181
-rwxr-xr-xscripts/trylink10
-rw-r--r--selinux/setfiles.c3
-rw-r--r--shell/ash.c11
-rw-r--r--shell/ash_test/ash-heredoc/heredoc4.right1
-rwxr-xr-xshell/ash_test/ash-heredoc/heredoc4.tests3
-rw-r--r--shell/ash_test/ash-quoting/dollar_squote_bash1.right1
-rwxr-xr-xshell/ash_test/ash-quoting/dollar_squote_bash1.tests1
-rw-r--r--shell/shell_common.c2
-rw-r--r--sysklogd/klogd.c5
-rw-r--r--sysklogd/logger.c2
-rw-r--r--sysklogd/logread.c4
-rw-r--r--sysklogd/syslogd_and_logger.c1
-rwxr-xr-xtestsuite/sed.tests24
-rw-r--r--util-linux/fatattr.c2
-rw-r--r--util-linux/flock.c21
-rw-r--r--util-linux/mdev.c4
-rw-r--r--util-linux/mkswap.c4
-rw-r--r--util-linux/more.c3
-rw-r--r--util-linux/mount.c11
-rw-r--r--util-linux/nsenter.c2
-rw-r--r--util-linux/script.c10
-rw-r--r--util-linux/swaponoff.c5
-rw-r--r--util-linux/uevent.c6
-rw-r--r--util-linux/umount.c4
-rw-r--r--util-linux/unshare.c2
-rw-r--r--util-linux/volume_id/bcache.c2
-rw-r--r--util-linux/volume_id/luks.c2
128 files changed, 858 insertions, 295 deletions
diff --git a/Makefile b/Makefile
index 966578a0f..40ed634a6 100644
--- a/Makefile
+++ b/Makefile
@@ -612,7 +612,8 @@ quiet_cmd_busybox__ ?= LINK $@
612 "$(LDFLAGS) $(EXTRA_LDFLAGS)" \ 612 "$(LDFLAGS) $(EXTRA_LDFLAGS)" \
613 "$(core-y)" \ 613 "$(core-y)" \
614 "$(libs-y)" \ 614 "$(libs-y)" \
615 "$(LDLIBS)" 615 "$(LDLIBS)" \
616 && $(srctree)/scripts/generate_BUFSIZ.sh --post include/common_bufsiz.h
616 617
617# Generate System.map 618# Generate System.map
618quiet_cmd_sysmap = SYSMAP 619quiet_cmd_sysmap = SYSMAP
@@ -846,12 +847,15 @@ export CPPFLAGS_busybox.lds += -P -C -U$(ARCH)
846# Split autoconf.h into include/linux/config/* 847# Split autoconf.h into include/linux/config/*
847quiet_cmd_gen_bbconfigopts = GEN include/bbconfigopts.h 848quiet_cmd_gen_bbconfigopts = GEN include/bbconfigopts.h
848 cmd_gen_bbconfigopts = $(srctree)/scripts/mkconfigs include/bbconfigopts.h include/bbconfigopts_bz2.h 849 cmd_gen_bbconfigopts = $(srctree)/scripts/mkconfigs include/bbconfigopts.h include/bbconfigopts_bz2.h
850quiet_cmd_gen_common_bufsiz = GEN include/common_bufsiz.h
851 cmd_gen_common_bufsiz = $(srctree)/scripts/generate_BUFSIZ.sh include/common_bufsiz.h
849quiet_cmd_split_autoconf = SPLIT include/autoconf.h -> include/config/* 852quiet_cmd_split_autoconf = SPLIT include/autoconf.h -> include/config/*
850 cmd_split_autoconf = scripts/basic/split-include include/autoconf.h include/config 853 cmd_split_autoconf = scripts/basic/split-include include/autoconf.h include/config
851#bbox# piggybacked generation of few .h files 854#bbox# piggybacked generation of few .h files
852include/config/MARKER: scripts/basic/split-include include/autoconf.h 855include/config/MARKER: scripts/basic/split-include include/autoconf.h
853 $(call cmd,split_autoconf) 856 $(call cmd,split_autoconf)
854 $(call cmd,gen_bbconfigopts) 857 $(call cmd,gen_bbconfigopts)
858 $(call cmd,gen_common_bufsiz)
855 @touch $@ 859 @touch $@
856 860
857# Generate some files 861# Generate some files
@@ -967,6 +971,7 @@ CLEAN_FILES += busybox$(EXEEXT) busybox_unstripped* busybox.links \
967MRPROPER_DIRS += include/config include2 971MRPROPER_DIRS += include/config include2
968MRPROPER_FILES += .config .config.old include/asm .version .old_version \ 972MRPROPER_FILES += .config .config.old include/asm .version .old_version \
969 include/NUM_APPLETS.h \ 973 include/NUM_APPLETS.h \
974 include/common_bufsiz.h \
970 include/autoconf.h \ 975 include/autoconf.h \
971 include/bbconfigopts.h \ 976 include/bbconfigopts.h \
972 include/bbconfigopts_bz2.h \ 977 include/bbconfigopts_bz2.h \
diff --git a/archival/cpio.c b/archival/cpio.c
index 30f66d1f7..d0cedd35c 100644
--- a/archival/cpio.c
+++ b/archival/cpio.c
@@ -11,6 +11,7 @@
11 * Only supports new ASCII and CRC formats 11 * Only supports new ASCII and CRC formats
12 */ 12 */
13#include "libbb.h" 13#include "libbb.h"
14#include "common_bufsiz.h"
14#include "bb_archive.h" 15#include "bb_archive.h"
15 16
16//config:config CPIO 17//config:config CPIO
@@ -170,9 +171,10 @@ enum {
170struct globals { 171struct globals {
171 struct bb_uidgid_t owner_ugid; 172 struct bb_uidgid_t owner_ugid;
172} FIX_ALIASING; 173} FIX_ALIASING;
173#define G (*(struct globals*)&bb_common_bufsiz1) 174#define G (*(struct globals*)bb_common_bufsiz1)
174void BUG_cpio_globals_too_big(void); 175void BUG_cpio_globals_too_big(void);
175#define INIT_G() do { \ 176#define INIT_G() do { \
177 setup_common_bufsiz(); \
176 G.owner_ugid.uid = -1L; \ 178 G.owner_ugid.uid = -1L; \
177 G.owner_ugid.gid = -1L; \ 179 G.owner_ugid.gid = -1L; \
178} while (0) 180} while (0)
diff --git a/archival/libarchive/common.c b/archival/libarchive/common.c
index dd69d2222..389cb7856 100644
--- a/archival/libarchive/common.c
+++ b/archival/libarchive/common.c
@@ -6,4 +6,4 @@
6#include "libbb.h" 6#include "libbb.h"
7#include "bb_archive.h" 7#include "bb_archive.h"
8 8
9const char cpio_TRAILER[] = "TRAILER!!!"; 9const char cpio_TRAILER[] ALIGN1 = "TRAILER!!!";
diff --git a/archival/lzop.c b/archival/lzop.c
index a5fc01941..202de4d03 100644
--- a/archival/lzop.c
+++ b/archival/lzop.c
@@ -71,6 +71,7 @@
71//usage: "\n -F Don't store or verify checksum" 71//usage: "\n -F Don't store or verify checksum"
72 72
73#include "libbb.h" 73#include "libbb.h"
74#include "common_bufsiz.h"
74#include "bb_archive.h" 75#include "bb_archive.h"
75#include "liblzo_interface.h" 76#include "liblzo_interface.h"
76 77
@@ -443,8 +444,8 @@ struct globals {
443 chksum_t chksum_in; 444 chksum_t chksum_in;
444 chksum_t chksum_out; 445 chksum_t chksum_out;
445} FIX_ALIASING; 446} FIX_ALIASING;
446#define G (*(struct globals*)&bb_common_bufsiz1) 447#define G (*(struct globals*)bb_common_bufsiz1)
447#define INIT_G() do { } while (0) 448#define INIT_G() do { setup_common_bufsiz(); } while (0)
448//#define G (*ptr_to_globals) 449//#define G (*ptr_to_globals)
449//#define INIT_G() do { 450//#define INIT_G() do {
450// SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); 451// SET_PTR_TO_GLOBALS(xzalloc(sizeof(G)));
@@ -895,7 +896,7 @@ static NOINLINE int lzo_decompress(const header_t *h)
895 * chksum_out 896 * chksum_out
896 * The rest is identical. 897 * The rest is identical.
897*/ 898*/
898static const unsigned char lzop_magic[9] = { 899static const unsigned char lzop_magic[9] ALIGN1 = {
899 0x89, 0x4c, 0x5a, 0x4f, 0x00, 0x0d, 0x0a, 0x1a, 0x0a 900 0x89, 0x4c, 0x5a, 0x4f, 0x00, 0x0d, 0x0a, 0x1a, 0x0a
900}; 901};
901 902
diff --git a/archival/rpm.c b/archival/rpm.c
index 105394481..83160f975 100644
--- a/archival/rpm.c
+++ b/archival/rpm.c
@@ -29,6 +29,7 @@
29//usage: "\n -qpc List config files" 29//usage: "\n -qpc List config files"
30 30
31#include "libbb.h" 31#include "libbb.h"
32#include "common_bufsiz.h"
32#include "bb_archive.h" 33#include "bb_archive.h"
33#include "rpm.h" 34#include "rpm.h"
34 35
@@ -93,8 +94,8 @@ struct globals {
93 rpm_index **mytags; 94 rpm_index **mytags;
94 int tagcount; 95 int tagcount;
95} FIX_ALIASING; 96} FIX_ALIASING;
96#define G (*(struct globals*)&bb_common_bufsiz1) 97#define G (*(struct globals*)bb_common_bufsiz1)
97#define INIT_G() do { } while (0) 98#define INIT_G() do { setup_common_bufsiz(); } while (0)
98 99
99static void extract_cpio(int fd, const char *source_rpm) 100static void extract_cpio(int fd, const char *source_rpm)
100{ 101{
diff --git a/archival/tar.c b/archival/tar.c
index adb0b934f..c88957734 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -146,6 +146,7 @@
146 146
147#include <fnmatch.h> 147#include <fnmatch.h>
148#include "libbb.h" 148#include "libbb.h"
149#include "common_bufsiz.h"
149#include "bb_archive.h" 150#include "bb_archive.h"
150/* FIXME: Stop using this non-standard feature */ 151/* FIXME: Stop using this non-standard feature */
151#ifndef FNM_LEADING_DIR 152#ifndef FNM_LEADING_DIR
@@ -161,6 +162,7 @@
161 162
162 163
163#define block_buf bb_common_bufsiz1 164#define block_buf bb_common_bufsiz1
165#define INIT_G() do { setup_common_bufsiz(); } while (0)
164 166
165 167
166#if ENABLE_FEATURE_TAR_CREATE 168#if ENABLE_FEATURE_TAR_CREATE
@@ -992,6 +994,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
992#if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM 994#if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM
993 llist_t *excludes = NULL; 995 llist_t *excludes = NULL;
994#endif 996#endif
997 INIT_G();
995 998
996 /* Initialise default values */ 999 /* Initialise default values */
997 tar_handle = init_handle(); 1000 tar_handle = init_handle();
diff --git a/archival/unzip.c b/archival/unzip.c
index 203073434..27adb3420 100644
--- a/archival/unzip.c
+++ b/archival/unzip.c
@@ -48,6 +48,12 @@
48#pragma pack(2) 48#pragma pack(2)
49#endif 49#endif
50 50
51#if 0
52# define dbg(...) bb_error_msg(__VA_ARGS__)
53#else
54# define dbg(...) ((void)0)
55#endif
56
51enum { 57enum {
52#if BB_BIG_ENDIAN 58#if BB_BIG_ENDIAN
53 ZIP_FILEHEADER_MAGIC = 0x504b0304, 59 ZIP_FILEHEADER_MAGIC = 0x504b0304,
@@ -196,15 +202,17 @@ static uint32_t find_cdf_offset(void)
196 unsigned char *p; 202 unsigned char *p;
197 off_t end; 203 off_t end;
198 unsigned char *buf = xzalloc(PEEK_FROM_END); 204 unsigned char *buf = xzalloc(PEEK_FROM_END);
205 uint32_t found;
199 206
200 end = xlseek(zip_fd, 0, SEEK_END); 207 end = xlseek(zip_fd, 0, SEEK_END);
201 end -= PEEK_FROM_END; 208 end -= PEEK_FROM_END;
202 if (end < 0) 209 if (end < 0)
203 end = 0; 210 end = 0;
204 xlseek(zip_fd, end, SEEK_SET); 211 dbg("Looking for cdf_offset starting from 0x%"OFF_FMT"x", end);
212 xlseek(zip_fd, end, SEEK_SET);
205 full_read(zip_fd, buf, PEEK_FROM_END); 213 full_read(zip_fd, buf, PEEK_FROM_END);
206 214
207 cde_header.formatted.cdf_offset = BAD_CDF_OFFSET; 215 found = BAD_CDF_OFFSET;
208 p = buf; 216 p = buf;
209 while (p <= buf + PEEK_FROM_END - CDE_HEADER_LEN - 4) { 217 while (p <= buf + PEEK_FROM_END - CDE_HEADER_LEN - 4) {
210 if (*p != 'P') { 218 if (*p != 'P') {
@@ -223,14 +231,25 @@ static uint32_t find_cdf_offset(void)
223 /* 231 /*
224 * I've seen .ZIP files with seemingly valid CDEs 232 * I've seen .ZIP files with seemingly valid CDEs
225 * where cdf_offset points past EOF - ?? 233 * where cdf_offset points past EOF - ??
226 * Ignore such CDEs: 234 * This check ignores such CDEs:
227 */ 235 */
228 if (cde_header.formatted.cdf_offset < end + (p - buf)) 236 if (cde_header.formatted.cdf_offset < end + (p - buf)) {
229 break; 237 found = cde_header.formatted.cdf_offset;
230 cde_header.formatted.cdf_offset = BAD_CDF_OFFSET; 238 dbg("Possible cdf_offset:0x%x at 0x%"OFF_FMT"x",
239 (unsigned)found, end + (p-3 - buf));
240 dbg(" cdf_offset+cdf_size:0x%x",
241 (unsigned)(found + SWAP_LE32(cde_header.formatted.cdf_size)));
242 /*
243 * We do not "break" here because only the last CDE is valid.
244 * I've seen a .zip archive which contained a .zip file,
245 * uncompressed, and taking the first CDE was using
246 * the CDE inside that file!
247 */
248 }
231 } 249 }
232 free(buf); 250 free(buf);
233 return cde_header.formatted.cdf_offset; 251 dbg("Found cdf_offset:0x%x", (unsigned)found);
252 return found;
234}; 253};
235 254
236static uint32_t read_next_cdf(uint32_t cdf_offset, cdf_header_t *cdf_ptr) 255static uint32_t read_next_cdf(uint32_t cdf_offset, cdf_header_t *cdf_ptr)
@@ -243,15 +262,22 @@ static uint32_t read_next_cdf(uint32_t cdf_offset, cdf_header_t *cdf_ptr)
243 cdf_offset = find_cdf_offset(); 262 cdf_offset = find_cdf_offset();
244 263
245 if (cdf_offset != BAD_CDF_OFFSET) { 264 if (cdf_offset != BAD_CDF_OFFSET) {
265 dbg("Reading CDF at 0x%x", (unsigned)cdf_offset);
246 xlseek(zip_fd, cdf_offset + 4, SEEK_SET); 266 xlseek(zip_fd, cdf_offset + 4, SEEK_SET);
247 xread(zip_fd, cdf_ptr->raw, CDF_HEADER_LEN); 267 xread(zip_fd, cdf_ptr->raw, CDF_HEADER_LEN);
248 FIX_ENDIANNESS_CDF(*cdf_ptr); 268 FIX_ENDIANNESS_CDF(*cdf_ptr);
269 dbg(" file_name_length:%u extra_field_length:%u file_comment_length:%u",
270 (unsigned)cdf_ptr->formatted.file_name_length,
271 (unsigned)cdf_ptr->formatted.extra_field_length,
272 (unsigned)cdf_ptr->formatted.file_comment_length
273 );
249 cdf_offset += 4 + CDF_HEADER_LEN 274 cdf_offset += 4 + CDF_HEADER_LEN
250 + cdf_ptr->formatted.file_name_length 275 + cdf_ptr->formatted.file_name_length
251 + cdf_ptr->formatted.extra_field_length 276 + cdf_ptr->formatted.extra_field_length
252 + cdf_ptr->formatted.file_comment_length; 277 + cdf_ptr->formatted.file_comment_length;
253 } 278 }
254 279
280 dbg("Returning file position to 0x%"OFF_FMT"x", org);
255 xlseek(zip_fd, org, SEEK_SET); 281 xlseek(zip_fd, org, SEEK_SET);
256 return cdf_offset; 282 return cdf_offset;
257}; 283};
@@ -464,7 +490,7 @@ int unzip_main(int argc, char **argv)
464 if (overwrite == O_PROMPT) 490 if (overwrite == O_PROMPT)
465 overwrite = O_NEVER; 491 overwrite = O_NEVER;
466 } else { 492 } else {
467 static const char extn[][5] = { ".zip", ".ZIP" }; 493 static const char extn[][5] ALIGN1 = { ".zip", ".ZIP" };
468 char *ext = src_fn + strlen(src_fn); 494 char *ext = src_fn + strlen(src_fn);
469 int src_fd; 495 int src_fd;
470 496
@@ -491,11 +517,11 @@ int unzip_main(int argc, char **argv)
491 printf("Archive: %s\n", src_fn); 517 printf("Archive: %s\n", src_fn);
492 if (listing) { 518 if (listing) {
493 puts(verbose ? 519 puts(verbose ?
494 " Length Method Size Ratio Date Time CRC-32 Name\n" 520 " Length Method Size Cmpr Date Time CRC-32 Name\n"
495 "-------- ------ ------- ----- ---- ---- ------ ----" 521 "-------- ------ ------- ---- ---------- ----- -------- ----"
496 : 522 :
497 " Length Date Time Name\n" 523 " Length Date Time Name\n"
498 " -------- ---- ---- ----" 524 "--------- ---------- ----- ----"
499 ); 525 );
500 } 526 }
501 } 527 }
@@ -535,11 +561,14 @@ int unzip_main(int argc, char **argv)
535 /* Check magic number */ 561 /* Check magic number */
536 xread(zip_fd, &magic, 4); 562 xread(zip_fd, &magic, 4);
537 /* Central directory? It's at the end, so exit */ 563 /* Central directory? It's at the end, so exit */
538 if (magic == ZIP_CDF_MAGIC) 564 if (magic == ZIP_CDF_MAGIC) {
565 dbg("got ZIP_CDF_MAGIC");
539 break; 566 break;
567 }
540#if ENABLE_DESKTOP 568#if ENABLE_DESKTOP
541 /* Data descriptor? It was a streaming file, go on */ 569 /* Data descriptor? It was a streaming file, go on */
542 if (magic == ZIP_DD_MAGIC) { 570 if (magic == ZIP_DD_MAGIC) {
571 dbg("got ZIP_DD_MAGIC");
543 /* skip over duplicate crc32, cmpsize and ucmpsize */ 572 /* skip over duplicate crc32, cmpsize and ucmpsize */
544 unzip_skip(3 * 4); 573 unzip_skip(3 * 4);
545 continue; 574 continue;
@@ -547,6 +576,7 @@ int unzip_main(int argc, char **argv)
547#endif 576#endif
548 if (magic != ZIP_FILEHEADER_MAGIC) 577 if (magic != ZIP_FILEHEADER_MAGIC)
549 bb_error_msg_and_die("invalid zip magic %08X", (int)magic); 578 bb_error_msg_and_die("invalid zip magic %08X", (int)magic);
579 dbg("got ZIP_FILEHEADER_MAGIC");
550 580
551 /* Read the file header */ 581 /* Read the file header */
552 xread(zip_fd, zip_header.raw, ZIP_HEADER_LEN); 582 xread(zip_fd, zip_header.raw, ZIP_HEADER_LEN);
@@ -590,6 +620,11 @@ int unzip_main(int argc, char **argv)
590 bb_error_msg_and_die("can't find file table"); 620 bb_error_msg_and_die("can't find file table");
591 } 621 }
592#endif 622#endif
623 dbg("File cmpsize:0x%x extra_len:0x%x ucmpsize:0x%x",
624 (unsigned)zip_header.formatted.cmpsize,
625 (unsigned)zip_header.formatted.extra_len,
626 (unsigned)zip_header.formatted.ucmpsize
627 );
593 628
594 /* Read filename */ 629 /* Read filename */
595 free(dst_fn); 630 free(dst_fn);
@@ -610,40 +645,55 @@ int unzip_main(int argc, char **argv)
610 } else { 645 } else {
611 if (listing) { 646 if (listing) {
612 /* List entry */ 647 /* List entry */
613 unsigned dostime = zip_header.formatted.modtime | (zip_header.formatted.moddate << 16); 648 char dtbuf[sizeof("mm-dd-yyyy hh:mm")];
649 sprintf(dtbuf, "%02u-%02u-%04u %02u:%02u",
650 (zip_header.formatted.moddate >> 5) & 0xf, // mm: 0x01e0
651 (zip_header.formatted.moddate) & 0x1f, // dd: 0x001f
652 (zip_header.formatted.moddate >> 9) + 1980, // yy: 0xfe00
653 (zip_header.formatted.modtime >> 11), // hh: 0xf800
654 (zip_header.formatted.modtime >> 5) & 0x3f // mm: 0x07e0
655 // seconds/2 are not shown, encoded in ----------- 0x001f
656 );
614 if (!verbose) { 657 if (!verbose) {
615 // " Length Date Time Name\n" 658 // " Length Date Time Name\n"
616 // " -------- ---- ---- ----" 659 // "--------- ---------- ----- ----"
617 printf( "%9u %02u-%02u-%02u %02u:%02u %s\n", 660 printf( "%9u " "%s " "%s\n",
618 (unsigned)zip_header.formatted.ucmpsize, 661 (unsigned)zip_header.formatted.ucmpsize,
619 (dostime & 0x01e00000) >> 21, 662 dtbuf,
620 (dostime & 0x001f0000) >> 16,
621 (((dostime & 0xfe000000) >> 25) + 1980) % 100,
622 (dostime & 0x0000f800) >> 11,
623 (dostime & 0x000007e0) >> 5,
624 dst_fn); 663 dst_fn);
625 total_usize += zip_header.formatted.ucmpsize;
626 } else { 664 } else {
627 unsigned long percents = zip_header.formatted.ucmpsize - zip_header.formatted.cmpsize; 665 unsigned long percents = zip_header.formatted.ucmpsize - zip_header.formatted.cmpsize;
666 if ((int32_t)percents < 0)
667 percents = 0; /* happens if ucmpsize < cmpsize */
628 percents = percents * 100; 668 percents = percents * 100;
629 if (zip_header.formatted.ucmpsize) 669 if (zip_header.formatted.ucmpsize)
630 percents /= zip_header.formatted.ucmpsize; 670 percents /= zip_header.formatted.ucmpsize;
631 // " Length Method Size Ratio Date Time CRC-32 Name\n" 671 // " Length Method Size Cmpr Date Time CRC-32 Name\n"
632 // "-------- ------ ------- ----- ---- ---- ------ ----" 672 // "-------- ------ ------- ---- ---------- ----- -------- ----"
633 printf( "%8u Defl:N" "%9u%4u%% %02u-%02u-%02u %02u:%02u %08x %s\n", 673 printf( "%8u %s" "%9u%4u%% " "%s " "%08x " "%s\n",
634 (unsigned)zip_header.formatted.ucmpsize, 674 (unsigned)zip_header.formatted.ucmpsize,
675 zip_header.formatted.method == 0 ? "Stored" : "Defl:N", /* Defl is method 8 */
676/* TODO: show other methods?
677 * 1 - Shrunk
678 * 2 - Reduced with compression factor 1
679 * 3 - Reduced with compression factor 2
680 * 4 - Reduced with compression factor 3
681 * 5 - Reduced with compression factor 4
682 * 6 - Imploded
683 * 7 - Reserved for Tokenizing compression algorithm
684 * 9 - Deflate64
685 * 10 - PKWARE Data Compression Library Imploding
686 * 11 - Reserved by PKWARE
687 * 12 - BZIP2
688 */
635 (unsigned)zip_header.formatted.cmpsize, 689 (unsigned)zip_header.formatted.cmpsize,
636 (unsigned)percents, 690 (unsigned)percents,
637 (dostime & 0x01e00000) >> 21, 691 dtbuf,
638 (dostime & 0x001f0000) >> 16,
639 (((dostime & 0xfe000000) >> 25) + 1980) % 100,
640 (dostime & 0x0000f800) >> 11,
641 (dostime & 0x000007e0) >> 5,
642 zip_header.formatted.crc32, 692 zip_header.formatted.crc32,
643 dst_fn); 693 dst_fn);
644 total_usize += zip_header.formatted.ucmpsize;
645 total_size += zip_header.formatted.cmpsize; 694 total_size += zip_header.formatted.cmpsize;
646 } 695 }
696 total_usize += zip_header.formatted.ucmpsize;
647 i = 'n'; 697 i = 'n';
648 } else if (dst_fd == STDOUT_FILENO) { 698 } else if (dst_fd == STDOUT_FILENO) {
649 /* Extracting to STDOUT */ 699 /* Extracting to STDOUT */
@@ -746,21 +796,25 @@ int unzip_main(int argc, char **argv)
746 796
747 if (listing && quiet <= 1) { 797 if (listing && quiet <= 1) {
748 if (!verbose) { 798 if (!verbose) {
749 // " Length Date Time Name\n" 799 // " Length Date Time Name\n"
750 // " -------- ---- ---- ----" 800 // "--------- ---------- ----- ----"
751 printf( " -------- -------\n" 801 printf( " --------%21s" "-------\n"
752 "%9lu" " %u files\n", 802 "%9lu%21s" "%u files\n",
753 total_usize, total_entries); 803 "",
804 total_usize, "", total_entries);
754 } else { 805 } else {
755 unsigned long percents = total_usize - total_size; 806 unsigned long percents = total_usize - total_size;
807 if ((long)percents < 0)
808 percents = 0; /* happens if usize < size */
756 percents = percents * 100; 809 percents = percents * 100;
757 if (total_usize) 810 if (total_usize)
758 percents /= total_usize; 811 percents /= total_usize;
759 // " Length Method Size Ratio Date Time CRC-32 Name\n" 812 // " Length Method Size Cmpr Date Time CRC-32 Name\n"
760 // "-------- ------ ------- ----- ---- ---- ------ ----" 813 // "-------- ------ ------- ---- ---------- ----- -------- ----"
761 printf( "-------- ------- --- -------\n" 814 printf( "-------- ------- ----%28s" "----\n"
762 "%8lu" "%17lu%4u%% %u files\n", 815 "%8lu" "%17lu%4u%%%28s" "%u files\n",
763 total_usize, total_size, (unsigned)percents, 816 "",
817 total_usize, total_size, (unsigned)percents, "",
764 total_entries); 818 total_entries);
765 } 819 }
766 } 820 }
diff --git a/console-tools/dumpkmap.c b/console-tools/dumpkmap.c
index bf8d690da..b6fd466dc 100644
--- a/console-tools/dumpkmap.c
+++ b/console-tools/dumpkmap.c
@@ -18,6 +18,7 @@
18//usage: "$ dumpkmap > keymap\n" 18//usage: "$ dumpkmap > keymap\n"
19 19
20#include "libbb.h" 20#include "libbb.h"
21#include "common_bufsiz.h"
21 22
22/* From <linux/kd.h> */ 23/* From <linux/kd.h> */
23struct kbentry { 24struct kbentry {
@@ -37,6 +38,7 @@ int dumpkmap_main(int argc UNUSED_PARAM, char **argv)
37 struct kbentry ke; 38 struct kbentry ke;
38 int i, j, fd; 39 int i, j, fd;
39#define flags bb_common_bufsiz1 40#define flags bb_common_bufsiz1
41 setup_common_bufsiz();
40 42
41 /* When user accidentally runs "dumpkmap FILE" 43 /* When user accidentally runs "dumpkmap FILE"
42 * instead of "dumpkmap >FILE", we'd dump binary stuff to tty. 44 * instead of "dumpkmap >FILE", we'd dump binary stuff to tty.
diff --git a/console-tools/resize.c b/console-tools/resize.c
index 4b0d63a03..a3342a195 100644
--- a/console-tools/resize.c
+++ b/console-tools/resize.c
@@ -14,10 +14,12 @@
14//usage: "Resize the screen" 14//usage: "Resize the screen"
15 15
16#include "libbb.h" 16#include "libbb.h"
17#include "common_bufsiz.h"
17 18
18#define ESC "\033" 19#define ESC "\033"
19 20
20#define old_termios_p ((struct termios*)&bb_common_bufsiz1) 21#define old_termios_p ((struct termios*)bb_common_bufsiz1)
22#define INIT_G() do { setup_common_bufsiz(); } while (0)
21 23
22static void 24static void
23onintr(int sig UNUSED_PARAM) 25onintr(int sig UNUSED_PARAM)
@@ -33,6 +35,8 @@ int resize_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
33 struct winsize w = { 0, 0, 0, 0 }; 35 struct winsize w = { 0, 0, 0, 0 };
34 int ret; 36 int ret;
35 37
38 INIT_G();
39
36 /* We use _stderr_ in order to make resize usable 40 /* We use _stderr_ in order to make resize usable
37 * in shell backticks (those redirect stdout away from tty). 41 * in shell backticks (those redirect stdout away from tty).
38 * NB: other versions of resize open "/dev/tty" 42 * NB: other versions of resize open "/dev/tty"
diff --git a/coreutils/catv.c b/coreutils/catv.c
index 6bb73ba63..0e71368a5 100644
--- a/coreutils/catv.c
+++ b/coreutils/catv.c
@@ -19,6 +19,7 @@
19//usage: "\n -v Don't use ^x or M-x escapes" 19//usage: "\n -v Don't use ^x or M-x escapes"
20 20
21#include "libbb.h" 21#include "libbb.h"
22#include "common_bufsiz.h"
22 23
23#define CATV_OPT_e (1<<0) 24#define CATV_OPT_e (1<<0)
24#define CATV_OPT_t (1<<1) 25#define CATV_OPT_t (1<<1)
@@ -48,6 +49,9 @@ int catv_main(int argc UNUSED_PARAM, char **argv)
48 /* Read from stdin if there's nothing else to do. */ 49 /* Read from stdin if there's nothing else to do. */
49 if (!argv[0]) 50 if (!argv[0])
50 *--argv = (char*)"-"; 51 *--argv = (char*)"-";
52
53#define read_buf bb_common_bufsiz1
54 setup_common_bufsiz();
51 do { 55 do {
52 fd = open_or_warn_stdin(*argv); 56 fd = open_or_warn_stdin(*argv);
53 if (fd < 0) { 57 if (fd < 0) {
@@ -57,7 +61,6 @@ int catv_main(int argc UNUSED_PARAM, char **argv)
57 for (;;) { 61 for (;;) {
58 int i, res; 62 int i, res;
59 63
60#define read_buf bb_common_bufsiz1
61 res = read(fd, read_buf, COMMON_BUFSIZE); 64 res = read(fd, read_buf, COMMON_BUFSIZE);
62 if (res < 0) 65 if (res < 0)
63 retval = EXIT_FAILURE; 66 retval = EXIT_FAILURE;
diff --git a/coreutils/cksum.c b/coreutils/cksum.c
index ac0b0c319..8a8a39f68 100644
--- a/coreutils/cksum.c
+++ b/coreutils/cksum.c
@@ -13,6 +13,7 @@
13//usage: "Calculate the CRC32 checksums of FILES" 13//usage: "Calculate the CRC32 checksums of FILES"
14 14
15#include "libbb.h" 15#include "libbb.h"
16#include "common_bufsiz.h"
16 17
17/* This is a NOEXEC applet. Be very careful! */ 18/* This is a NOEXEC applet. Be very careful! */
18 19
@@ -32,6 +33,7 @@ int cksum_main(int argc UNUSED_PARAM, char **argv)
32 argv++; 33 argv++;
33#endif 34#endif
34 35
36 setup_common_bufsiz();
35 do { 37 do {
36 int fd = open_or_warn_stdin(*argv ? *argv : bb_msg_standard_input); 38 int fd = open_or_warn_stdin(*argv ? *argv : bb_msg_standard_input);
37 39
@@ -43,7 +45,7 @@ int cksum_main(int argc UNUSED_PARAM, char **argv)
43 length = 0; 45 length = 0;
44 46
45#define read_buf bb_common_bufsiz1 47#define read_buf bb_common_bufsiz1
46 while ((bytes_read = safe_read(fd, read_buf, sizeof(read_buf))) > 0) { 48 while ((bytes_read = safe_read(fd, read_buf, COMMON_BUFSIZE)) > 0) {
47 length += bytes_read; 49 length += bytes_read;
48 crc = crc32_block_endian1(crc, read_buf, bytes_read, crc32_table); 50 crc = crc32_block_endian1(crc, read_buf, bytes_read, crc32_table);
49 } 51 }
diff --git a/coreutils/date.c b/coreutils/date.c
index 7965775fe..ff3214d85 100644
--- a/coreutils/date.c
+++ b/coreutils/date.c
@@ -138,6 +138,7 @@
138//usage: "Wed Apr 12 18:52:41 MDT 2000\n" 138//usage: "Wed Apr 12 18:52:41 MDT 2000\n"
139 139
140#include "libbb.h" 140#include "libbb.h"
141#include "common_bufsiz.h"
141#if ENABLE_FEATURE_DATE_NANO 142#if ENABLE_FEATURE_DATE_NANO
142# include <sys/syscall.h> 143# include <sys/syscall.h>
143#endif 144#endif
@@ -368,6 +369,7 @@ int date_main(int argc UNUSED_PARAM, char **argv)
368#endif 369#endif
369 370
370#define date_buf bb_common_bufsiz1 371#define date_buf bb_common_bufsiz1
372 setup_common_bufsiz();
371 if (*fmt_dt2str == '\0') { 373 if (*fmt_dt2str == '\0') {
372 /* With no format string, just print a blank line */ 374 /* With no format string, just print a blank line */
373 date_buf[0] = '\0'; 375 date_buf[0] = '\0';
@@ -377,7 +379,7 @@ int date_main(int argc UNUSED_PARAM, char **argv)
377 fmt_dt2str = (char*)"%Y.%m.%d-%H:%M:%S"; 379 fmt_dt2str = (char*)"%Y.%m.%d-%H:%M:%S";
378 } 380 }
379 /* Generate output string */ 381 /* Generate output string */
380 strftime(date_buf, sizeof(date_buf), fmt_dt2str, &tm_time); 382 strftime(date_buf, COMMON_BUFSIZE, fmt_dt2str, &tm_time);
381 } 383 }
382 puts(date_buf); 384 puts(date_buf);
383 385
diff --git a/coreutils/dd.c b/coreutils/dd.c
index 7bd3e2084..00139773e 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -91,6 +91,7 @@
91//usage: "4+0 records out\n" 91//usage: "4+0 records out\n"
92 92
93#include "libbb.h" 93#include "libbb.h"
94#include "common_bufsiz.h"
94 95
95/* This is a NOEXEC applet. Be very careful! */ 96/* This is a NOEXEC applet. Be very careful! */
96 97
@@ -108,8 +109,9 @@ struct globals {
108#endif 109#endif
109 int flags; 110 int flags;
110} FIX_ALIASING; 111} FIX_ALIASING;
111#define G (*(struct globals*)&bb_common_bufsiz1) 112#define G (*(struct globals*)bb_common_bufsiz1)
112#define INIT_G() do { \ 113#define INIT_G() do { \
114 setup_common_bufsiz(); \
113 /* we have to zero it out because of NOEXEC */ \ 115 /* we have to zero it out because of NOEXEC */ \
114 memset(&G, 0, sizeof(G)); \ 116 memset(&G, 0, sizeof(G)); \
115} while (0) 117} while (0)
diff --git a/coreutils/du.c b/coreutils/du.c
index 1889c16bb..1240bcbbc 100644
--- a/coreutils/du.c
+++ b/coreutils/du.c
@@ -58,6 +58,7 @@
58//usage: "2417 .\n" 58//usage: "2417 .\n"
59 59
60#include "libbb.h" 60#include "libbb.h"
61#include "common_bufsiz.h"
61 62
62enum { 63enum {
63 OPT_a_files_too = (1 << 0), 64 OPT_a_files_too = (1 << 0),
@@ -85,8 +86,8 @@ struct globals {
85 int du_depth; 86 int du_depth;
86 dev_t dir_dev; 87 dev_t dir_dev;
87} FIX_ALIASING; 88} FIX_ALIASING;
88#define G (*(struct globals*)&bb_common_bufsiz1) 89#define G (*(struct globals*)bb_common_bufsiz1)
89#define INIT_G() do { } while (0) 90#define INIT_G() do { setup_common_bufsiz(); } while (0)
90 91
91 92
92static void print(unsigned long long size, const char *filename) 93static void print(unsigned long long size, const char *filename)
diff --git a/coreutils/expr.c b/coreutils/expr.c
index c986f9327..ce6b2d189 100644
--- a/coreutils/expr.c
+++ b/coreutils/expr.c
@@ -61,6 +61,7 @@
61//usage: "of characters matched or 0." 61//usage: "of characters matched or 0."
62 62
63#include "libbb.h" 63#include "libbb.h"
64#include "common_bufsiz.h"
64#include "xregex.h" 65#include "xregex.h"
65 66
66#if ENABLE_EXPR_MATH_SUPPORT_64 67#if ENABLE_EXPR_MATH_SUPPORT_64
@@ -99,8 +100,8 @@ typedef struct valinfo VALUE;
99struct globals { 100struct globals {
100 char **args; 101 char **args;
101} FIX_ALIASING; 102} FIX_ALIASING;
102#define G (*(struct globals*)&bb_common_bufsiz1) 103#define G (*(struct globals*)bb_common_bufsiz1)
103#define INIT_G() do { } while (0) 104#define INIT_G() do { setup_common_bufsiz(); } while (0)
104 105
105/* forward declarations */ 106/* forward declarations */
106static VALUE *eval(void); 107static VALUE *eval(void);
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 20bd61860..344b4e61e 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -93,6 +93,7 @@
93//usage: ) 93//usage: )
94 94
95#include "libbb.h" 95#include "libbb.h"
96#include "common_bufsiz.h"
96#include "unicode.h" 97#include "unicode.h"
97 98
98 99
@@ -365,8 +366,9 @@ struct globals {
365 time_t current_time_t; 366 time_t current_time_t;
366#endif 367#endif
367} FIX_ALIASING; 368} FIX_ALIASING;
368#define G (*(struct globals*)&bb_common_bufsiz1) 369#define G (*(struct globals*)bb_common_bufsiz1)
369#define INIT_G() do { \ 370#define INIT_G() do { \
371 setup_common_bufsiz(); \
370 /* we have to zero it out because of NOEXEC */ \ 372 /* we have to zero it out because of NOEXEC */ \
371 memset(&G, 0, sizeof(G)); \ 373 memset(&G, 0, sizeof(G)); \
372 IF_FEATURE_AUTOWIDTH(G_terminal_width = TERMINAL_WIDTH;) \ 374 IF_FEATURE_AUTOWIDTH(G_terminal_width = TERMINAL_WIDTH;) \
diff --git a/coreutils/od_bloaty.c b/coreutils/od_bloaty.c
index 3e0423a3d..a5b3e99f7 100644
--- a/coreutils/od_bloaty.c
+++ b/coreutils/od_bloaty.c
@@ -20,6 +20,7 @@
20 20
21 21
22/* #include "libbb.h" - done in od.c */ 22/* #include "libbb.h" - done in od.c */
23#include "common_bufsiz.h"
23#define assert(a) ((void)0) 24#define assert(a) ((void)0)
24 25
25 26
@@ -221,8 +222,9 @@ struct globals {
221#if !ENABLE_LONG_OPTS 222#if !ENABLE_LONG_OPTS
222enum { G_pseudo_offset = 0 }; 223enum { G_pseudo_offset = 0 };
223#endif 224#endif
224#define G (*(struct globals*)&bb_common_bufsiz1) 225#define G (*(struct globals*)bb_common_bufsiz1)
225#define INIT_G() do { \ 226#define INIT_G() do { \
227 setup_common_bufsiz(); \
226 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 228 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
227 G.bytes_per_block = 32; \ 229 G.bytes_per_block = 32; \
228} while (0) 230} while (0)
diff --git a/coreutils/split.c b/coreutils/split.c
index 1e1673efb..e67c3de66 100644
--- a/coreutils/split.c
+++ b/coreutils/split.c
@@ -22,6 +22,7 @@
22//usage: "$ cat TODO | split -a 2 -l 2 TODO_\n" 22//usage: "$ cat TODO | split -a 2 -l 2 TODO_\n"
23 23
24#include "libbb.h" 24#include "libbb.h"
25#include "common_bufsiz.h"
25 26
26#if ENABLE_FEATURE_SPLIT_FANCY 27#if ENABLE_FEATURE_SPLIT_FANCY
27static const struct suffix_mult split_suffixes[] = { 28static const struct suffix_mult split_suffixes[] = {
@@ -78,6 +79,8 @@ int split_main(int argc UNUSED_PARAM, char **argv)
78 ssize_t bytes_read, to_write; 79 ssize_t bytes_read, to_write;
79 char *src; 80 char *src;
80 81
82 setup_common_bufsiz();
83
81 opt_complementary = "?2:a+"; /* max 2 args; -a N */ 84 opt_complementary = "?2:a+"; /* max 2 args; -a N */
82 opt = getopt32(argv, "l:b:a:", &count_p, &count_p, &suffix_len); 85 opt = getopt32(argv, "l:b:a:", &count_p, &count_p, &suffix_len);
83 86
diff --git a/coreutils/stat.c b/coreutils/stat.c
index be2723d13..f608045d7 100644
--- a/coreutils/stat.c
+++ b/coreutils/stat.c
@@ -102,6 +102,7 @@
102//usage: ) 102//usage: )
103 103
104#include "libbb.h" 104#include "libbb.h"
105#include "common_bufsiz.h"
105 106
106enum { 107enum {
107 OPT_TERSE = (1 << 0), 108 OPT_TERSE = (1 << 0),
@@ -157,8 +158,8 @@ static const char *human_time(time_t t)
157 158
158 /*static char buf[sizeof("YYYY-MM-DD HH:MM:SS.000000000")] ALIGN1;*/ 159 /*static char buf[sizeof("YYYY-MM-DD HH:MM:SS.000000000")] ALIGN1;*/
159#define buf bb_common_bufsiz1 160#define buf bb_common_bufsiz1
160 161 setup_common_bufsiz();
161 strcpy(strftime_YYYYMMDDHHMMSS(buf, sizeof(buf), &t), ".000000000"); 162 strcpy(strftime_YYYYMMDDHHMMSS(buf, COMMON_BUFSIZE, &t), ".000000000");
162 return buf; 163 return buf;
163#undef buf 164#undef buf
164} 165}
diff --git a/coreutils/stty.c b/coreutils/stty.c
index b63b0b91a..52967ea8f 100644
--- a/coreutils/stty.c
+++ b/coreutils/stty.c
@@ -32,6 +32,7 @@
32//usage: "\n [SETTING] See manpage" 32//usage: "\n [SETTING] See manpage"
33 33
34#include "libbb.h" 34#include "libbb.h"
35#include "common_bufsiz.h"
35 36
36#ifndef _POSIX_VDISABLE 37#ifndef _POSIX_VDISABLE
37# define _POSIX_VDISABLE ((unsigned char) 0) 38# define _POSIX_VDISABLE ((unsigned char) 0)
@@ -317,7 +318,7 @@ enum {
317#define MI_ENTRY(N,T,F,B,M) N "\0" 318#define MI_ENTRY(N,T,F,B,M) N "\0"
318 319
319/* Mode names given on command line */ 320/* Mode names given on command line */
320static const char mode_name[] = 321static const char mode_name[] ALIGN1 =
321 MI_ENTRY("evenp", combination, REV | OMIT, 0, 0 ) 322 MI_ENTRY("evenp", combination, REV | OMIT, 0, 0 )
322 MI_ENTRY("parity", combination, REV | OMIT, 0, 0 ) 323 MI_ENTRY("parity", combination, REV | OMIT, 0, 0 )
323 MI_ENTRY("oddp", combination, REV | OMIT, 0, 0 ) 324 MI_ENTRY("oddp", combination, REV | OMIT, 0, 0 )
@@ -680,7 +681,7 @@ enum {
680#define CI_ENTRY(n,s,o) n "\0" 681#define CI_ENTRY(n,s,o) n "\0"
681 682
682/* Name given on command line */ 683/* Name given on command line */
683static const char control_name[] = 684static const char control_name[] ALIGN1 =
684 CI_ENTRY("intr", CINTR, VINTR ) 685 CI_ENTRY("intr", CINTR, VINTR )
685 CI_ENTRY("quit", CQUIT, VQUIT ) 686 CI_ENTRY("quit", CQUIT, VQUIT )
686 CI_ENTRY("erase", CERASE, VERASE ) 687 CI_ENTRY("erase", CERASE, VERASE )
@@ -722,7 +723,7 @@ static const char control_name[] =
722#undef CI_ENTRY 723#undef CI_ENTRY
723#define CI_ENTRY(n,s,o) { s, o }, 724#define CI_ENTRY(n,s,o) { s, o },
724 725
725static const struct control_info control_info[] = { 726static const struct control_info control_info[] ALIGN2 = {
726 /* This should be verbatim cut-n-paste copy of the above CI_ENTRYs */ 727 /* This should be verbatim cut-n-paste copy of the above CI_ENTRYs */
727 CI_ENTRY("intr", CINTR, VINTR ) 728 CI_ENTRY("intr", CINTR, VINTR )
728 CI_ENTRY("quit", CQUIT, VQUIT ) 729 CI_ENTRY("quit", CQUIT, VQUIT )
@@ -775,7 +776,7 @@ struct globals {
775 unsigned current_col; 776 unsigned current_col;
776 char buf[10]; 777 char buf[10];
777} FIX_ALIASING; 778} FIX_ALIASING;
778#define G (*(struct globals*)&bb_common_bufsiz1) 779#define G (*(struct globals*)bb_common_bufsiz1)
779#define INIT_G() do { \ 780#define INIT_G() do { \
780 G.device_name = bb_msg_standard_input; \ 781 G.device_name = bb_msg_standard_input; \
781 G.max_col = 80; \ 782 G.max_col = 80; \
diff --git a/coreutils/sum.c b/coreutils/sum.c
index deb068e10..ec9ed2a11 100644
--- a/coreutils/sum.c
+++ b/coreutils/sum.c
@@ -21,6 +21,7 @@
21//usage: "\n -s Use System V sum algorithm (512byte blocks)" 21//usage: "\n -s Use System V sum algorithm (512byte blocks)"
22 22
23#include "libbb.h" 23#include "libbb.h"
24#include "common_bufsiz.h"
24 25
25enum { SUM_BSD, PRINT_NAME, SUM_SYSV }; 26enum { SUM_BSD, PRINT_NAME, SUM_SYSV };
26 27
@@ -30,18 +31,20 @@ enum { SUM_BSD, PRINT_NAME, SUM_SYSV };
30/* Return 1 if successful. */ 31/* Return 1 if successful. */
31static unsigned sum_file(const char *file, unsigned type) 32static unsigned sum_file(const char *file, unsigned type)
32{ 33{
33#define buf bb_common_bufsiz1
34 unsigned long long total_bytes = 0; 34 unsigned long long total_bytes = 0;
35 int fd, r; 35 int fd, r;
36 /* The sum of all the input bytes, modulo (UINT_MAX + 1). */ 36 /* The sum of all the input bytes, modulo (UINT_MAX + 1). */
37 unsigned s = 0; 37 unsigned s = 0;
38 38
39#define buf bb_common_bufsiz1
40 setup_common_bufsiz();
41
39 fd = open_or_warn_stdin(file); 42 fd = open_or_warn_stdin(file);
40 if (fd == -1) 43 if (fd == -1)
41 return 0; 44 return 0;
42 45
43 while (1) { 46 while (1) {
44 size_t bytes_read = safe_read(fd, buf, BUFSIZ); 47 size_t bytes_read = safe_read(fd, buf, COMMON_BUFSIZE);
45 48
46 if ((ssize_t)bytes_read <= 0) { 49 if ((ssize_t)bytes_read <= 0) {
47 r = (fd && close(fd) != 0); 50 r = (fd && close(fd) != 0);
diff --git a/coreutils/tail.c b/coreutils/tail.c
index e352ab627..39f87679e 100644
--- a/coreutils/tail.c
+++ b/coreutils/tail.c
@@ -49,13 +49,14 @@
49//usage: "nameserver 10.0.0.1\n" 49//usage: "nameserver 10.0.0.1\n"
50 50
51#include "libbb.h" 51#include "libbb.h"
52#include "common_bufsiz.h"
52 53
53struct globals { 54struct globals {
54 bool from_top; 55 bool from_top;
55 bool exitcode; 56 bool exitcode;
56} FIX_ALIASING; 57} FIX_ALIASING;
57#define G (*(struct globals*)&bb_common_bufsiz1) 58#define G (*(struct globals*)bb_common_bufsiz1)
58#define INIT_G() do { } while (0) 59#define INIT_G() do { setup_common_bufsiz(); } while (0)
59 60
60static void tail_xprint_header(const char *fmt, const char *filename) 61static void tail_xprint_header(const char *fmt, const char *filename)
61{ 62{
diff --git a/coreutils/tee.c b/coreutils/tee.c
index 48cc0508f..a68e9446f 100644
--- a/coreutils/tee.c
+++ b/coreutils/tee.c
@@ -23,6 +23,7 @@
23//usage: "Hello\n" 23//usage: "Hello\n"
24 24
25#include "libbb.h" 25#include "libbb.h"
26#include "common_bufsiz.h"
26 27
27int tee_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 28int tee_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
28int tee_main(int argc, char **argv) 29int tee_main(int argc, char **argv)
@@ -37,6 +38,7 @@ int tee_main(int argc, char **argv)
37#if ENABLE_FEATURE_TEE_USE_BLOCK_IO 38#if ENABLE_FEATURE_TEE_USE_BLOCK_IO
38 ssize_t c; 39 ssize_t c;
39# define buf bb_common_bufsiz1 40# define buf bb_common_bufsiz1
41 setup_common_bufsiz();
40#else 42#else
41 int c; 43 int c;
42#endif 44#endif
@@ -79,7 +81,7 @@ int tee_main(int argc, char **argv)
79 /* names[0] will be filled later */ 81 /* names[0] will be filled later */
80 82
81#if ENABLE_FEATURE_TEE_USE_BLOCK_IO 83#if ENABLE_FEATURE_TEE_USE_BLOCK_IO
82 while ((c = safe_read(STDIN_FILENO, buf, sizeof(buf))) > 0) { 84 while ((c = safe_read(STDIN_FILENO, buf, COMMON_BUFSIZE)) > 0) {
83 fp = files; 85 fp = files;
84 do 86 do
85 fwrite(buf, 1, c, *fp); 87 fwrite(buf, 1, c, *fp);
diff --git a/debianutils/run_parts.c b/debianutils/run_parts.c
index 13617c6e1..c671b9252 100644
--- a/debianutils/run_parts.c
+++ b/debianutils/run_parts.c
@@ -89,17 +89,18 @@
89//usage: "+ shutdown -h +4m" 89//usage: "+ shutdown -h +4m"
90 90
91#include "libbb.h" 91#include "libbb.h"
92#include "common_bufsiz.h"
92 93
93struct globals { 94struct globals {
94 char **names; 95 char **names;
95 int cur; 96 int cur;
96 char *cmd[2 /* using 1 provokes compiler warning */]; 97 char *cmd[2 /* using 1 provokes compiler warning */];
97} FIX_ALIASING; 98} FIX_ALIASING;
98#define G (*(struct globals*)&bb_common_bufsiz1) 99#define G (*(struct globals*)bb_common_bufsiz1)
99#define names (G.names) 100#define names (G.names)
100#define cur (G.cur ) 101#define cur (G.cur )
101#define cmd (G.cmd ) 102#define cmd (G.cmd )
102#define INIT_G() do { } while (0) 103#define INIT_G() do { setup_common_bufsiz(); } while (0)
103 104
104enum { NUM_CMD = (COMMON_BUFSIZE - sizeof(G)) / sizeof(cmd[0]) - 1 }; 105enum { NUM_CMD = (COMMON_BUFSIZE - sizeof(G)) / sizeof(cmd[0]) - 1 };
105 106
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
index d7c730f45..3625ffee8 100644
--- a/debianutils/start_stop_daemon.c
+++ b/debianutils/start_stop_daemon.c
@@ -153,6 +153,7 @@ Misc options:
153/* Override ENABLE_FEATURE_PIDFILE */ 153/* Override ENABLE_FEATURE_PIDFILE */
154#define WANT_PIDFILE 1 154#define WANT_PIDFILE 1
155#include "libbb.h" 155#include "libbb.h"
156#include "common_bufsiz.h"
156 157
157struct pid_list { 158struct pid_list {
158 struct pid_list *next; 159 struct pid_list *next;
@@ -191,7 +192,7 @@ struct globals {
191 int user_id; 192 int user_id;
192 smallint signal_nr; 193 smallint signal_nr;
193} FIX_ALIASING; 194} FIX_ALIASING;
194#define G (*(struct globals*)&bb_common_bufsiz1) 195#define G (*(struct globals*)bb_common_bufsiz1)
195#define userspec (G.userspec ) 196#define userspec (G.userspec )
196#define cmdname (G.cmdname ) 197#define cmdname (G.cmdname )
197#define execname (G.execname ) 198#define execname (G.execname )
@@ -199,6 +200,7 @@ struct globals {
199#define user_id (G.user_id ) 200#define user_id (G.user_id )
200#define signal_nr (G.signal_nr ) 201#define signal_nr (G.signal_nr )
201#define INIT_G() do { \ 202#define INIT_G() do { \
203 setup_common_bufsiz(); \
202 user_id = -1; \ 204 user_id = -1; \
203 signal_nr = 15; \ 205 signal_nr = 15; \
204} while (0) 206} while (0)
diff --git a/e2fsprogs/e2fs_lib.c b/e2fsprogs/e2fs_lib.c
index a6aec9484..6ce655be3 100644
--- a/e2fsprogs/e2fs_lib.c
+++ b/e2fsprogs/e2fs_lib.c
@@ -149,14 +149,14 @@ const uint32_t e2attr_flags_value[] = {
149 EXT2_TOPDIR_FL 149 EXT2_TOPDIR_FL
150}; 150};
151 151
152const char e2attr_flags_sname[] = 152const char e2attr_flags_sname[] ALIGN1 =
153#ifdef ENABLE_COMPRESSION 153#ifdef ENABLE_COMPRESSION
154 "BZXE" 154 "BZXE"
155#endif 155#endif
156 "I" 156 "I"
157 "suSDiadAcjtT"; 157 "suSDiadAcjtT";
158 158
159static const char e2attr_flags_lname[] = 159static const char e2attr_flags_lname[] ALIGN1 =
160#ifdef ENABLE_COMPRESSION 160#ifdef ENABLE_COMPRESSION
161 "Compressed_File" "\0" 161 "Compressed_File" "\0"
162 "Compressed_Dirty_File" "\0" 162 "Compressed_Dirty_File" "\0"
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c
index 987d97528..59514a1a6 100644
--- a/e2fsprogs/fsck.c
+++ b/e2fsprogs/fsck.c
@@ -60,6 +60,7 @@
60//usage: "\n -t TYPE List of filesystem types to check" 60//usage: "\n -t TYPE List of filesystem types to check"
61 61
62#include "libbb.h" 62#include "libbb.h"
63#include "common_bufsiz.h"
63 64
64/* "progress indicator" code is somewhat buggy and ext[23] specific. 65/* "progress indicator" code is somewhat buggy and ext[23] specific.
65 * We should be filesystem agnostic. IOW: there should be a well-defined 66 * We should be filesystem agnostic. IOW: there should be a well-defined
@@ -169,8 +170,9 @@ struct globals {
169 struct fs_info *filesys_last; 170 struct fs_info *filesys_last;
170 struct fsck_instance *instance_list; 171 struct fsck_instance *instance_list;
171} FIX_ALIASING; 172} FIX_ALIASING;
172#define G (*(struct globals*)&bb_common_bufsiz1) 173#define G (*(struct globals*)bb_common_bufsiz1)
173#define INIT_G() do { \ 174#define INIT_G() do { \
175 setup_common_bufsiz(); \
174 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 176 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
175} while (0) 177} while (0)
176 178
diff --git a/editors/diff.c b/editors/diff.c
index a892cfdf2..ff269360f 100644
--- a/editors/diff.c
+++ b/editors/diff.c
@@ -125,6 +125,7 @@
125//usage: "\n -w Ignore all whitespace" 125//usage: "\n -w Ignore all whitespace"
126 126
127#include "libbb.h" 127#include "libbb.h"
128#include "common_bufsiz.h"
128 129
129#if 0 130#if 0
130# define dbg_error_msg(...) bb_error_msg(__VA_ARGS__) 131# define dbg_error_msg(...) bb_error_msg(__VA_ARGS__)
@@ -748,6 +749,7 @@ static int diffreg(char *file[2])
748 fp[i] = fdopen(fd, "r"); 749 fp[i] = fdopen(fd, "r");
749 } 750 }
750 751
752 setup_common_bufsiz();
751 while (1) { 753 while (1) {
752 const size_t sz = COMMON_BUFSIZE / 2; 754 const size_t sz = COMMON_BUFSIZE / 2;
753 char *const buf0 = bb_common_bufsiz1; 755 char *const buf0 = bb_common_bufsiz1;
diff --git a/editors/ed.c b/editors/ed.c
index a4c419099..c028b78cb 100644
--- a/editors/ed.c
+++ b/editors/ed.c
@@ -23,6 +23,7 @@
23//usage:#define ed_full_usage "" 23//usage:#define ed_full_usage ""
24 24
25#include "libbb.h" 25#include "libbb.h"
26#include "common_bufsiz.h"
26 27
27typedef struct LINE { 28typedef struct LINE {
28 struct LINE *next; 29 struct LINE *next;
@@ -35,8 +36,8 @@ typedef struct LINE {
35#define searchString bb_common_bufsiz1 36#define searchString bb_common_bufsiz1
36 37
37enum { 38enum {
38 USERSIZE = sizeof(searchString) > 1024 ? 1024 39 USERSIZE = COMMON_BUFSIZE > 1024 ? 1024
39 : sizeof(searchString) - 1, /* max line length typed in by user */ 40 : COMMON_BUFSIZE - 1, /* max line length typed in by user */
40 INITBUF_SIZE = 1024, /* initial buffer size */ 41 INITBUF_SIZE = 1024, /* initial buffer size */
41}; 42};
42 43
@@ -66,6 +67,7 @@ struct globals {
66#define lines (G.lines ) 67#define lines (G.lines )
67#define marks (G.marks ) 68#define marks (G.marks )
68#define INIT_G() do { \ 69#define INIT_G() do { \
70 setup_common_bufsiz(); \
69 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \ 71 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
70} while (0) 72} while (0)
71 73
diff --git a/editors/sed.c b/editors/sed.c
index a0c713f58..b629e060a 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -86,6 +86,7 @@
86//usage: "bar\n" 86//usage: "bar\n"
87 87
88#include "libbb.h" 88#include "libbb.h"
89#include "common_bufsiz.h"
89#include "xregex.h" 90#include "xregex.h"
90 91
91#if 0 92#if 0
@@ -161,8 +162,9 @@ struct globals {
161 int len; /* Space allocated */ 162 int len; /* Space allocated */
162 } pipeline; 163 } pipeline;
163} FIX_ALIASING; 164} FIX_ALIASING;
164#define G (*(struct globals*)&bb_common_bufsiz1) 165#define G (*(struct globals*)bb_common_bufsiz1)
165#define INIT_G() do { \ 166#define INIT_G() do { \
167 setup_common_bufsiz(); \
166 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 168 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
167 G.sed_cmd_tail = &G.sed_cmd_head; \ 169 G.sed_cmd_tail = &G.sed_cmd_head; \
168} while (0) 170} while (0)
@@ -216,23 +218,33 @@ static void cleanup_outname(void)
216 218
217/* strcpy, replacing "\from" with 'to'. If to is NUL, replacing "\any" with 'any' */ 219/* strcpy, replacing "\from" with 'to'. If to is NUL, replacing "\any" with 'any' */
218 220
219static void parse_escapes(char *dest, const char *string, int len, char from, char to) 221static unsigned parse_escapes(char *dest, const char *string, int len, char from, char to)
220{ 222{
223 char *d = dest;
221 int i = 0; 224 int i = 0;
222 225
226 if (len == -1)
227 len = strlen(string);
228
223 while (i < len) { 229 while (i < len) {
224 if (string[i] == '\\') { 230 if (string[i] == '\\') {
225 if (!to || string[i+1] == from) { 231 if (!to || string[i+1] == from) {
226 *dest++ = to ? to : string[i+1]; 232 if ((*d = to ? to : string[i+1]) == '\0')
233 return d - dest;
227 i += 2; 234 i += 2;
235 d++;
228 continue; 236 continue;
229 } 237 }
230 *dest++ = string[i++]; 238 i++; /* skip backslash in string[] */
239 *d++ = '\\';
240 /* fall through: copy next char verbatim */
231 } 241 }
232 /* TODO: is it safe wrt a string with trailing '\\' ? */ 242 if ((*d = string[i++]) == '\0')
233 *dest++ = string[i++]; 243 return d - dest;
244 d++;
234 } 245 }
235 *dest = '\0'; 246 *d = '\0';
247 return d - dest;
236} 248}
237 249
238static char *copy_parsing_escapes(const char *string, int len) 250static char *copy_parsing_escapes(const char *string, int len)
@@ -243,9 +255,8 @@ static char *copy_parsing_escapes(const char *string, int len)
243 /* sed recognizes \n */ 255 /* sed recognizes \n */
244 /* GNU sed also recognizes \t and \r */ 256 /* GNU sed also recognizes \t and \r */
245 for (s = "\nn\tt\rr"; *s; s += 2) { 257 for (s = "\nn\tt\rr"; *s; s += 2) {
246 parse_escapes(dest, string, len, s[1], s[0]); 258 len = parse_escapes(dest, string, len, s[1], s[0]);
247 string = dest; 259 string = dest;
248 len = strlen(dest);
249 } 260 }
250 return dest; 261 return dest;
251} 262}
@@ -471,7 +482,7 @@ static int parse_subst_cmd(sed_cmd_t *sed_cmd, const char *substr)
471 */ 482 */
472static const char *parse_cmd_args(sed_cmd_t *sed_cmd, const char *cmdstr) 483static const char *parse_cmd_args(sed_cmd_t *sed_cmd, const char *cmdstr)
473{ 484{
474 static const char cmd_letters[] = "saicrw:btTydDgGhHlnNpPqx={}"; 485 static const char cmd_letters[] ALIGN1 = "saicrw:btTydDgGhHlnNpPqx={}";
475 enum { 486 enum {
476 IDX_s = 0, 487 IDX_s = 0,
477 IDX_a, 488 IDX_a,
@@ -514,6 +525,8 @@ static const char *parse_cmd_args(sed_cmd_t *sed_cmd, const char *cmdstr)
514 } 525 }
515 /* handle edit cmds: (a)ppend, (i)nsert, and (c)hange */ 526 /* handle edit cmds: (a)ppend, (i)nsert, and (c)hange */
516 else if (idx <= IDX_c) { /* a,i,c */ 527 else if (idx <= IDX_c) { /* a,i,c */
528 unsigned len;
529
517 if (idx < IDX_c) { /* a,i */ 530 if (idx < IDX_c) { /* a,i */
518 if (sed_cmd->end_line || sed_cmd->end_match) 531 if (sed_cmd->end_line || sed_cmd->end_match)
519 bb_error_msg_and_die("command '%c' uses only one address", sed_cmd->cmd); 532 bb_error_msg_and_die("command '%c' uses only one address", sed_cmd->cmd);
@@ -527,10 +540,11 @@ static const char *parse_cmd_args(sed_cmd_t *sed_cmd, const char *cmdstr)
527 break; 540 break;
528 cmdstr++; 541 cmdstr++;
529 } 542 }
530 sed_cmd->string = xstrdup(cmdstr); 543 len = strlen(cmdstr);
544 sed_cmd->string = copy_parsing_escapes(cmdstr, len);
545 cmdstr += len;
531 /* "\anychar" -> "anychar" */ 546 /* "\anychar" -> "anychar" */
532 parse_escapes(sed_cmd->string, sed_cmd->string, strlen(cmdstr), '\0', '\0'); 547 parse_escapes(sed_cmd->string, sed_cmd->string, -1, '\0', '\0');
533 cmdstr += strlen(cmdstr);
534 } 548 }
535 /* handle file cmds: (r)ead */ 549 /* handle file cmds: (r)ead */
536 else if (idx <= IDX_w) { /* r,w */ 550 else if (idx <= IDX_w) { /* r,w */
@@ -562,8 +576,8 @@ static const char *parse_cmd_args(sed_cmd_t *sed_cmd, const char *cmdstr)
562 576
563 cmdstr += parse_regex_delim(cmdstr, &match, &replace)+1; 577 cmdstr += parse_regex_delim(cmdstr, &match, &replace)+1;
564 /* \n already parsed, but \delimiter needs unescaping. */ 578 /* \n already parsed, but \delimiter needs unescaping. */
565 parse_escapes(match, match, strlen(match), i, i); 579 parse_escapes(match, match, -1, i, i);
566 parse_escapes(replace, replace, strlen(replace), i, i); 580 parse_escapes(replace, replace, -1, i, i);
567 581
568 sed_cmd->string = xzalloc((strlen(match) + 1) * 2); 582 sed_cmd->string = xzalloc((strlen(match) + 1) * 2);
569 for (i = 0; match[i] && replace[i]; i++) { 583 for (i = 0; match[i] && replace[i]; i++) {
@@ -942,13 +956,22 @@ static void puts_maybe_newline(char *s, FILE *file, char *last_puts_char, char l
942 *last_puts_char = lpc; 956 *last_puts_char = lpc;
943} 957}
944 958
945static void flush_append(char *last_puts_char, char last_gets_char) 959static void flush_append(char *last_puts_char)
946{ 960{
947 char *data; 961 char *data;
948 962
949 /* Output appended lines. */ 963 /* Output appended lines. */
950 while ((data = (char *)llist_pop(&G.append_head))) { 964 while ((data = (char *)llist_pop(&G.append_head)) != NULL) {
951 puts_maybe_newline(data, G.nonstdout, last_puts_char, last_gets_char); 965 /* Append command does not respect "nonterminated-ness"
966 * of last line. Try this:
967 * $ echo -n "woot" | sed -e '/woot/a woo' -
968 * woot
969 * woo
970 * (both lines are terminated with \n)
971 * Therefore we do not propagate "last_gets_char" here,
972 * pass '\n' instead:
973 */
974 puts_maybe_newline(data, G.nonstdout, last_puts_char, '\n');
952 free(data); 975 free(data);
953 } 976 }
954} 977}
@@ -956,13 +979,13 @@ static void flush_append(char *last_puts_char, char last_gets_char)
956/* Get next line of input from G.input_file_list, flushing append buffer and 979/* Get next line of input from G.input_file_list, flushing append buffer and
957 * noting if we ran out of files without a newline on the last line we read. 980 * noting if we ran out of files without a newline on the last line we read.
958 */ 981 */
959static char *get_next_line(char *gets_char, char *last_puts_char, char last_gets_char) 982static char *get_next_line(char *gets_char, char *last_puts_char)
960{ 983{
961 char *temp = NULL; 984 char *temp = NULL;
962 int len; 985 int len;
963 char gc; 986 char gc;
964 987
965 flush_append(last_puts_char, last_gets_char); 988 flush_append(last_puts_char);
966 989
967 /* will be returned if last line in the file 990 /* will be returned if last line in the file
968 * doesn't end with either '\n' or '\0' */ 991 * doesn't end with either '\n' or '\0' */
@@ -1045,7 +1068,7 @@ static void process_files(void)
1045 int substituted; 1068 int substituted;
1046 1069
1047 /* Prime the pump */ 1070 /* Prime the pump */
1048 next_line = get_next_line(&next_gets_char, &last_puts_char, '\n' /*last_gets_char*/); 1071 next_line = get_next_line(&next_gets_char, &last_puts_char);
1049 1072
1050 /* Go through every line in each file */ 1073 /* Go through every line in each file */
1051 again: 1074 again:
@@ -1059,7 +1082,7 @@ static void process_files(void)
1059 1082
1060 /* Read one line in advance so we can act on the last line, 1083 /* Read one line in advance so we can act on the last line,
1061 * the '$' address */ 1084 * the '$' address */
1062 next_line = get_next_line(&next_gets_char, &last_puts_char, last_gets_char); 1085 next_line = get_next_line(&next_gets_char, &last_puts_char);
1063 linenum++; 1086 linenum++;
1064 1087
1065 /* For every line, go through all the commands */ 1088 /* For every line, go through all the commands */
@@ -1286,7 +1309,7 @@ static void process_files(void)
1286 free(pattern_space); 1309 free(pattern_space);
1287 pattern_space = next_line; 1310 pattern_space = next_line;
1288 last_gets_char = next_gets_char; 1311 last_gets_char = next_gets_char;
1289 next_line = get_next_line(&next_gets_char, &last_puts_char, last_gets_char); 1312 next_line = get_next_line(&next_gets_char, &last_puts_char);
1290 substituted = 0; 1313 substituted = 0;
1291 linenum++; 1314 linenum++;
1292 break; 1315 break;
@@ -1322,7 +1345,7 @@ static void process_files(void)
1322 pattern_space[len] = '\n'; 1345 pattern_space[len] = '\n';
1323 strcpy(pattern_space + len+1, next_line); 1346 strcpy(pattern_space + len+1, next_line);
1324 last_gets_char = next_gets_char; 1347 last_gets_char = next_gets_char;
1325 next_line = get_next_line(&next_gets_char, &last_puts_char, last_gets_char); 1348 next_line = get_next_line(&next_gets_char, &last_puts_char);
1326 linenum++; 1349 linenum++;
1327 break; 1350 break;
1328 } 1351 }
@@ -1426,7 +1449,7 @@ static void process_files(void)
1426 1449
1427 /* Delete and such jump here. */ 1450 /* Delete and such jump here. */
1428 discard_line: 1451 discard_line:
1429 flush_append(&last_puts_char, last_gets_char); 1452 flush_append(&last_puts_char /*,last_gets_char*/);
1430 free(pattern_space); 1453 free(pattern_space);
1431 1454
1432 goto again; 1455 goto again;
@@ -1512,12 +1535,12 @@ int sed_main(int argc UNUSED_PARAM, char **argv)
1512 while (opt_f) { // -f 1535 while (opt_f) { // -f
1513 char *line; 1536 char *line;
1514 FILE *cmdfile; 1537 FILE *cmdfile;
1515 cmdfile = xfopen_for_read(llist_pop(&opt_f)); 1538 cmdfile = xfopen_stdin(llist_pop(&opt_f));
1516 while ((line = xmalloc_fgetline(cmdfile)) != NULL) { 1539 while ((line = xmalloc_fgetline(cmdfile)) != NULL) {
1517 add_cmd(line); 1540 add_cmd(line);
1518 free(line); 1541 free(line);
1519 } 1542 }
1520 fclose(cmdfile); 1543 fclose_if_not_stdin(cmdfile);
1521 } 1544 }
1522 /* if we didn't get a pattern from -e or -f, use argv[0] */ 1545 /* if we didn't get a pattern from -e or -f, use argv[0] */
1523 if (!(opt & 0x30)) { 1546 if (!(opt & 0x30)) {
diff --git a/editors/vi.c b/editors/vi.c
index 75ce8d396..243676d5f 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -251,7 +251,7 @@ enum {
251// cmds modifying text[] 251// cmds modifying text[]
252// vda: removed "aAiIs" as they switch us into insert mode 252// vda: removed "aAiIs" as they switch us into insert mode
253// and remembering input for replay after them makes no sense 253// and remembering input for replay after them makes no sense
254static const char modifying_cmds[] = "cCdDJoOpPrRxX<>~"; 254static const char modifying_cmds[] ALIGN1 = "cCdDJoOpPrRxX<>~";
255#endif 255#endif
256 256
257enum { 257enum {
diff --git a/findutils/find.c b/findutils/find.c
index a0d4853de..d71c69782 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -342,6 +342,7 @@
342 342
343#include <fnmatch.h> 343#include <fnmatch.h>
344#include "libbb.h" 344#include "libbb.h"
345#include "common_bufsiz.h"
345#if ENABLE_FEATURE_FIND_REGEX 346#if ENABLE_FEATURE_FIND_REGEX
346# include "xregex.h" 347# include "xregex.h"
347#endif 348#endif
@@ -421,8 +422,9 @@ struct globals {
421 recurse_flags_t recurse_flags; 422 recurse_flags_t recurse_flags;
422 IF_FEATURE_FIND_EXEC_PLUS(unsigned max_argv_len;) 423 IF_FEATURE_FIND_EXEC_PLUS(unsigned max_argv_len;)
423} FIX_ALIASING; 424} FIX_ALIASING;
424#define G (*(struct globals*)&bb_common_bufsiz1) 425#define G (*(struct globals*)bb_common_bufsiz1)
425#define INIT_G() do { \ 426#define INIT_G() do { \
427 setup_common_bufsiz(); \
426 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 428 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
427 /* we have to zero it out because of NOEXEC */ \ 429 /* we have to zero it out because of NOEXEC */ \
428 memset(&G, 0, sizeof(G)); \ 430 memset(&G, 0, sizeof(G)); \
diff --git a/findutils/grep.c b/findutils/grep.c
index 5ed3faab2..e956abbb8 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -58,6 +58,7 @@
58//config: Print the specified number of context lines (-C). 58//config: Print the specified number of context lines (-C).
59 59
60#include "libbb.h" 60#include "libbb.h"
61#include "common_bufsiz.h"
61#include "xregex.h" 62#include "xregex.h"
62 63
63 64
@@ -209,8 +210,9 @@ struct globals {
209 llist_t *pattern_head; /* growable list of patterns to match */ 210 llist_t *pattern_head; /* growable list of patterns to match */
210 const char *cur_file; /* the current file we are reading */ 211 const char *cur_file; /* the current file we are reading */
211} FIX_ALIASING; 212} FIX_ALIASING;
212#define G (*(struct globals*)&bb_common_bufsiz1) 213#define G (*(struct globals*)bb_common_bufsiz1)
213#define INIT_G() do { \ 214#define INIT_G() do { \
215 setup_common_bufsiz(); \
214 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 216 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
215} while (0) 217} while (0)
216#define max_matches (G.max_matches ) 218#define max_matches (G.max_matches )
diff --git a/findutils/xargs.c b/findutils/xargs.c
index 8b7ab7b6a..eca1185ec 100644
--- a/findutils/xargs.c
+++ b/findutils/xargs.c
@@ -69,6 +69,7 @@
69#include <conio.h> 69#include <conio.h>
70#endif 70#endif
71#include "libbb.h" 71#include "libbb.h"
72#include "common_bufsiz.h"
72 73
73/* This is a NOEXEC applet. Be very careful! */ 74/* This is a NOEXEC applet. Be very careful! */
74 75
@@ -103,8 +104,9 @@ struct globals {
103 const char *eof_str; 104 const char *eof_str;
104 int idx; 105 int idx;
105} FIX_ALIASING; 106} FIX_ALIASING;
106#define G (*(struct globals*)&bb_common_bufsiz1) 107#define G (*(struct globals*)bb_common_bufsiz1)
107#define INIT_G() do { \ 108#define INIT_G() do { \
109 setup_common_bufsiz(); \
108 G.eof_str = NULL; /* need to clear by hand because we are NOEXEC applet */ \ 110 G.eof_str = NULL; /* need to clear by hand because we are NOEXEC applet */ \
109 IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.repl_str = "{}";) \ 111 IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.repl_str = "{}";) \
110 IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.eol_ch = '\n';) \ 112 IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.eol_ch = '\n';) \
diff --git a/include/.gitignore b/include/.gitignore
index 9d9b6c499..75afff9ca 100644
--- a/include/.gitignore
+++ b/include/.gitignore
@@ -8,3 +8,4 @@
8/NUM_APPLETS.h 8/NUM_APPLETS.h
9/usage_compressed.h 9/usage_compressed.h
10/usage.h 10/usage.h
11/common_bufsiz.h*
diff --git a/include/libbb.h b/include/libbb.h
index ffe1504e1..9a7590edd 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1852,10 +1852,6 @@ extern const char bb_PATH_root_path[] ALIGN1; /* "PATH=/sbin:/usr/sbin:/bin:/usr
1852extern const int const_int_0; 1852extern const int const_int_0;
1853//extern const int const_int_1; 1853//extern const int const_int_1;
1854 1854
1855
1856/* Providing hard guarantee on minimum size (think of BUFSIZ == 128) */
1857enum { COMMON_BUFSIZE = (BUFSIZ >= 256*sizeof(void*) ? BUFSIZ+1 : 256*sizeof(void*)) };
1858extern char bb_common_bufsiz1[COMMON_BUFSIZE];
1859/* This struct is deliberately not defined. */ 1855/* This struct is deliberately not defined. */
1860/* See docs/keep_data_small.txt */ 1856/* See docs/keep_data_small.txt */
1861struct globals; 1857struct globals;
diff --git a/init/bootchartd.c b/init/bootchartd.c
index c7388c99e..92aaade0f 100644
--- a/init/bootchartd.c
+++ b/init/bootchartd.c
@@ -47,6 +47,7 @@
47//config: and /etc/bootchartd.conf files. 47//config: and /etc/bootchartd.conf files.
48 48
49#include "libbb.h" 49#include "libbb.h"
50#include "common_bufsiz.h"
50/* After libbb.h, since it needs sys/types.h on some systems */ 51/* After libbb.h, since it needs sys/types.h on some systems */
51#include <sys/utsname.h> 52#include <sys/utsname.h>
52 53
@@ -115,8 +116,8 @@
115struct globals { 116struct globals {
116 char jiffy_line[COMMON_BUFSIZE]; 117 char jiffy_line[COMMON_BUFSIZE];
117} FIX_ALIASING; 118} FIX_ALIASING;
118#define G (*(struct globals*)&bb_common_bufsiz1) 119#define G (*(struct globals*)bb_common_bufsiz1)
119#define INIT_G() do { } while (0) 120#define INIT_G() do { setup_common_bufsiz(); } while (0)
120 121
121static void dump_file(FILE *fp, const char *filename) 122static void dump_file(FILE *fp, const char *filename)
122{ 123{
@@ -193,7 +194,7 @@ static char *make_tempdir(void)
193 * Since we unmount it at once, we can mount it anywhere. 194 * Since we unmount it at once, we can mount it anywhere.
194 * Try a few locations which are likely ti exist. 195 * Try a few locations which are likely ti exist.
195 */ 196 */
196 static const char dirs[] = "/mnt\0""/tmp\0""/boot\0""/proc\0"; 197 static const char dirs[] ALIGN1 = "/mnt\0""/tmp\0""/boot\0""/proc\0";
197 const char *try_dir = dirs; 198 const char *try_dir = dirs;
198 while (mount("none", try_dir, "tmpfs", MS_SILENT, "size=16m") != 0) { 199 while (mount("none", try_dir, "tmpfs", MS_SILENT, "size=16m") != 0) {
199 try_dir += strlen(try_dir) + 1; 200 try_dir += strlen(try_dir) + 1;
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index 4a9d363dd..c528c8a2c 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -835,7 +835,8 @@ static int busybox_main(char **argv)
835 full_write2_str(a); 835 full_write2_str(a);
836 full_write2_str("\n"); 836 full_write2_str("\n");
837 i++; 837 i++;
838 a += strlen(a) + 1; 838 while (*a++ != '\0')
839 continue;
839 } 840 }
840 return 0; 841 return 0;
841 } 842 }
diff --git a/libbb/common_bufsiz.c b/libbb/common_bufsiz.c
new file mode 100644
index 000000000..1a3585169
--- /dev/null
+++ b/libbb/common_bufsiz.c
@@ -0,0 +1,74 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 2016 Denys Vlasenko
6 *
7 * Licensed under GPLv2, see file LICENSE in this source tree.
8 */
9//config:config FEATURE_USE_BSS_TAIL
10//config: bool "Use the end of BSS page"
11//config: default n
12//config: help
13//config: Attempt to reclaim a small unused part of BSS.
14//config:
15//config: Executables have the following parts:
16//config: = read-only executable code and constants, also known as "text"
17//config: = read-write data
18//config: = non-initialized (zeroed on demand) data, also known as "bss"
19//config:
20//config: At link time, "text" is padded to a full page. At runtime, all "text"
21//config: pages are mapped RO and executable.
22//config: "Data" starts on the next page boundary, but is not padded
23//config: to a full page at the end. "Bss" starts wherever "data" ends.
24//config: At runtime, "data" pages are mapped RW and they are file-backed
25//config: (this includes a small portion of "bss" which may live in the last
26//config: partial page of "data").
27//config: Pages which are fully in "bss" are mapped to anonymous memory.
28//config:
29//config: "Bss" end is usually not page-aligned. There is an unused space
30//config: in the last page. Linker marks its start with the "_end" symbol.
31//config:
32//config: This option will attempt to use that space for bb_common_bufsiz1[]
33//config: array. If it fits after _end, it will be used, and COMMON_BUFSIZE
34//config: will be enlarged from its guaranteed minimum size of 1 kbyte.
35//config: This may require recompilation a second time, since value of _end
36//config: is known only after final link.
37//config:
38//config: If you are getting a build error like this:
39//config: appletlib.c:(.text.main+0xd): undefined reference to '_end'
40//config: disable this option.
41
42//kbuild:lib-y += common_bufsiz.o
43
44#include "libbb.h"
45#include "common_bufsiz.h"
46
47#if !ENABLE_FEATURE_USE_BSS_TAIL
48
49/* We use it for "global" data via *(struct global*)bb_common_bufsiz1.
50 * Since gcc insists on aligning struct global's members, it would be a pity
51 * (and an alignment fault on some CPUs) to mess it up. */
52char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long));
53
54#else
55
56# ifndef setup_common_bufsiz
57/*
58 * It is not defined as a dummy macro.
59 * It means we have to provide this function.
60 */
61char *const bb_common_bufsiz1 __attribute__ ((section (".data")));
62void setup_common_bufsiz(void)
63{
64 if (!bb_common_bufsiz1)
65 *(char**)&bb_common_bufsiz1 = xzalloc(COMMON_BUFSIZE);
66}
67# else
68# ifndef bb_common_bufsiz1
69 /* bb_common_bufsiz1[] is not aliased to _end[] */
70char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long));
71# endif
72# endif
73
74#endif
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index e7b9ddfa1..6c91f1794 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -829,12 +829,11 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
829 if (type == FIND_EXE_ONLY) { 829 if (type == FIND_EXE_ONLY) {
830 const char *p = applet_names; 830 const char *p = applet_names;
831 831
832 i = 0; 832 while (*p) {
833 while (i < NUM_APPLETS) {
834 if (strncmp(pfind, p, pf_len) == 0) 833 if (strncmp(pfind, p, pf_len) == 0)
835 add_match(xstrdup(p)); 834 add_match(xstrdup(p));
836 p += strlen(p) + 1; 835 while (*p++ != '\0')
837 i++; 836 continue;
838 } 837 }
839 } 838 }
840#endif 839#endif
diff --git a/libbb/messages.c b/libbb/messages.c
index 2aa3f175d..d74c237e7 100644
--- a/libbb/messages.c
+++ b/libbb/messages.c
@@ -61,8 +61,3 @@ const char bb_path_wtmp_file[] ALIGN1 =
61# error unknown path to wtmp file 61# error unknown path to wtmp file
62# endif 62# endif
63#endif 63#endif
64
65/* We use it for "global" data via *(struct global*)&bb_common_bufsiz1.
66 * Since gcc insists on aligning struct global's members, it would be a pity
67 * (and an alignment fault on some CPUs) to mess it up. */
68char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long));
diff --git a/libbb/mode_string.c b/libbb/mode_string.c
index f1afe7d61..934eb6dc7 100644
--- a/libbb/mode_string.c
+++ b/libbb/mode_string.c
@@ -87,9 +87,9 @@ const char* FAST_FUNC bb_mode_string(mode_t mode)
87 87
88/* The previous version used "0pcCd?bB-?l?s???". However, the '0', 'C', 88/* The previous version used "0pcCd?bB-?l?s???". However, the '0', 'C',
89 * and 'B' types don't appear to be available on linux. So I removed them. */ 89 * and 'B' types don't appear to be available on linux. So I removed them. */
90static const char type_chars[16] = "?pc?d?b?-?l?s???"; 90static const char type_chars[16] ALIGN1 = "?pc?d?b?-?l?s???";
91/********************************** 0123456789abcdef */ 91/********************************** 0123456789abcdef */
92static const char mode_chars[7] = "rwxSTst"; 92static const char mode_chars[7] ALIGN1 = "rwxSTst";
93 93
94const char* FAST_FUNC bb_mode_string(mode_t mode) 94const char* FAST_FUNC bb_mode_string(mode_t mode)
95{ 95{
diff --git a/libbb/pw_encrypt.c b/libbb/pw_encrypt.c
index dbc15e5fc..4cdc2de76 100644
--- a/libbb/pw_encrypt.c
+++ b/libbb/pw_encrypt.c
@@ -9,7 +9,7 @@
9 9
10#include "libbb.h" 10#include "libbb.h"
11 11
12/* static const uint8_t ascii64[] = 12/* static const uint8_t ascii64[] ALIGN1 =
13 * "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 13 * "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
14 */ 14 */
15 15
diff --git a/libbb/u_signal_names.c b/libbb/u_signal_names.c
index 8c78f5e20..b49714f2a 100644
--- a/libbb/u_signal_names.c
+++ b/libbb/u_signal_names.c
@@ -19,7 +19,7 @@
19/* Believe it or not, but some arches have more than 32 SIGs! 19/* Believe it or not, but some arches have more than 32 SIGs!
20 * HPPA: SIGSTKFLT == 36. */ 20 * HPPA: SIGSTKFLT == 36. */
21 21
22static const char signals[][7] = { 22static const char signals[][7] ALIGN1 = {
23 // SUSv3 says kill must support these, and specifies the numerical values, 23 // SUSv3 says kill must support these, and specifies the numerical values,
24 // http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html 24 // http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
25 // {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"}, 25 // {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"},
diff --git a/loginutils/login.c b/loginutils/login.c
index 4ebc18502..94b6c45db 100644
--- a/loginutils/login.c
+++ b/loginutils/login.c
@@ -62,6 +62,7 @@
62//usage: "\n -p Preserve environment" 62//usage: "\n -p Preserve environment"
63 63
64#include "libbb.h" 64#include "libbb.h"
65#include "common_bufsiz.h"
65#include <syslog.h> 66#include <syslog.h>
66#include <sys/resource.h> 67#include <sys/resource.h>
67 68
@@ -138,8 +139,8 @@ enum {
138struct globals { 139struct globals {
139 struct termios tty_attrs; 140 struct termios tty_attrs;
140} FIX_ALIASING; 141} FIX_ALIASING;
141#define G (*(struct globals*)&bb_common_bufsiz1) 142#define G (*(struct globals*)bb_common_bufsiz1)
142#define INIT_G() do { } while (0) 143#define INIT_G() do { setup_common_bufsiz(); } while (0)
143 144
144 145
145#if ENABLE_FEATURE_NOLOGIN 146#if ENABLE_FEATURE_NOLOGIN
diff --git a/miscutils/adjtimex.c b/miscutils/adjtimex.c
index 534364a69..058aa9a5c 100644
--- a/miscutils/adjtimex.c
+++ b/miscutils/adjtimex.c
@@ -29,7 +29,7 @@
29# include <sys/timex.h> 29# include <sys/timex.h>
30#endif 30#endif
31 31
32static const uint16_t statlist_bit[] = { 32static const uint16_t statlist_bit[] ALIGN2 = {
33 STA_PLL, 33 STA_PLL,
34 STA_PPSFREQ, 34 STA_PPSFREQ,
35 STA_PPSTIME, 35 STA_PPSTIME,
@@ -45,7 +45,7 @@ static const uint16_t statlist_bit[] = {
45 STA_CLOCKERR, 45 STA_CLOCKERR,
46 0 46 0
47}; 47};
48static const char statlist_name[] = 48static const char statlist_name[] ALIGN1 =
49 "PLL" "\0" 49 "PLL" "\0"
50 "PPSFREQ" "\0" 50 "PPSFREQ" "\0"
51 "PPSTIME" "\0" 51 "PPSTIME" "\0"
@@ -61,7 +61,7 @@ static const char statlist_name[] =
61 "CLOCKERR" 61 "CLOCKERR"
62; 62;
63 63
64static const char ret_code_descript[] = 64static const char ret_code_descript[] ALIGN1 =
65 "clock synchronized" "\0" 65 "clock synchronized" "\0"
66 "insert leap second" "\0" 66 "insert leap second" "\0"
67 "delete leap second" "\0" 67 "delete leap second" "\0"
diff --git a/miscutils/chat.c b/miscutils/chat.c
index bd2abc24a..6b429f2a6 100644
--- a/miscutils/chat.c
+++ b/miscutils/chat.c
@@ -17,6 +17,7 @@
17//usage: "chat '' ATZ OK ATD123456 CONNECT '' ogin: pppuser word: ppppass '~'" 17//usage: "chat '' ATZ OK ATD123456 CONNECT '' ogin: pppuser word: ppppass '~'"
18 18
19#include "libbb.h" 19#include "libbb.h"
20#include "common_bufsiz.h"
20 21
21// default timeout: 45 sec 22// default timeout: 45 sec
22#define DEFAULT_CHAT_TIMEOUT 45*1000 23#define DEFAULT_CHAT_TIMEOUT 45*1000
@@ -285,9 +286,10 @@ int chat_main(int argc UNUSED_PARAM, char **argv)
285 && poll(&pfd, 1, timeout) > 0 286 && poll(&pfd, 1, timeout) > 0
286 && (pfd.revents & POLLIN) 287 && (pfd.revents & POLLIN)
287 ) { 288 ) {
288#define buf bb_common_bufsiz1
289 llist_t *l; 289 llist_t *l;
290 ssize_t delta; 290 ssize_t delta;
291#define buf bb_common_bufsiz1
292 setup_common_bufsiz();
291 293
292 // read next char from device 294 // read next char from device
293 if (safe_read(STDIN_FILENO, buf+buf_len, 1) > 0) { 295 if (safe_read(STDIN_FILENO, buf+buf_len, 1) > 0) {
diff --git a/miscutils/conspy.c b/miscutils/conspy.c
index 1a46a4340..f6468c116 100644
--- a/miscutils/conspy.c
+++ b/miscutils/conspy.c
@@ -42,6 +42,7 @@
42//usage: "\n -y LINE Starting line" 42//usage: "\n -y LINE Starting line"
43 43
44#include "libbb.h" 44#include "libbb.h"
45#include "common_bufsiz.h"
45#include <sys/kd.h> 46#include <sys/kd.h>
46 47
47#define ESC "\033" 48#define ESC "\033"
@@ -363,7 +364,6 @@ int conspy_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
363int conspy_main(int argc UNUSED_PARAM, char **argv) 364int conspy_main(int argc UNUSED_PARAM, char **argv)
364{ 365{
365 char tty_name[sizeof(DEV_TTY "NN")]; 366 char tty_name[sizeof(DEV_TTY "NN")];
366#define keybuf bb_common_bufsiz1
367 struct termios termbuf; 367 struct termios termbuf;
368 unsigned opts; 368 unsigned opts;
369 unsigned ttynum; 369 unsigned ttynum;
@@ -382,6 +382,9 @@ int conspy_main(int argc UNUSED_PARAM, char **argv)
382 382
383 applet_long_options = getopt_longopts; 383 applet_long_options = getopt_longopts;
384#endif 384#endif
385#define keybuf bb_common_bufsiz1
386 setup_common_bufsiz();
387
385 INIT_G(); 388 INIT_G();
386 strcpy(G.vcsa_name, DEV_VCSA); 389 strcpy(G.vcsa_name, DEV_VCSA);
387 390
@@ -513,7 +516,7 @@ int conspy_main(int argc UNUSED_PARAM, char **argv)
513 default: 516 default:
514 // Read the keys pressed 517 // Read the keys pressed
515 k = keybuf + G.key_count; 518 k = keybuf + G.key_count;
516 bytes_read = read(G.kbd_fd, k, sizeof(keybuf) - G.key_count); 519 bytes_read = read(G.kbd_fd, k, COMMON_BUFSIZE - G.key_count);
517 if (bytes_read < 0) 520 if (bytes_read < 0)
518 goto abort; 521 goto abort;
519 522
diff --git a/miscutils/crond.c b/miscutils/crond.c
index eb327f855..f96c96ee7 100644
--- a/miscutils/crond.c
+++ b/miscutils/crond.c
@@ -60,6 +60,7 @@
60//usage: "\n -c DIR Cron dir. Default:"CONFIG_FEATURE_CROND_DIR"/crontabs" 60//usage: "\n -c DIR Cron dir. Default:"CONFIG_FEATURE_CROND_DIR"/crontabs"
61 61
62#include "libbb.h" 62#include "libbb.h"
63#include "common_bufsiz.h"
63#include <syslog.h> 64#include <syslog.h>
64 65
65/* glibc frees previous setenv'ed value when we do next setenv() 66/* glibc frees previous setenv'ed value when we do next setenv()
@@ -140,8 +141,9 @@ struct globals {
140 char *env_var_logname; 141 char *env_var_logname;
141#endif 142#endif
142} FIX_ALIASING; 143} FIX_ALIASING;
143#define G (*(struct globals*)&bb_common_bufsiz1) 144#define G (*(struct globals*)bb_common_bufsiz1)
144#define INIT_G() do { \ 145#define INIT_G() do { \
146 setup_common_bufsiz(); \
145 G.log_level = 8; \ 147 G.log_level = 8; \
146 G.crontab_dir_name = CRONTABS; \ 148 G.crontab_dir_name = CRONTABS; \
147} while (0) 149} while (0)
diff --git a/miscutils/dc.c b/miscutils/dc.c
index 9c74172ba..4d92bc3d0 100644
--- a/miscutils/dc.c
+++ b/miscutils/dc.c
@@ -4,6 +4,7 @@
4 */ 4 */
5 5
6#include "libbb.h" 6#include "libbb.h"
7#include "common_bufsiz.h"
7#include <math.h> 8#include <math.h>
8 9
9//usage:#define dc_trivial_usage 10//usage:#define dc_trivial_usage
@@ -47,11 +48,12 @@ struct globals {
47 double stack[1]; 48 double stack[1];
48} FIX_ALIASING; 49} FIX_ALIASING;
49enum { STACK_SIZE = (COMMON_BUFSIZE - offsetof(struct globals, stack)) / sizeof(double) }; 50enum { STACK_SIZE = (COMMON_BUFSIZE - offsetof(struct globals, stack)) / sizeof(double) };
50#define G (*(struct globals*)&bb_common_bufsiz1) 51#define G (*(struct globals*)bb_common_bufsiz1)
51#define pointer (G.pointer ) 52#define pointer (G.pointer )
52#define base (G.base ) 53#define base (G.base )
53#define stack (G.stack ) 54#define stack (G.stack )
54#define INIT_G() do { \ 55#define INIT_G() do { \
56 setup_common_bufsiz(); \
55 base = 10; \ 57 base = 10; \
56} while (0) 58} while (0)
57 59
diff --git a/miscutils/eject.c b/miscutils/eject.c
index e33d79127..16ae250ff 100644
--- a/miscutils/eject.c
+++ b/miscutils/eject.c
@@ -40,7 +40,7 @@
40#if ENABLE_FEATURE_EJECT_SCSI 40#if ENABLE_FEATURE_EJECT_SCSI
41static void eject_scsi(const char *dev) 41static void eject_scsi(const char *dev)
42{ 42{
43 static const char sg_commands[3][6] = { 43 static const char sg_commands[3][6] ALIGN1 = {
44 { ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0 }, 44 { ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0 },
45 { START_STOP, 0, 0, 0, 1, 0 }, 45 { START_STOP, 0, 0, 0, 1, 0 },
46 { START_STOP, 0, 0, 0, 2, 0 } 46 { START_STOP, 0, 0, 0, 2, 0 }
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 9557c41db..3ddf8a242 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -34,6 +34,7 @@
34//usage: "\n commands: 'NN' (% for progress bar) or 'exit'" 34//usage: "\n commands: 'NN' (% for progress bar) or 'exit'"
35 35
36#include "libbb.h" 36#include "libbb.h"
37#include "common_bufsiz.h"
37#include <linux/fb.h> 38#include <linux/fb.h>
38 39
39/* If you want logging messages on /tmp/fbsplash.log... */ 40/* If you want logging messages on /tmp/fbsplash.log... */
@@ -373,10 +374,12 @@ static void fb_drawimage(void)
373 * in pure binary by 1 or 2 bytes. (we support only 1 byte) 374 * in pure binary by 1 or 2 bytes. (we support only 1 byte)
374 */ 375 */
375#define concat_buf bb_common_bufsiz1 376#define concat_buf bb_common_bufsiz1
377 setup_common_bufsiz();
378
376 read_ptr = concat_buf; 379 read_ptr = concat_buf;
377 while (1) { 380 while (1) {
378 int w, h, max_color_val; 381 int w, h, max_color_val;
379 int rem = concat_buf + sizeof(concat_buf) - read_ptr; 382 int rem = concat_buf + COMMON_BUFSIZE - read_ptr;
380 if (rem < 2 383 if (rem < 2
381 || fgets(read_ptr, rem, theme_file) == NULL 384 || fgets(read_ptr, rem, theme_file) == NULL
382 ) { 385 ) {
diff --git a/miscutils/hdparm.c b/miscutils/hdparm.c
index 8e201ac35..b4c5876d4 100644
--- a/miscutils/hdparm.c
+++ b/miscutils/hdparm.c
@@ -63,6 +63,7 @@
63//usage: "\n -z Reread partition table" 63//usage: "\n -z Reread partition table"
64 64
65#include "libbb.h" 65#include "libbb.h"
66#include "common_bufsiz.h"
66/* must be _after_ libbb.h: */ 67/* must be _after_ libbb.h: */
67#include <linux/hdreg.h> 68#include <linux/hdreg.h>
68#include <sys/mount.h> 69#include <sys/mount.h>
@@ -367,7 +368,7 @@ struct globals {
367 unsigned char flushcache[4] = { WIN_FLUSHCACHE, 0, 0, 0 }; 368 unsigned char flushcache[4] = { WIN_FLUSHCACHE, 0, 0, 0 };
368#endif 369#endif
369} FIX_ALIASING; 370} FIX_ALIASING;
370#define G (*(struct globals*)&bb_common_bufsiz1) 371#define G (*(struct globals*)bb_common_bufsiz1)
371#define get_identity (G.get_identity ) 372#define get_identity (G.get_identity )
372#define get_geom (G.get_geom ) 373#define get_geom (G.get_geom )
373#define do_flush (G.do_flush ) 374#define do_flush (G.do_flush )
@@ -431,6 +432,7 @@ struct globals {
431#define hwif_ctrl (G.hwif_ctrl ) 432#define hwif_ctrl (G.hwif_ctrl )
432#define hwif_irq (G.hwif_irq ) 433#define hwif_irq (G.hwif_irq )
433#define INIT_G() do { \ 434#define INIT_G() do { \
435 setup_common_bufsiz(); \
434 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 436 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
435} while (0) 437} while (0)
436 438
diff --git a/miscutils/i2c_tools.c b/miscutils/i2c_tools.c
index aa1c7c5cc..57bb72ae7 100644
--- a/miscutils/i2c_tools.c
+++ b/miscutils/i2c_tools.c
@@ -60,6 +60,7 @@
60 */ 60 */
61 61
62#include "libbb.h" 62#include "libbb.h"
63#include "common_bufsiz.h"
63 64
64#include <linux/i2c.h> 65#include <linux/i2c.h>
65#include <linux/i2c-dev.h> 66#include <linux/i2c-dev.h>
diff --git a/miscutils/inotifyd.c b/miscutils/inotifyd.c
index 908d657fd..52db08ada 100644
--- a/miscutils/inotifyd.c
+++ b/miscutils/inotifyd.c
@@ -56,6 +56,7 @@
56//usage: "\nWhen x event happens for all FILEs, inotifyd exits." 56//usage: "\nWhen x event happens for all FILEs, inotifyd exits."
57 57
58#include "libbb.h" 58#include "libbb.h"
59#include "common_bufsiz.h"
59#include <sys/inotify.h> 60#include <sys/inotify.h>
60 61
61static const char mask_names[] ALIGN1 = 62static const char mask_names[] ALIGN1 =
@@ -161,9 +162,10 @@ int inotifyd_main(int argc, char **argv)
161 162
162 // read out all pending events 163 // read out all pending events
163 // (NB: len must be int, not ssize_t or long!) 164 // (NB: len must be int, not ssize_t or long!)
164 xioctl(pfd.fd, FIONREAD, &len);
165#define eventbuf bb_common_bufsiz1 165#define eventbuf bb_common_bufsiz1
166 ie = buf = (len <= sizeof(eventbuf)) ? eventbuf : xmalloc(len); 166 setup_common_bufsiz();
167 xioctl(pfd.fd, FIONREAD, &len);
168 ie = buf = (len <= COMMON_BUFSIZE) ? eventbuf : xmalloc(len);
167 len = full_read(pfd.fd, buf, len); 169 len = full_read(pfd.fd, buf, len);
168 // process events. N.B. events may vary in length 170 // process events. N.B. events may vary in length
169 while (len > 0) { 171 while (len > 0) {
diff --git a/miscutils/ionice.c b/miscutils/ionice.c
index bd300605f..0c14256ab 100644
--- a/miscutils/ionice.c
+++ b/miscutils/ionice.c
@@ -41,7 +41,7 @@ enum {
41 IOPRIO_CLASS_IDLE 41 IOPRIO_CLASS_IDLE
42}; 42};
43 43
44static const char to_prio[] = "none\0realtime\0best-effort\0idle"; 44static const char to_prio[] ALIGN1 = "none\0realtime\0best-effort\0idle";
45 45
46#define IOPRIO_CLASS_SHIFT 13 46#define IOPRIO_CLASS_SHIFT 13
47 47
diff --git a/miscutils/less.c b/miscutils/less.c
index cc0e20bc7..248f3e3f5 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -131,6 +131,7 @@
131#endif 131#endif
132 132
133#include "libbb.h" 133#include "libbb.h"
134#include "common_bufsiz.h"
134#if ENABLE_FEATURE_LESS_REGEXP 135#if ENABLE_FEATURE_LESS_REGEXP
135#include "xregex.h" 136#include "xregex.h"
136#endif 137#endif
@@ -445,7 +446,6 @@ static int at_end(void)
445 */ 446 */
446static void read_lines(void) 447static void read_lines(void)
447{ 448{
448#define readbuf bb_common_bufsiz1
449 char *current_line, *p; 449 char *current_line, *p;
450 int w = width; 450 int w = width;
451 char last_terminated = terminated; 451 char last_terminated = terminated;
@@ -455,6 +455,9 @@ static void read_lines(void)
455 unsigned old_max_fline = max_fline; 455 unsigned old_max_fline = max_fline;
456#endif 456#endif
457 457
458#define readbuf bb_common_bufsiz1
459 setup_common_bufsiz();
460
458 /* (careful: max_fline can be -1) */ 461 /* (careful: max_fline can be -1) */
459 if (max_fline + 1 > MAXLINES) 462 if (max_fline + 1 > MAXLINES)
460 return; 463 return;
@@ -486,7 +489,7 @@ static void read_lines(void)
486 time_t t; 489 time_t t;
487 490
488 errno = 0; 491 errno = 0;
489 eof_error = safe_read(STDIN_FILENO, readbuf, sizeof(readbuf)); 492 eof_error = safe_read(STDIN_FILENO, readbuf, COMMON_BUFSIZE);
490 if (errno != EAGAIN) 493 if (errno != EAGAIN)
491 break; 494 break;
492 t = time(NULL); 495 t = time(NULL);
diff --git a/miscutils/microcom.c b/miscutils/microcom.c
index 5e29a1acd..d9e8f9187 100644
--- a/miscutils/microcom.c
+++ b/miscutils/microcom.c
@@ -19,6 +19,7 @@
19//usage: "\n -X Disable special meaning of NUL and Ctrl-X from stdin" 19//usage: "\n -X Disable special meaning of NUL and Ctrl-X from stdin"
20 20
21#include "libbb.h" 21#include "libbb.h"
22#include "common_bufsiz.h"
22 23
23// set raw tty mode 24// set raw tty mode
24static void xget1(int fd, struct termios *t, struct termios *oldt) 25static void xget1(int fd, struct termios *t, struct termios *oldt)
@@ -155,10 +156,11 @@ int microcom_main(int argc UNUSED_PARAM, char **argv)
155skip_write: ; 156skip_write: ;
156 } 157 }
157 if (pfd[0].revents) { 158 if (pfd[0].revents) {
158#define iobuf bb_common_bufsiz1
159 ssize_t len; 159 ssize_t len;
160#define iobuf bb_common_bufsiz1
161 setup_common_bufsiz();
160 // read from device -> write to stdout 162 // read from device -> write to stdout
161 len = safe_read(sfd, iobuf, sizeof(iobuf)); 163 len = safe_read(sfd, iobuf, COMMON_BUFSIZE);
162 if (len > 0) 164 if (len > 0)
163 full_write(STDOUT_FILENO, iobuf, len); 165 full_write(STDOUT_FILENO, iobuf, len);
164 else { 166 else {
diff --git a/miscutils/setserial.c b/miscutils/setserial.c
index dfed3306e..8b5c4a9c7 100644
--- a/miscutils/setserial.c
+++ b/miscutils/setserial.c
@@ -257,7 +257,7 @@ enum print_mode
257#define CTL_CLOSE (1 << 3) 257#define CTL_CLOSE (1 << 3)
258#define CTL_NODIE (1 << 4) 258#define CTL_NODIE (1 << 4)
259 259
260static const char serial_types[] = 260static const char serial_types[] ALIGN1 =
261 "unknown\0" /* 0 */ 261 "unknown\0" /* 0 */
262 "8250\0" /* 1 */ 262 "8250\0" /* 1 */
263 "16450\0" /* 2 */ 263 "16450\0" /* 2 */
@@ -288,7 +288,7 @@ static const char serial_types[] =
288# define MAX_SERIAL_TYPE 13 288# define MAX_SERIAL_TYPE 13
289#endif 289#endif
290 290
291static const char commands[] = 291static const char commands[] ALIGN1 =
292 "spd_normal\0" 292 "spd_normal\0"
293 "spd_hi\0" 293 "spd_hi\0"
294 "spd_vhi\0" 294 "spd_vhi\0"
@@ -404,8 +404,8 @@ static const uint16_t setbits[CMD_FLAG_LAST + 1] =
404 ASYNC_LOW_LATENCY 404 ASYNC_LOW_LATENCY
405}; 405};
406 406
407static const char STR_INFINITE[] = "infinite"; 407#define STR_INFINITE "infinite"
408static const char STR_NONE[] = "none"; 408#define STR_NONE "none"
409 409
410static const char *uart_type(int type) 410static const char *uart_type(int type)
411{ 411{
diff --git a/networking/arp.c b/networking/arp.c
index 0099aa534..9381eb53a 100644
--- a/networking/arp.c
+++ b/networking/arp.c
@@ -32,6 +32,7 @@
32//usage: "\n -H HWTYPE Hardware address type" 32//usage: "\n -H HWTYPE Hardware address type"
33 33
34#include "libbb.h" 34#include "libbb.h"
35#include "common_bufsiz.h"
35#include "inet_common.h" 36#include "inet_common.h"
36 37
37#include <arpa/inet.h> 38#include <arpa/inet.h>
@@ -69,12 +70,13 @@ struct globals {
69 const char *device; /* current device */ 70 const char *device; /* current device */
70 smallint hw_set; /* flag if hw-type was set (-H) */ 71 smallint hw_set; /* flag if hw-type was set (-H) */
71} FIX_ALIASING; 72} FIX_ALIASING;
72#define G (*(struct globals*)&bb_common_bufsiz1) 73#define G (*(struct globals*)bb_common_bufsiz1)
73#define ap (G.ap ) 74#define ap (G.ap )
74#define hw (G.hw ) 75#define hw (G.hw )
75#define device (G.device ) 76#define device (G.device )
76#define hw_set (G.hw_set ) 77#define hw_set (G.hw_set )
77#define INIT_G() do { \ 78#define INIT_G() do { \
79 setup_common_bufsiz(); \
78 device = ""; \ 80 device = ""; \
79} while (0) 81} while (0)
80 82
diff --git a/networking/arping.c b/networking/arping.c
index ef205e5e6..6b0de4de2 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -28,6 +28,7 @@
28#include <netpacket/packet.h> 28#include <netpacket/packet.h>
29 29
30#include "libbb.h" 30#include "libbb.h"
31#include "common_bufsiz.h"
31 32
32/* We don't expect to see 1000+ seconds delay, unsigned is enough */ 33/* We don't expect to see 1000+ seconds delay, unsigned is enough */
33#define MONOTONIC_US() ((unsigned)monotonic_us()) 34#define MONOTONIC_US() ((unsigned)monotonic_us())
@@ -60,7 +61,7 @@ struct globals {
60 unsigned brd_recv; 61 unsigned brd_recv;
61 unsigned req_recv; 62 unsigned req_recv;
62} FIX_ALIASING; 63} FIX_ALIASING;
63#define G (*(struct globals*)&bb_common_bufsiz1) 64#define G (*(struct globals*)bb_common_bufsiz1)
64#define src (G.src ) 65#define src (G.src )
65#define dst (G.dst ) 66#define dst (G.dst )
66#define me (G.me ) 67#define me (G.me )
@@ -76,6 +77,7 @@ struct globals {
76#define brd_recv (G.brd_recv ) 77#define brd_recv (G.brd_recv )
77#define req_recv (G.req_recv ) 78#define req_recv (G.req_recv )
78#define INIT_G() do { \ 79#define INIT_G() do { \
80 setup_common_bufsiz(); \
79 count = -1; \ 81 count = -1; \
80} while (0) 82} while (0)
81 83
diff --git a/networking/ftpd.c b/networking/ftpd.c
index 8345ae67c..360d1e6be 100644
--- a/networking/ftpd.c
+++ b/networking/ftpd.c
@@ -29,6 +29,7 @@
29//usage: "\n DIR Change root to this directory" 29//usage: "\n DIR Change root to this directory"
30 30
31#include "libbb.h" 31#include "libbb.h"
32#include "common_bufsiz.h"
32#include <syslog.h> 33#include <syslog.h>
33#include <netinet/tcp.h> 34#include <netinet/tcp.h>
34 35
@@ -123,8 +124,9 @@ struct globals {
123 char msg_ok [(sizeof("NNN " MSG_OK ) + 3) & 0xfffc]; 124 char msg_ok [(sizeof("NNN " MSG_OK ) + 3) & 0xfffc];
124 char msg_err[(sizeof("NNN " MSG_ERR) + 3) & 0xfffc]; 125 char msg_err[(sizeof("NNN " MSG_ERR) + 3) & 0xfffc];
125} FIX_ALIASING; 126} FIX_ALIASING;
126#define G (*(struct globals*)&bb_common_bufsiz1) 127#define G (*(struct globals*)bb_common_bufsiz1)
127#define INIT_G() do { \ 128#define INIT_G() do { \
129 setup_common_bufsiz(); \
128 /* Moved to main */ \ 130 /* Moved to main */ \
129 /*strcpy(G.msg_ok + 4, MSG_OK );*/ \ 131 /*strcpy(G.msg_ok + 4, MSG_OK );*/ \
130 /*strcpy(G.msg_err + 4, MSG_ERR);*/ \ 132 /*strcpy(G.msg_err + 4, MSG_ERR);*/ \
diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c
index 607e82713..0bfe388a8 100644
--- a/networking/ftpgetput.c
+++ b/networking/ftpgetput.c
@@ -50,6 +50,7 @@
50//usage: ) 50//usage: )
51 51
52#include "libbb.h" 52#include "libbb.h"
53#include "common_bufsiz.h"
53 54
54struct globals { 55struct globals {
55 const char *user; 56 const char *user;
@@ -60,7 +61,7 @@ struct globals {
60 int do_continue; 61 int do_continue;
61 char buf[4]; /* actually [BUFSZ] */ 62 char buf[4]; /* actually [BUFSZ] */
62} FIX_ALIASING; 63} FIX_ALIASING;
63#define G (*(struct globals*)&bb_common_bufsiz1) 64#define G (*(struct globals*)bb_common_bufsiz1)
64enum { BUFSZ = COMMON_BUFSIZE - offsetof(struct globals, buf) }; 65enum { BUFSZ = COMMON_BUFSIZE - offsetof(struct globals, buf) };
65#define user (G.user ) 66#define user (G.user )
66#define password (G.password ) 67#define password (G.password )
@@ -70,6 +71,7 @@ enum { BUFSZ = COMMON_BUFSIZE - offsetof(struct globals, buf) };
70#define do_continue (G.do_continue ) 71#define do_continue (G.do_continue )
71#define buf (G.buf ) 72#define buf (G.buf )
72#define INIT_G() do { \ 73#define INIT_G() do { \
74 setup_common_bufsiz(); \
73 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 75 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
74} while (0) 76} while (0)
75 77
diff --git a/networking/httpd.c b/networking/httpd.c
index ed15fd883..abe83a458 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -125,6 +125,7 @@
125//usage: "\n -d STRING URL decode STRING" 125//usage: "\n -d STRING URL decode STRING"
126 126
127#include "libbb.h" 127#include "libbb.h"
128#include "common_bufsiz.h"
128#if ENABLE_PAM 129#if ENABLE_PAM
129/* PAM may include <locale.h>. We may need to undefine bbox's stub define: */ 130/* PAM may include <locale.h>. We may need to undefine bbox's stub define: */
130# undef setlocale 131# undef setlocale
@@ -307,7 +308,8 @@ struct globals {
307 Htaccess *script_i; /* config script interpreters */ 308 Htaccess *script_i; /* config script interpreters */
308#endif 309#endif
309 char *iobuf; /* [IOBUF_SIZE] */ 310 char *iobuf; /* [IOBUF_SIZE] */
310#define hdr_buf bb_common_bufsiz1 311#define hdr_buf bb_common_bufsiz1
312#define sizeof_hdr_buf COMMON_BUFSIZE
311 char *hdr_ptr; 313 char *hdr_ptr;
312 int hdr_cnt; 314 int hdr_cnt;
313#if ENABLE_FEATURE_HTTPD_ERROR_PAGES 315#if ENABLE_FEATURE_HTTPD_ERROR_PAGES
@@ -368,6 +370,7 @@ enum {
368# define content_gzip 0 370# define content_gzip 0
369#endif 371#endif
370#define INIT_G() do { \ 372#define INIT_G() do { \
373 setup_common_bufsiz(); \
371 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \ 374 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
372 IF_FEATURE_HTTPD_BASIC_AUTH(g_realm = "Web Server Authentication";) \ 375 IF_FEATURE_HTTPD_BASIC_AUTH(g_realm = "Web Server Authentication";) \
373 IF_FEATURE_HTTPD_RANGES(range_start = -1;) \ 376 IF_FEATURE_HTTPD_RANGES(range_start = -1;) \
@@ -1066,7 +1069,7 @@ static int get_line(void)
1066 alarm(HEADER_READ_TIMEOUT); 1069 alarm(HEADER_READ_TIMEOUT);
1067 while (1) { 1070 while (1) {
1068 if (hdr_cnt <= 0) { 1071 if (hdr_cnt <= 0) {
1069 hdr_cnt = safe_read(STDIN_FILENO, hdr_buf, sizeof(hdr_buf)); 1072 hdr_cnt = safe_read(STDIN_FILENO, hdr_buf, sizeof_hdr_buf);
1070 if (hdr_cnt <= 0) 1073 if (hdr_cnt <= 0)
1071 break; 1074 break;
1072 hdr_ptr = hdr_buf; 1075 hdr_ptr = hdr_buf;
@@ -1191,9 +1194,9 @@ static NOINLINE void cgi_io_loop_and_exit(int fromCgi_rd, int toCgi_wr, int post
1191 /* We expect data, prev data portion is eaten by CGI 1194 /* We expect data, prev data portion is eaten by CGI
1192 * and there *is* data to read from the peer 1195 * and there *is* data to read from the peer
1193 * (POSTDATA) */ 1196 * (POSTDATA) */
1194 //count = post_len > (int)sizeof(hdr_buf) ? (int)sizeof(hdr_buf) : post_len; 1197 //count = post_len > (int)sizeof_hdr_buf ? (int)sizeof_hdr_buf : post_len;
1195 //count = safe_read(STDIN_FILENO, hdr_buf, count); 1198 //count = safe_read(STDIN_FILENO, hdr_buf, count);
1196 count = safe_read(STDIN_FILENO, hdr_buf, sizeof(hdr_buf)); 1199 count = safe_read(STDIN_FILENO, hdr_buf, sizeof_hdr_buf);
1197 if (count > 0) { 1200 if (count > 0) {
1198 hdr_cnt = count; 1201 hdr_cnt = count;
1199 hdr_ptr = hdr_buf; 1202 hdr_ptr = hdr_buf;
diff --git a/networking/ifupdown.c b/networking/ifupdown.c
index 2c6db926f..25b04c9d7 100644
--- a/networking/ifupdown.c
+++ b/networking/ifupdown.c
@@ -44,6 +44,7 @@
44//usage: "\n -f Force de/configuration" 44//usage: "\n -f Force de/configuration"
45 45
46#include "libbb.h" 46#include "libbb.h"
47#include "common_bufsiz.h"
47/* After libbb.h, since it needs sys/types.h on some systems */ 48/* After libbb.h, since it needs sys/types.h on some systems */
48#include <sys/utsname.h> 49#include <sys/utsname.h>
49#include <fnmatch.h> 50#include <fnmatch.h>
@@ -129,8 +130,8 @@ struct globals {
129 const char *startup_PATH; 130 const char *startup_PATH;
130 char *shell; 131 char *shell;
131} FIX_ALIASING; 132} FIX_ALIASING;
132#define G (*(struct globals*)&bb_common_bufsiz1) 133#define G (*(struct globals*)bb_common_bufsiz1)
133#define INIT_G() do { } while (0) 134#define INIT_G() do { setup_common_bufsiz(); } while (0)
134 135
135 136
136static const char keywords_up_down[] ALIGN1 = 137static const char keywords_up_down[] ALIGN1 =
diff --git a/networking/inetd.c b/networking/inetd.c
index 4f6673b12..8d44b5198 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -170,6 +170,7 @@
170#include <sys/un.h> 170#include <sys/un.h>
171 171
172#include "libbb.h" 172#include "libbb.h"
173#include "common_bufsiz.h"
173 174
174#if ENABLE_FEATURE_INETD_RPC 175#if ENABLE_FEATURE_INETD_RPC
175# if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_RPC__) 176# if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_RPC__)
@@ -327,7 +328,7 @@ struct globals {
327 /* Used in next_line(), and as scratch read buffer */ 328 /* Used in next_line(), and as scratch read buffer */
328 char line[256]; /* _at least_ 256, see LINE_SIZE */ 329 char line[256]; /* _at least_ 256, see LINE_SIZE */
329} FIX_ALIASING; 330} FIX_ALIASING;
330#define G (*(struct globals*)&bb_common_bufsiz1) 331#define G (*(struct globals*)bb_common_bufsiz1)
331enum { LINE_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line) }; 332enum { LINE_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line) };
332#define rlim_ofile_cur (G.rlim_ofile_cur ) 333#define rlim_ofile_cur (G.rlim_ofile_cur )
333#define rlim_ofile (G.rlim_ofile ) 334#define rlim_ofile (G.rlim_ofile )
@@ -349,6 +350,7 @@ enum { LINE_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line) };
349#define allsock (G.allsock ) 350#define allsock (G.allsock )
350#define line (G.line ) 351#define line (G.line )
351#define INIT_G() do { \ 352#define INIT_G() do { \
353 setup_common_bufsiz(); \
352 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 354 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
353 rlim_ofile_cur = OPEN_MAX; \ 355 rlim_ofile_cur = OPEN_MAX; \
354 global_queuelen = 128; \ 356 global_queuelen = 128; \
diff --git a/networking/isrv_identd.c b/networking/isrv_identd.c
index 252c8aba9..8a15926e5 100644
--- a/networking/isrv_identd.c
+++ b/networking/isrv_identd.c
@@ -18,6 +18,7 @@
18//usage: "\n STRING Ident answer string (default: nobody)" 18//usage: "\n STRING Ident answer string (default: nobody)"
19 19
20#include "libbb.h" 20#include "libbb.h"
21#include "common_bufsiz.h"
21#include <syslog.h> 22#include <syslog.h>
22#include "isrv.h" 23#include "isrv.h"
23 24
@@ -115,10 +116,12 @@ int fakeidentd_main(int argc UNUSED_PARAM, char **argv)
115 unsigned opt; 116 unsigned opt;
116 int fd; 117 int fd;
117 118
119 setup_common_bufsiz();
120
118 opt = getopt32(argv, "fiwb:", &bind_address); 121 opt = getopt32(argv, "fiwb:", &bind_address);
119 strcpy(bogouser, "nobody"); 122 strcpy(bogouser, "nobody");
120 if (argv[optind]) 123 if (argv[optind])
121 strncpy(bogouser, argv[optind], sizeof(bogouser) - 1); 124 strncpy(bogouser, argv[optind], COMMON_BUFSIZE - 1);
122 125
123 /* Daemonize if no -f and no -i and no -w */ 126 /* Daemonize if no -f and no -i and no -w */
124 if (!(opt & OPT_fiw)) 127 if (!(opt & OPT_fiw))
diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c
index 5c975d8c5..d9e099607 100644
--- a/networking/libiproute/ipaddress.c
+++ b/networking/libiproute/ipaddress.c
@@ -13,6 +13,7 @@
13#include <net/if_arp.h> 13#include <net/if_arp.h>
14 14
15#include "ip_common.h" /* #include "libbb.h" is inside */ 15#include "ip_common.h" /* #include "libbb.h" is inside */
16#include "common_bufsiz.h"
16#include "rt_names.h" 17#include "rt_names.h"
17#include "utils.h" 18#include "utils.h"
18 19
@@ -39,8 +40,8 @@ struct filter_t {
39} FIX_ALIASING; 40} FIX_ALIASING;
40typedef struct filter_t filter_t; 41typedef struct filter_t filter_t;
41 42
42#define G_filter (*(filter_t*)&bb_common_bufsiz1) 43#define G_filter (*(filter_t*)bb_common_bufsiz1)
43 44#define INIT_G() do { setup_common_bufsiz(); } while (0)
44 45
45static void print_link_flags(unsigned flags, unsigned mdown) 46static void print_link_flags(unsigned flags, unsigned mdown)
46{ 47{
@@ -744,6 +745,9 @@ int FAST_FUNC do_ipaddr(char **argv)
744 /* 0 1 2 3 4 5 6 7 8 */ 745 /* 0 1 2 3 4 5 6 7 8 */
745 "add\0""change\0""chg\0""replace\0""delete\0""list\0""show\0""lst\0""flush\0"; 746 "add\0""change\0""chg\0""replace\0""delete\0""list\0""show\0""lst\0""flush\0";
746 int cmd = 2; 747 int cmd = 2;
748
749 INIT_G();
750
747 if (*argv) { 751 if (*argv) {
748 cmd = index_in_substrings(commands, *argv); 752 cmd = index_in_substrings(commands, *argv);
749 if (cmd < 0) 753 if (cmd < 0)
diff --git a/networking/libiproute/ipneigh.c b/networking/libiproute/ipneigh.c
index 179505c2d..2a1c20e20 100644
--- a/networking/libiproute/ipneigh.c
+++ b/networking/libiproute/ipneigh.c
@@ -8,6 +8,7 @@
8 */ 8 */
9 9
10#include "ip_common.h" /* #include "libbb.h" is inside */ 10#include "ip_common.h" /* #include "libbb.h" is inside */
11#include "common_bufsiz.h"
11#include "rt_names.h" 12#include "rt_names.h"
12#include "utils.h" 13#include "utils.h"
13#include <linux/neighbour.h> 14#include <linux/neighbour.h>
@@ -40,7 +41,8 @@ struct filter_t {
40} FIX_ALIASING; 41} FIX_ALIASING;
41typedef struct filter_t filter_t; 42typedef struct filter_t filter_t;
42 43
43#define G_filter (*(filter_t*)&bb_common_bufsiz1) 44#define G_filter (*(filter_t*)bb_common_bufsiz1)
45#define INIT_G() do { setup_common_bufsiz(); } while (0)
44 46
45static int flush_update(void) 47static int flush_update(void)
46{ 48{
@@ -60,7 +62,7 @@ static unsigned nud_state_a2n(char *arg)
60 "stale\0" "incomplete\0" "delay\0" "probe\0" 62 "stale\0" "incomplete\0" "delay\0" "probe\0"
61 "failed\0" 63 "failed\0"
62 ; 64 ;
63 static uint8_t nuds[] = { 65 static uint8_t nuds[] ALIGN1 = {
64 NUD_PERMANENT,NUD_REACHABLE, NUD_NOARP,NUD_NONE, 66 NUD_PERMANENT,NUD_REACHABLE, NUD_NOARP,NUD_NONE,
65 NUD_STALE, NUD_INCOMPLETE,NUD_DELAY,NUD_PROBE, 67 NUD_STALE, NUD_INCOMPLETE,NUD_DELAY,NUD_PROBE,
66 NUD_FAILED 68 NUD_FAILED
@@ -338,6 +340,8 @@ int FAST_FUNC do_ipneigh(char **argv)
338 /*0-1*/ "show\0" "flush\0"; 340 /*0-1*/ "show\0" "flush\0";
339 int command_num; 341 int command_num;
340 342
343 INIT_G();
344
341 if (!*argv) 345 if (!*argv)
342 return ipneigh_list_or_flush(argv, 0); 346 return ipneigh_list_or_flush(argv, 0);
343 347
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index 82827488f..e674e9a0d 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -11,6 +11,7 @@
11 */ 11 */
12 12
13#include "ip_common.h" /* #include "libbb.h" is inside */ 13#include "ip_common.h" /* #include "libbb.h" is inside */
14#include "common_bufsiz.h"
14#include "rt_names.h" 15#include "rt_names.h"
15#include "utils.h" 16#include "utils.h"
16 17
@@ -43,7 +44,8 @@ struct filter_t {
43} FIX_ALIASING; 44} FIX_ALIASING;
44typedef struct filter_t filter_t; 45typedef struct filter_t filter_t;
45 46
46#define G_filter (*(filter_t*)&bb_common_bufsiz1) 47#define G_filter (*(filter_t*)bb_common_bufsiz1)
48#define INIT_G() do { setup_common_bufsiz(); } while (0)
47 49
48static int flush_update(void) 50static int flush_update(void)
49{ 51{
@@ -902,6 +904,8 @@ int FAST_FUNC do_iproute(char **argv)
902 unsigned flags = 0; 904 unsigned flags = 0;
903 int cmd = RTM_NEWROUTE; 905 int cmd = RTM_NEWROUTE;
904 906
907 INIT_G();
908
905 if (!*argv) 909 if (!*argv)
906 return iproute_list_or_flush(argv, 0); 910 return iproute_list_or_flush(argv, 0);
907 911
diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c
index c7533a4a7..cbb5daf95 100644
--- a/networking/libiproute/libnetlink.c
+++ b/networking/libiproute/libnetlink.c
@@ -71,11 +71,15 @@ int FAST_FUNC rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, in
71 struct nlmsghdr nlh; 71 struct nlmsghdr nlh;
72 struct sockaddr_nl nladdr; 72 struct sockaddr_nl nladdr;
73 struct iovec iov[2] = { { &nlh, sizeof(nlh) }, { req, len } }; 73 struct iovec iov[2] = { { &nlh, sizeof(nlh) }, { req, len } };
74 /* Use designated initializers, struct layout is non-portable */
74 struct msghdr msg = { 75 struct msghdr msg = {
75 (void*)&nladdr, sizeof(nladdr), 76 .msg_name = (void*)&nladdr,
76 iov, 2, 77 .msg_namelen = sizeof(nladdr),
77 NULL, 0, 78 .msg_iov = iov,
78 0 79 .msg_iovlen = 2,
80 .msg_control = NULL,
81 .msg_controllen = 0,
82 .msg_flags = 0
79 }; 83 };
80 84
81 memset(&nladdr, 0, sizeof(nladdr)); 85 memset(&nladdr, 0, sizeof(nladdr));
@@ -104,12 +108,15 @@ static int rtnl_dump_filter(struct rtnl_handle *rth,
104 while (1) { 108 while (1) {
105 int status; 109 int status;
106 struct nlmsghdr *h; 110 struct nlmsghdr *h;
107 111 /* Use designated initializers, struct layout is non-portable */
108 struct msghdr msg = { 112 struct msghdr msg = {
109 (void*)&nladdr, sizeof(nladdr), 113 .msg_name = (void*)&nladdr,
110 &iov, 1, 114 .msg_namelen = sizeof(nladdr),
111 NULL, 0, 115 .msg_iov = &iov,
112 0 116 .msg_iovlen = 1,
117 .msg_control = NULL,
118 .msg_controllen = 0,
119 .msg_flags = 0
113 }; 120 };
114 121
115 status = recvmsg(rth->fd, &msg, 0); 122 status = recvmsg(rth->fd, &msg, 0);
@@ -211,11 +218,15 @@ int FAST_FUNC rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
211 struct sockaddr_nl nladdr; 218 struct sockaddr_nl nladdr;
212 struct iovec iov = { (void*)n, n->nlmsg_len }; 219 struct iovec iov = { (void*)n, n->nlmsg_len };
213 char *buf = xmalloc(8*1024); /* avoid big stack buffer */ 220 char *buf = xmalloc(8*1024); /* avoid big stack buffer */
221 /* Use designated initializers, struct layout is non-portable */
214 struct msghdr msg = { 222 struct msghdr msg = {
215 (void*)&nladdr, sizeof(nladdr), 223 .msg_name = (void*)&nladdr,
216 &iov, 1, 224 .msg_namelen = sizeof(nladdr),
217 NULL, 0, 225 .msg_iov = &iov,
218 0 226 .msg_iovlen = 1,
227 .msg_control = NULL,
228 .msg_controllen = 0,
229 .msg_flags = 0
219 }; 230 };
220 231
221 memset(&nladdr, 0, sizeof(nladdr)); 232 memset(&nladdr, 0, sizeof(nladdr));
diff --git a/networking/libiproute/ll_proto.c b/networking/libiproute/ll_proto.c
index da2b53cbf..4c32ae574 100644
--- a/networking/libiproute/ll_proto.c
+++ b/networking/libiproute/ll_proto.c
@@ -84,7 +84,7 @@ ETH_P_IP
84 84
85/* Keep declarations above and below in sync! */ 85/* Keep declarations above and below in sync! */
86 86
87static const char llproto_names[] = 87static const char llproto_names[] ALIGN1 =
88#define __PF(f,n) #n "\0" 88#define __PF(f,n) #n "\0"
89__PF(LOOP,loop) 89__PF(LOOP,loop)
90__PF(PUP,pup) 90__PF(PUP,pup)
diff --git a/networking/libiproute/ll_types.c b/networking/libiproute/ll_types.c
index bb42e269e..62ee0cc54 100644
--- a/networking/libiproute/ll_types.c
+++ b/networking/libiproute/ll_types.c
@@ -16,7 +16,7 @@
16 16
17const char* FAST_FUNC ll_type_n2a(int type, char *buf) 17const char* FAST_FUNC ll_type_n2a(int type, char *buf)
18{ 18{
19 static const char arphrd_name[] = 19 static const char arphrd_name[] ALIGN1 =
20 /* 0, */ "generic" "\0" 20 /* 0, */ "generic" "\0"
21 /* ARPHRD_LOOPBACK, */ "loopback" "\0" 21 /* ARPHRD_LOOPBACK, */ "loopback" "\0"
22 /* ARPHRD_ETHER, */ "ether" "\0" 22 /* ARPHRD_ETHER, */ "ether" "\0"
@@ -105,7 +105,7 @@ const char* FAST_FUNC ll_type_n2a(int type, char *buf)
105 105
106 /* Keep these arrays in sync! */ 106 /* Keep these arrays in sync! */
107 107
108 static const uint16_t arphrd_type[] = { 108 static const uint16_t arphrd_type[] ALIGN2 = {
109 0, /* "generic" "\0" */ 109 0, /* "generic" "\0" */
110 ARPHRD_LOOPBACK, /* "loopback" "\0" */ 110 ARPHRD_LOOPBACK, /* "loopback" "\0" */
111 ARPHRD_ETHER, /* "ether" "\0" */ 111 ARPHRD_ETHER, /* "ether" "\0" */
diff --git a/networking/nc.c b/networking/nc.c
index 2f9e17466..13a9b48a8 100644
--- a/networking/nc.c
+++ b/networking/nc.c
@@ -8,6 +8,7 @@
8 */ 8 */
9 9
10#include "libbb.h" 10#include "libbb.h"
11#include "common_bufsiz.h"
11 12
12//config:config NC 13//config:config NC
13//config: bool "nc" 14//config: bool "nc"
@@ -238,6 +239,8 @@ int nc_main(int argc, char **argv)
238 FD_SET(cfd, &readfds); 239 FD_SET(cfd, &readfds);
239 FD_SET(STDIN_FILENO, &readfds); 240 FD_SET(STDIN_FILENO, &readfds);
240 241
242#define iobuf bb_common_bufsiz1
243 setup_common_bufsiz();
241 for (;;) { 244 for (;;) {
242 int fd; 245 int fd;
243 int ofd; 246 int ofd;
@@ -248,11 +251,10 @@ int nc_main(int argc, char **argv)
248 if (select(cfd + 1, &testfds, NULL, NULL, NULL) < 0) 251 if (select(cfd + 1, &testfds, NULL, NULL, NULL) < 0)
249 bb_perror_msg_and_die("select"); 252 bb_perror_msg_and_die("select");
250 253
251#define iobuf bb_common_bufsiz1
252 fd = STDIN_FILENO; 254 fd = STDIN_FILENO;
253 while (1) { 255 while (1) {
254 if (FD_ISSET(fd, &testfds)) { 256 if (FD_ISSET(fd, &testfds)) {
255 nread = safe_read(fd, iobuf, sizeof(iobuf)); 257 nread = safe_read(fd, iobuf, COMMON_BUFSIZE);
256 if (fd == cfd) { 258 if (fd == cfd) {
257 if (nread < 1) 259 if (nread < 1)
258 exit(EXIT_SUCCESS); 260 exit(EXIT_SUCCESS);
diff --git a/networking/ping.c b/networking/ping.c
index 0eb1ae799..cfe682646 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -28,6 +28,7 @@
28#include <net/if.h> 28#include <net/if.h>
29#include <netinet/ip_icmp.h> 29#include <netinet/ip_icmp.h>
30#include "libbb.h" 30#include "libbb.h"
31#include "common_bufsiz.h"
31 32
32#ifdef __BIONIC__ 33#ifdef __BIONIC__
33/* should be in netinet/ip_icmp.h */ 34/* should be in netinet/ip_icmp.h */
@@ -186,8 +187,8 @@ struct globals {
186 char *hostname; 187 char *hostname;
187 char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; 188 char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN];
188} FIX_ALIASING; 189} FIX_ALIASING;
189#define G (*(struct globals*)&bb_common_bufsiz1) 190#define G (*(struct globals*)bb_common_bufsiz1)
190#define INIT_G() do { } while (0) 191#define INIT_G() do { setup_common_bufsiz(); } while (0)
191 192
192static void noresp(int ign UNUSED_PARAM) 193static void noresp(int ign UNUSED_PARAM)
193{ 194{
@@ -378,7 +379,7 @@ struct globals {
378 } pingaddr; 379 } pingaddr;
379 unsigned char rcvd_tbl[MAX_DUP_CHK / 8]; 380 unsigned char rcvd_tbl[MAX_DUP_CHK / 8];
380} FIX_ALIASING; 381} FIX_ALIASING;
381#define G (*(struct globals*)&bb_common_bufsiz1) 382#define G (*(struct globals*)bb_common_bufsiz1)
382#define if_index (G.if_index ) 383#define if_index (G.if_index )
383#define source_lsa (G.source_lsa ) 384#define source_lsa (G.source_lsa )
384#define str_I (G.str_I ) 385#define str_I (G.str_I )
@@ -397,6 +398,7 @@ struct globals {
397#define pingaddr (G.pingaddr ) 398#define pingaddr (G.pingaddr )
398#define rcvd_tbl (G.rcvd_tbl ) 399#define rcvd_tbl (G.rcvd_tbl )
399#define INIT_G() do { \ 400#define INIT_G() do { \
401 setup_common_bufsiz(); \
400 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 402 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
401 datalen = DEFDATALEN; \ 403 datalen = DEFDATALEN; \
402 timeout = MAXWAIT; \ 404 timeout = MAXWAIT; \
diff --git a/networking/slattach.c b/networking/slattach.c
index 14e0c1941..2d1305e32 100644
--- a/networking/slattach.c
+++ b/networking/slattach.c
@@ -27,6 +27,7 @@
27//usage: "\n -F Disable RTS/CTS flow control" 27//usage: "\n -F Disable RTS/CTS flow control"
28 28
29#include "libbb.h" 29#include "libbb.h"
30#include "common_bufsiz.h"
30#include "libiproute/utils.h" /* invarg_1_to_2() */ 31#include "libiproute/utils.h" /* invarg_1_to_2() */
31 32
32struct globals { 33struct globals {
@@ -34,11 +35,11 @@ struct globals {
34 int saved_disc; 35 int saved_disc;
35 struct termios saved_state; 36 struct termios saved_state;
36} FIX_ALIASING; 37} FIX_ALIASING;
37#define G (*(struct globals*)&bb_common_bufsiz1) 38#define G (*(struct globals*)bb_common_bufsiz1)
38#define handle (G.handle ) 39#define handle (G.handle )
39#define saved_disc (G.saved_disc ) 40#define saved_disc (G.saved_disc )
40#define saved_state (G.saved_state ) 41#define saved_state (G.saved_state )
41#define INIT_G() do { } while (0) 42#define INIT_G() do { setup_common_bufsiz(); } while (0)
42 43
43 44
44/* 45/*
diff --git a/networking/tc.c b/networking/tc.c
index c84c18a67..d0bcbdeaa 100644
--- a/networking/tc.c
+++ b/networking/tc.c
@@ -29,6 +29,7 @@
29//usage: "filter show [ dev STRING ] [ root | parent CLASSID ]" 29//usage: "filter show [ dev STRING ] [ root | parent CLASSID ]"
30 30
31#include "libbb.h" 31#include "libbb.h"
32#include "common_bufsiz.h"
32 33
33#include "libiproute/utils.h" 34#include "libiproute/utils.h"
34#include "libiproute/ip_common.h" 35#include "libiproute/ip_common.h"
@@ -63,13 +64,14 @@ struct globals {
63 uint32_t filter_prio; 64 uint32_t filter_prio;
64 uint32_t filter_proto; 65 uint32_t filter_proto;
65} FIX_ALIASING; 66} FIX_ALIASING;
66#define G (*(struct globals*)&bb_common_bufsiz1) 67#define G (*(struct globals*)bb_common_bufsiz1)
67#define filter_ifindex (G.filter_ifindex) 68#define filter_ifindex (G.filter_ifindex)
68#define filter_qdisc (G.filter_qdisc) 69#define filter_qdisc (G.filter_qdisc)
69#define filter_parent (G.filter_parent) 70#define filter_parent (G.filter_parent)
70#define filter_prio (G.filter_prio) 71#define filter_prio (G.filter_prio)
71#define filter_proto (G.filter_proto) 72#define filter_proto (G.filter_proto)
72#define INIT_G() do { \ 73#define INIT_G() do { \
74 setup_common_bufsiz(); \
73 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 75 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
74} while (0) 76} while (0)
75 77
diff --git a/networking/tcpudp.c b/networking/tcpudp.c
index 3df6a98d8..31bc70459 100644
--- a/networking/tcpudp.c
+++ b/networking/tcpudp.c
@@ -67,6 +67,7 @@
67//usage: "\n -v Verbose" 67//usage: "\n -v Verbose"
68 68
69#include "libbb.h" 69#include "libbb.h"
70#include "common_bufsiz.h"
70 71
71/* Wants <limits.h> etc, thus included after libbb.h: */ 72/* Wants <limits.h> etc, thus included after libbb.h: */
72#ifdef __linux__ 73#ifdef __linux__
@@ -91,7 +92,7 @@ struct globals {
91 char **env_cur; 92 char **env_cur;
92 char *env_var[1]; /* actually bigger */ 93 char *env_var[1]; /* actually bigger */
93} FIX_ALIASING; 94} FIX_ALIASING;
94#define G (*(struct globals*)&bb_common_bufsiz1) 95#define G (*(struct globals*)bb_common_bufsiz1)
95#define verbose (G.verbose ) 96#define verbose (G.verbose )
96#define max_per_host (G.max_per_host) 97#define max_per_host (G.max_per_host)
97#define cur_per_host (G.cur_per_host) 98#define cur_per_host (G.cur_per_host)
@@ -100,6 +101,7 @@ struct globals {
100#define env_cur (G.env_cur ) 101#define env_cur (G.env_cur )
101#define env_var (G.env_var ) 102#define env_var (G.env_var )
102#define INIT_G() do { \ 103#define INIT_G() do { \
104 setup_common_bufsiz(); \
103 cmax = 30; \ 105 cmax = 30; \
104 env_cur = &env_var[0]; \ 106 env_cur = &env_var[0]; \
105} while (0) 107} while (0)
diff --git a/networking/telnet.c b/networking/telnet.c
index 944cf1bd6..d2daf5c8c 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -39,6 +39,7 @@
39#include <arpa/telnet.h> 39#include <arpa/telnet.h>
40#include <netinet/in.h> 40#include <netinet/in.h>
41#include "libbb.h" 41#include "libbb.h"
42#include "common_bufsiz.h"
42 43
43#ifdef __BIONIC__ 44#ifdef __BIONIC__
44/* should be in arpa/telnet.h */ 45/* should be in arpa/telnet.h */
@@ -108,8 +109,9 @@ struct globals {
108 struct termios termios_def; 109 struct termios termios_def;
109 struct termios termios_raw; 110 struct termios termios_raw;
110} FIX_ALIASING; 111} FIX_ALIASING;
111#define G (*(struct globals*)&bb_common_bufsiz1) 112#define G (*(struct globals*)bb_common_bufsiz1)
112#define INIT_G() do { \ 113#define INIT_G() do { \
114 setup_common_bufsiz(); \
113 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 115 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
114} while (0) 116} while (0)
115 117
diff --git a/networking/telnetd.c b/networking/telnetd.c
index 25d05fe7a..13c36aa46 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -44,6 +44,7 @@
44#define DEBUG 0 44#define DEBUG 0
45 45
46#include "libbb.h" 46#include "libbb.h"
47#include "common_bufsiz.h"
47#include <syslog.h> 48#include <syslog.h>
48 49
49#if DEBUG 50#if DEBUG
@@ -82,8 +83,9 @@ struct globals {
82 const char *issuefile; 83 const char *issuefile;
83 int maxfd; 84 int maxfd;
84} FIX_ALIASING; 85} FIX_ALIASING;
85#define G (*(struct globals*)&bb_common_bufsiz1) 86#define G (*(struct globals*)bb_common_bufsiz1)
86#define INIT_G() do { \ 87#define INIT_G() do { \
88 setup_common_bufsiz(); \
87 G.loginpath = "/bin/login"; \ 89 G.loginpath = "/bin/login"; \
88 G.issuefile = "/etc/issue.net"; \ 90 G.issuefile = "/etc/issue.net"; \
89} while (0) 91} while (0)
diff --git a/networking/telnetd.ctrlSQ.patch b/networking/telnetd.ctrlSQ.patch
index 7060e1c6e..bc26d2279 100644
--- a/networking/telnetd.ctrlSQ.patch
+++ b/networking/telnetd.ctrlSQ.patch
@@ -94,9 +94,9 @@ exceptional conditions.
94 #endif 94 #endif
95+#ifdef TIOCPKT 95+#ifdef TIOCPKT
96+ int control; 96+ int control;
97+ static const char lflow_on[] = 97+ static const char lflow_on[] ALIGN1 =
98+ {IAC, SB, TELOPT_LFLOW, LFLOW_ON, IAC, SE}; 98+ {IAC, SB, TELOPT_LFLOW, LFLOW_ON, IAC, SE};
99+ static const char lflow_off[] = 99+ static const char lflow_off[] ALIGN1 =
100+ {IAC, SB, TELOPT_LFLOW, LFLOW_OFF, IAC, SE}; 100+ {IAC, SB, TELOPT_LFLOW, LFLOW_OFF, IAC, SE};
101+# define RESERVED sizeof(lflow_on) 101+# define RESERVED sizeof(lflow_on)
102+#else 102+#else
diff --git a/networking/tftp.c b/networking/tftp.c
index ad9308e52..e879c4674 100644
--- a/networking/tftp.c
+++ b/networking/tftp.c
@@ -51,6 +51,7 @@
51//usage: "\n -l Log to syslog (inetd mode requires this)" 51//usage: "\n -l Log to syslog (inetd mode requires this)"
52 52
53#include "libbb.h" 53#include "libbb.h"
54#include "common_bufsiz.h"
54#include <syslog.h> 55#include <syslog.h>
55 56
56#if ENABLE_FEATURE_TFTP_GET || ENABLE_FEATURE_TFTP_PUT 57#if ENABLE_FEATURE_TFTP_GET || ENABLE_FEATURE_TFTP_PUT
@@ -128,8 +129,9 @@ struct globals {
128 bb_progress_t pmt; 129 bb_progress_t pmt;
129#endif 130#endif
130} FIX_ALIASING; 131} FIX_ALIASING;
131#define G (*(struct globals*)&bb_common_bufsiz1) 132#define G (*(struct globals*)bb_common_bufsiz1)
132#define INIT_G() do { \ 133#define INIT_G() do { \
134 setup_common_bufsiz(); \
133 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 135 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
134} while (0) 136} while (0)
135 137
@@ -757,7 +759,8 @@ int tftpd_main(int argc UNUSED_PARAM, char **argv)
757{ 759{
758 len_and_sockaddr *our_lsa; 760 len_and_sockaddr *our_lsa;
759 len_and_sockaddr *peer_lsa; 761 len_and_sockaddr *peer_lsa;
760 char *local_file, *mode, *user_opt; 762 char *mode, *user_opt;
763 char *local_file = local_file;
761 const char *error_msg; 764 const char *error_msg;
762 int opt, result, opcode; 765 int opt, result, opcode;
763 IF_FEATURE_TFTP_BLOCKSIZE(int blksize = TFTP_BLKSIZE_DEFAULT;) 766 IF_FEATURE_TFTP_BLOCKSIZE(int blksize = TFTP_BLKSIZE_DEFAULT;)
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index 496ab11a1..a526494d7 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -9,6 +9,7 @@
9#define UDHCP_COMMON_H 1 9#define UDHCP_COMMON_H 1
10 10
11#include "libbb.h" 11#include "libbb.h"
12#include "common_bufsiz.h"
12#include <netinet/udp.h> 13#include <netinet/udp.h>
13#include <netinet/ip.h> 14#include <netinet/ip.h>
14 15
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index 422254d62..c77669a31 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -930,6 +930,8 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
930 int retval; 930 int retval;
931 fd_set rfds; 931 fd_set rfds;
932 932
933 setup_common_bufsiz();
934
933 /* Default options */ 935 /* Default options */
934 IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;) 936 IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;)
935 IF_FEATURE_UDHCP_PORT(CLIENT_PORT6 = 546;) 937 IF_FEATURE_UDHCP_PORT(CLIENT_PORT6 = 546;)
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 660b943ce..fc7b6216d 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -109,7 +109,7 @@ enum {
109/*** Script execution code ***/ 109/*** Script execution code ***/
110 110
111/* get a rough idea of how long an option will be (rounding up...) */ 111/* get a rough idea of how long an option will be (rounding up...) */
112static const uint8_t len_of_option_as_string[] = { 112static const uint8_t len_of_option_as_string[] ALIGN1 = {
113 [OPTION_IP ] = sizeof("255.255.255.255 "), 113 [OPTION_IP ] = sizeof("255.255.255.255 "),
114 [OPTION_IP_PAIR ] = sizeof("255.255.255.255 ") * 2, 114 [OPTION_IP_PAIR ] = sizeof("255.255.255.255 ") * 2,
115 [OPTION_STATIC_ROUTES ] = sizeof("255.255.255.255/32 255.255.255.255 "), 115 [OPTION_STATIC_ROUTES ] = sizeof("255.255.255.255/32 255.255.255.255 "),
@@ -1268,6 +1268,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1268 int retval; 1268 int retval;
1269 fd_set rfds; 1269 fd_set rfds;
1270 1270
1271 setup_common_bufsiz();
1272
1271 /* Default options */ 1273 /* Default options */
1272 IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;) 1274 IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;)
1273 IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;) 1275 IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;)
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index 2671ea3e2..e93a9f1da 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -310,10 +310,10 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
310 unsigned arpping_ms; 310 unsigned arpping_ms;
311 IF_FEATURE_UDHCP_PORT(char *str_P;) 311 IF_FEATURE_UDHCP_PORT(char *str_P;)
312 312
313#if ENABLE_FEATURE_UDHCP_PORT 313 setup_common_bufsiz();
314 SERVER_PORT = 67; 314
315 CLIENT_PORT = 68; 315 IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;)
316#endif 316 IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;)
317 317
318#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1 318#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
319 opt_complementary = "vv"; 319 opt_complementary = "vv";
diff --git a/networking/udhcp/dhcpd.h b/networking/udhcp/dhcpd.h
index 183e7e24c..9dd5bef9e 100644
--- a/networking/udhcp/dhcpd.h
+++ b/networking/udhcp/dhcpd.h
@@ -57,7 +57,7 @@ struct server_config_t {
57 struct static_lease *static_leases; /* List of ip/mac pairs to assign static leases */ 57 struct static_lease *static_leases; /* List of ip/mac pairs to assign static leases */
58} FIX_ALIASING; 58} FIX_ALIASING;
59 59
60#define server_config (*(struct server_config_t*)&bb_common_bufsiz1) 60#define server_config (*(struct server_config_t*)bb_common_bufsiz1)
61/* client_config sits in 2nd half of bb_common_bufsiz1 */ 61/* client_config sits in 2nd half of bb_common_bufsiz1 */
62 62
63#if ENABLE_FEATURE_UDHCP_PORT 63#if ENABLE_FEATURE_UDHCP_PORT
diff --git a/networking/udhcp/dhcprelay.c b/networking/udhcp/dhcprelay.c
index f82ac05b4..f52a0cf88 100644
--- a/networking/udhcp/dhcprelay.c
+++ b/networking/udhcp/dhcprelay.c
@@ -33,7 +33,8 @@ struct xid_item {
33 struct xid_item *next; 33 struct xid_item *next;
34} FIX_ALIASING; 34} FIX_ALIASING;
35 35
36#define dhcprelay_xid_list (*(struct xid_item*)&bb_common_bufsiz1) 36#define dhcprelay_xid_list (*(struct xid_item*)bb_common_bufsiz1)
37#define INIT_G() do { setup_common_bufsiz(); } while (0)
37 38
38static struct xid_item *xid_add(uint32_t xid, struct sockaddr_in *ip, int client) 39static struct xid_item *xid_add(uint32_t xid, struct sockaddr_in *ip, int client)
39{ 40{
@@ -257,6 +258,8 @@ int dhcprelay_main(int argc, char **argv)
257 int num_sockets, max_socket; 258 int num_sockets, max_socket;
258 uint32_t our_nip; 259 uint32_t our_nip;
259 260
261 INIT_G();
262
260 server_addr.sin_family = AF_INET; 263 server_addr.sin_family = AF_INET;
261 server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); 264 server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
262 server_addr.sin_port = htons(SERVER_PORT); 265 server_addr.sin_port = htons(SERVER_PORT);
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c
index 7b57c6258..b22425352 100644
--- a/networking/udhcp/files.c
+++ b/networking/udhcp/files.c
@@ -57,33 +57,35 @@ static int FAST_FUNC read_staticlease(const char *const_line, void *arg)
57struct config_keyword { 57struct config_keyword {
58 const char *keyword; 58 const char *keyword;
59 int (*handler)(const char *line, void *var) FAST_FUNC; 59 int (*handler)(const char *line, void *var) FAST_FUNC;
60 void *var; 60 unsigned ofs;
61 const char *def; 61 const char *def;
62}; 62};
63 63
64#define OFS(field) offsetof(struct server_config_t, field)
65
64static const struct config_keyword keywords[] = { 66static const struct config_keyword keywords[] = {
65 /* keyword handler variable address default */ 67 /* keyword handler variable address default */
66 {"start" , udhcp_str2nip , &server_config.start_ip , "192.168.0.20"}, 68 {"start" , udhcp_str2nip , OFS(start_ip ), "192.168.0.20"},
67 {"end" , udhcp_str2nip , &server_config.end_ip , "192.168.0.254"}, 69 {"end" , udhcp_str2nip , OFS(end_ip ), "192.168.0.254"},
68 {"interface" , read_str , &server_config.interface , "eth0"}, 70 {"interface" , read_str , OFS(interface ), "eth0"},
69 /* Avoid "max_leases value not sane" warning by setting default 71 /* Avoid "max_leases value not sane" warning by setting default
70 * to default_end_ip - default_start_ip + 1: */ 72 * to default_end_ip - default_start_ip + 1: */
71 {"max_leases" , read_u32 , &server_config.max_leases , "235"}, 73 {"max_leases" , read_u32 , OFS(max_leases ), "235"},
72 {"auto_time" , read_u32 , &server_config.auto_time , "7200"}, 74 {"auto_time" , read_u32 , OFS(auto_time ), "7200"},
73 {"decline_time" , read_u32 , &server_config.decline_time , "3600"}, 75 {"decline_time" , read_u32 , OFS(decline_time ), "3600"},
74 {"conflict_time", read_u32 , &server_config.conflict_time, "3600"}, 76 {"conflict_time", read_u32 , OFS(conflict_time), "3600"},
75 {"offer_time" , read_u32 , &server_config.offer_time , "60"}, 77 {"offer_time" , read_u32 , OFS(offer_time ), "60"},
76 {"min_lease" , read_u32 , &server_config.min_lease_sec, "60"}, 78 {"min_lease" , read_u32 , OFS(min_lease_sec), "60"},
77 {"lease_file" , read_str , &server_config.lease_file , LEASES_FILE}, 79 {"lease_file" , read_str , OFS(lease_file ), LEASES_FILE},
78 {"pidfile" , read_str , &server_config.pidfile , "/var/run/udhcpd.pid"}, 80 {"pidfile" , read_str , OFS(pidfile ), "/var/run/udhcpd.pid"},
79 {"siaddr" , udhcp_str2nip , &server_config.siaddr_nip , "0.0.0.0"}, 81 {"siaddr" , udhcp_str2nip , OFS(siaddr_nip ), "0.0.0.0"},
80 /* keywords with no defaults must be last! */ 82 /* keywords with no defaults must be last! */
81 {"option" , udhcp_str2optset, &server_config.options , ""}, 83 {"option" , udhcp_str2optset, OFS(options ), ""},
82 {"opt" , udhcp_str2optset, &server_config.options , ""}, 84 {"opt" , udhcp_str2optset, OFS(options ), ""},
83 {"notify_file" , read_str , &server_config.notify_file , NULL}, 85 {"notify_file" , read_str , OFS(notify_file ), NULL},
84 {"sname" , read_str , &server_config.sname , NULL}, 86 {"sname" , read_str , OFS(sname ), NULL},
85 {"boot_file" , read_str , &server_config.boot_file , NULL}, 87 {"boot_file" , read_str , OFS(boot_file ), NULL},
86 {"static_lease" , read_staticlease, &server_config.static_leases, ""}, 88 {"static_lease" , read_staticlease, OFS(static_leases), ""},
87}; 89};
88enum { KWS_WITH_DEFAULTS = ARRAY_SIZE(keywords) - 6 }; 90enum { KWS_WITH_DEFAULTS = ARRAY_SIZE(keywords) - 6 };
89 91
@@ -95,17 +97,17 @@ void FAST_FUNC read_config(const char *file)
95 char *token[2]; 97 char *token[2];
96 98
97 for (i = 0; i < KWS_WITH_DEFAULTS; i++) 99 for (i = 0; i < KWS_WITH_DEFAULTS; i++)
98 keywords[i].handler(keywords[i].def, keywords[i].var); 100 keywords[i].handler(keywords[i].def, (char*)&server_config + keywords[i].ofs);
99 101
100 parser = config_open(file); 102 parser = config_open(file);
101 while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) { 103 while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) {
102 for (k = keywords, i = 0; i < ARRAY_SIZE(keywords); k++, i++) { 104 for (k = keywords, i = 0; i < ARRAY_SIZE(keywords); k++, i++) {
103 if (strcasecmp(token[0], k->keyword) == 0) { 105 if (strcasecmp(token[0], k->keyword) == 0) {
104 if (!k->handler(token[1], k->var)) { 106 if (!k->handler(token[1], (char*)&server_config + k->ofs)) {
105 bb_error_msg("can't parse line %u in %s", 107 bb_error_msg("can't parse line %u in %s",
106 parser->lineno, file); 108 parser->lineno, file);
107 /* reset back to the default value */ 109 /* reset back to the default value */
108 k->handler(k->def, k->var); 110 k->handler(k->def, (char*)&server_config + k->ofs);
109 } 111 }
110 break; 112 break;
111 } 113 }
diff --git a/networking/wget.c b/networking/wget.c
index 87d3bbd13..c725edb5b 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -146,10 +146,10 @@ struct host_info {
146 char *host; 146 char *host;
147 int port; 147 int port;
148}; 148};
149static const char P_FTP[] = "ftp"; 149static const char P_FTP[] ALIGN1 = "ftp";
150static const char P_HTTP[] = "http"; 150static const char P_HTTP[] ALIGN1 = "http";
151#if ENABLE_FEATURE_WGET_OPENSSL || ENABLE_FEATURE_WGET_SSL_HELPER 151#if ENABLE_FEATURE_WGET_OPENSSL || ENABLE_FEATURE_WGET_SSL_HELPER
152static const char P_HTTPS[] = "https"; 152static const char P_HTTPS[] ALIGN1 = "https";
153#endif 153#endif
154 154
155#if ENABLE_FEATURE_WGET_LONG_OPTIONS 155#if ENABLE_FEATURE_WGET_LONG_OPTIONS
diff --git a/networking/zcip.c b/networking/zcip.c
index c93082619..47f3216a0 100644
--- a/networking/zcip.c
+++ b/networking/zcip.c
@@ -40,6 +40,7 @@
40//usage: "\nexits only on I/O errors (link down etc)" 40//usage: "\nexits only on I/O errors (link down etc)"
41 41
42#include "libbb.h" 42#include "libbb.h"
43#include "common_bufsiz.h"
43#include <netinet/ether.h> 44#include <netinet/ether.h>
44#include <net/if.h> 45#include <net/if.h>
45#include <net/if_arp.h> 46#include <net/if_arp.h>
@@ -90,8 +91,8 @@ struct globals {
90 struct ether_addr our_ethaddr; 91 struct ether_addr our_ethaddr;
91 uint32_t localnet_ip; 92 uint32_t localnet_ip;
92} FIX_ALIASING; 93} FIX_ALIASING;
93#define G (*(struct globals*)&bb_common_bufsiz1) 94#define G (*(struct globals*)bb_common_bufsiz1)
94#define INIT_G() do { } while (0) 95#define INIT_G() do { setup_common_bufsiz(); } while (0)
95 96
96 97
97/** 98/**
diff --git a/procps/free.c b/procps/free.c
index 0d023f740..fca9a2242 100644
--- a/procps/free.c
+++ b/procps/free.c
@@ -22,6 +22,7 @@
22//usage: "Total: 386144 257128 129016\n" 22//usage: "Total: 386144 257128 129016\n"
23 23
24#include "libbb.h" 24#include "libbb.h"
25#include "common_bufsiz.h"
25#ifdef __linux__ 26#ifdef __linux__
26# include <sys/sysinfo.h> 27# include <sys/sysinfo.h>
27#endif 28#endif
@@ -35,8 +36,8 @@ struct globals {
35# define G_unit_steps 10 36# define G_unit_steps 10
36#endif 37#endif
37} FIX_ALIASING; 38} FIX_ALIASING;
38#define G (*(struct globals*)&bb_common_bufsiz1) 39#define G (*(struct globals*)bb_common_bufsiz1)
39#define INIT_G() do { } while (0) 40#define INIT_G() do { setup_common_bufsiz(); } while (0)
40 41
41 42
42static unsigned long long scale(unsigned long d) 43static unsigned long long scale(unsigned long d)
diff --git a/procps/fuser.c b/procps/fuser.c
index 05b52abb1..6dac852ed 100644
--- a/procps/fuser.c
+++ b/procps/fuser.c
@@ -18,6 +18,7 @@
18//usage: "\n -SIGNAL Signal to send (default: KILL)" 18//usage: "\n -SIGNAL Signal to send (default: KILL)"
19 19
20#include "libbb.h" 20#include "libbb.h"
21#include "common_bufsiz.h"
21 22
22#define MAX_LINE 255 23#define MAX_LINE 255
23 24
@@ -43,8 +44,9 @@ struct globals {
43 smallint kill_failed; 44 smallint kill_failed;
44 int killsig; 45 int killsig;
45} FIX_ALIASING; 46} FIX_ALIASING;
46#define G (*(struct globals*)&bb_common_bufsiz1) 47#define G (*(struct globals*)bb_common_bufsiz1)
47#define INIT_G() do { \ 48#define INIT_G() do { \
49 setup_common_bufsiz(); \
48 G.mypid = getpid(); \ 50 G.mypid = getpid(); \
49 G.killsig = SIGKILL; \ 51 G.killsig = SIGKILL; \
50} while (0) 52} while (0)
diff --git a/procps/nmeter.c b/procps/nmeter.c
index 33de3790f..3eac2d3b2 100644
--- a/procps/nmeter.c
+++ b/procps/nmeter.c
@@ -53,6 +53,7 @@
53// totalswap=134209536, freeswap=134209536, procs=157}) 53// totalswap=134209536, freeswap=134209536, procs=157})
54 54
55#include "libbb.h" 55#include "libbb.h"
56#include "common_bufsiz.h"
56 57
57typedef unsigned long long ullong; 58typedef unsigned long long ullong;
58 59
@@ -108,16 +109,15 @@ struct globals {
108#define proc_meminfo (G.proc_meminfo ) 109#define proc_meminfo (G.proc_meminfo )
109#define proc_diskstats (G.proc_diskstats ) 110#define proc_diskstats (G.proc_diskstats )
110#define proc_sys_fs_filenr (G.proc_sys_fs_filenr) 111#define proc_sys_fs_filenr (G.proc_sys_fs_filenr)
112#define outbuf bb_common_bufsiz1
111#define INIT_G() do { \ 113#define INIT_G() do { \
114 setup_common_bufsiz(); \
112 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \ 115 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
113 cur_outbuf = outbuf; \ 116 cur_outbuf = outbuf; \
114 G.final_char = '\n'; \ 117 G.final_char = '\n'; \
115 G.deltanz = G.delta = 1000000; \ 118 G.deltanz = G.delta = 1000000; \
116} while (0) 119} while (0)
117 120
118// We depend on this being a char[], not char* - we take sizeof() of it
119#define outbuf bb_common_bufsiz1
120
121static inline void reset_outbuf(void) 121static inline void reset_outbuf(void)
122{ 122{
123 cur_outbuf = outbuf; 123 cur_outbuf = outbuf;
@@ -140,7 +140,7 @@ static void print_outbuf(void)
140static void put(const char *s) 140static void put(const char *s)
141{ 141{
142 char *p = cur_outbuf; 142 char *p = cur_outbuf;
143 int sz = outbuf + sizeof(outbuf) - p; 143 int sz = outbuf + COMMON_BUFSIZE - p;
144 while (*s && --sz >= 0) 144 while (*s && --sz >= 0)
145 *p++ = *s++; 145 *p++ = *s++;
146 cur_outbuf = p; 146 cur_outbuf = p;
@@ -148,7 +148,7 @@ static void put(const char *s)
148 148
149static void put_c(char c) 149static void put_c(char c)
150{ 150{
151 if (cur_outbuf < outbuf + sizeof(outbuf)) 151 if (cur_outbuf < outbuf + COMMON_BUFSIZE)
152 *cur_outbuf++ = c; 152 *cur_outbuf++ = c;
153} 153}
154 154
diff --git a/procps/ps.c b/procps/ps.c
index 8c373376d..39cccec82 100644
--- a/procps/ps.c
+++ b/procps/ps.c
@@ -62,6 +62,7 @@
62//usage: " 2990 andersen andersen R ps\n" 62//usage: " 2990 andersen andersen R ps\n"
63 63
64#include "libbb.h" 64#include "libbb.h"
65#include "common_bufsiz.h"
65#ifdef __linux__ 66#ifdef __linux__
66# include <sys/sysinfo.h> 67# include <sys/sysinfo.h>
67#endif 68#endif
@@ -144,7 +145,7 @@ struct globals {
144 unsigned long seconds_since_boot; 145 unsigned long seconds_since_boot;
145#endif 146#endif
146} FIX_ALIASING; 147} FIX_ALIASING;
147#define G (*(struct globals*)&bb_common_bufsiz1) 148#define G (*(struct globals*)bb_common_bufsiz1)
148#define out (G.out ) 149#define out (G.out )
149#define out_cnt (G.out_cnt ) 150#define out_cnt (G.out_cnt )
150#define print_header (G.print_header ) 151#define print_header (G.print_header )
@@ -152,7 +153,7 @@ struct globals {
152#define buffer (G.buffer ) 153#define buffer (G.buffer )
153#define terminal_width (G.terminal_width ) 154#define terminal_width (G.terminal_width )
154#define kernel_HZ (G.kernel_HZ ) 155#define kernel_HZ (G.kernel_HZ )
155#define INIT_G() do { } while (0) 156#define INIT_G() do { setup_common_bufsiz(); } while (0)
156 157
157#if ENABLE_FEATURE_PS_TIME 158#if ENABLE_FEATURE_PS_TIME
158/* for ELF executables, notes are pushed before environment and args */ 159/* for ELF executables, notes are pushed before environment and args */
diff --git a/procps/top.c b/procps/top.c
index ddf794d7d..73cd285f0 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -105,6 +105,7 @@
105//config: Enable 's' in top (gives lots of memory info). 105//config: Enable 's' in top (gives lots of memory info).
106 106
107#include "libbb.h" 107#include "libbb.h"
108#include "common_bufsiz.h"
108 109
109 110
110typedef struct top_status_t { 111typedef struct top_status_t {
@@ -183,7 +184,7 @@ struct globals {
183 char line_buf[80]; 184 char line_buf[80];
184}; //FIX_ALIASING; - large code growth 185}; //FIX_ALIASING; - large code growth
185enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) }; 186enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) };
186#define G (*(struct globals*)&bb_common_bufsiz1) 187#define G (*(struct globals*)bb_common_bufsiz1)
187#define top (G.top ) 188#define top (G.top )
188#define ntop (G.ntop ) 189#define ntop (G.ntop )
189#define sort_field (G.sort_field ) 190#define sort_field (G.sort_field )
@@ -201,6 +202,7 @@ enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) };
201#define total_pcpu (G.total_pcpu ) 202#define total_pcpu (G.total_pcpu )
202#define line_buf (G.line_buf ) 203#define line_buf (G.line_buf )
203#define INIT_G() do { \ 204#define INIT_G() do { \
205 setup_common_bufsiz(); \
204 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \ 206 BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
205 BUILD_BUG_ON(LINE_BUF_SIZE <= 80); \ 207 BUILD_BUG_ON(LINE_BUF_SIZE <= 80); \
206} while (0) 208} while (0)
@@ -263,9 +265,9 @@ static int mult_lvl_cmp(void* a, void* b)
263static NOINLINE int read_cpu_jiffy(FILE *fp, jiffy_counts_t *p_jif) 265static NOINLINE int read_cpu_jiffy(FILE *fp, jiffy_counts_t *p_jif)
264{ 266{
265#if !ENABLE_FEATURE_TOP_SMP_CPU 267#if !ENABLE_FEATURE_TOP_SMP_CPU
266 static const char fmt[] = "cpu %llu %llu %llu %llu %llu %llu %llu %llu"; 268 static const char fmt[] ALIGN1 = "cpu %llu %llu %llu %llu %llu %llu %llu %llu";
267#else 269#else
268 static const char fmt[] = "cp%*s %llu %llu %llu %llu %llu %llu %llu %llu"; 270 static const char fmt[] ALIGN1 = "cp%*s %llu %llu %llu %llu %llu %llu %llu %llu";
269#endif 271#endif
270 int ret; 272 int ret;
271 273
@@ -517,7 +519,7 @@ enum {
517 519
518static void parse_meminfo(unsigned long meminfo[MI_MAX]) 520static void parse_meminfo(unsigned long meminfo[MI_MAX])
519{ 521{
520 static const char fields[] = 522 static const char fields[] ALIGN1 =
521 "MemTotal\0" 523 "MemTotal\0"
522 "MemFree\0" 524 "MemFree\0"
523 "MemShared\0" 525 "MemShared\0"
diff --git a/runit/runsv.c b/runit/runsv.c
index 4b18d12d5..e0e31508a 100644
--- a/runit/runsv.c
+++ b/runit/runsv.c
@@ -45,6 +45,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 45
46#include <sys/file.h> 46#include <sys/file.h>
47#include "libbb.h" 47#include "libbb.h"
48#include "common_bufsiz.h"
48#include "runit_lib.h" 49#include "runit_lib.h"
49 50
50#if ENABLE_MONOTONIC_SYSCALL 51#if ENABLE_MONOTONIC_SYSCALL
@@ -105,7 +106,7 @@ struct globals {
105 char *dir; 106 char *dir;
106 struct svdir svd[2]; 107 struct svdir svd[2];
107} FIX_ALIASING; 108} FIX_ALIASING;
108#define G (*(struct globals*)&bb_common_bufsiz1) 109#define G (*(struct globals*)bb_common_bufsiz1)
109#define haslog (G.haslog ) 110#define haslog (G.haslog )
110#define sigterm (G.sigterm ) 111#define sigterm (G.sigterm )
111#define pidchanged (G.pidchanged ) 112#define pidchanged (G.pidchanged )
@@ -114,6 +115,7 @@ struct globals {
114#define dir (G.dir ) 115#define dir (G.dir )
115#define svd (G.svd ) 116#define svd (G.svd )
116#define INIT_G() do { \ 117#define INIT_G() do { \
118 setup_common_bufsiz(); \
117 pidchanged = 1; \ 119 pidchanged = 1; \
118} while (0) 120} while (0)
119 121
diff --git a/runit/runsvdir.c b/runit/runsvdir.c
index b3d9e7390..2b7927542 100644
--- a/runit/runsvdir.c
+++ b/runit/runsvdir.c
@@ -57,6 +57,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57 57
58#include <sys/file.h> 58#include <sys/file.h>
59#include "libbb.h" 59#include "libbb.h"
60#include "common_bufsiz.h"
60#include "runit_lib.h" 61#include "runit_lib.h"
61 62
62#define MAXSERVICES 1000 63#define MAXSERVICES 1000
@@ -84,7 +85,7 @@ struct globals {
84 unsigned stamplog; 85 unsigned stamplog;
85#endif 86#endif
86} FIX_ALIASING; 87} FIX_ALIASING;
87#define G (*(struct globals*)&bb_common_bufsiz1) 88#define G (*(struct globals*)bb_common_bufsiz1)
88#define sv (G.sv ) 89#define sv (G.sv )
89#define svdir (G.svdir ) 90#define svdir (G.svdir )
90#define svnum (G.svnum ) 91#define svnum (G.svnum )
@@ -92,7 +93,7 @@ struct globals {
92#define logpipe (G.logpipe ) 93#define logpipe (G.logpipe )
93#define pfd (G.pfd ) 94#define pfd (G.pfd )
94#define stamplog (G.stamplog ) 95#define stamplog (G.stamplog )
95#define INIT_G() do { } while (0) 96#define INIT_G() do { setup_common_bufsiz(); } while (0)
96 97
97static void fatal2_cannot(const char *m1, const char *m2) 98static void fatal2_cannot(const char *m1, const char *m2)
98{ 99{
diff --git a/runit/sv.c b/runit/sv.c
index de8a0d8a4..2a256a6b4 100644
--- a/runit/sv.c
+++ b/runit/sv.c
@@ -189,6 +189,7 @@ Exit Codes
189 189
190#include <sys/file.h> 190#include <sys/file.h>
191#include "libbb.h" 191#include "libbb.h"
192#include "common_bufsiz.h"
192#include "runit_lib.h" 193#include "runit_lib.h"
193 194
194struct globals { 195struct globals {
@@ -199,14 +200,14 @@ struct globals {
199 uint64_t tstart, tnow; 200 uint64_t tstart, tnow;
200 svstatus_t svstatus; 201 svstatus_t svstatus;
201} FIX_ALIASING; 202} FIX_ALIASING;
202#define G (*(struct globals*)&bb_common_bufsiz1) 203#define G (*(struct globals*)bb_common_bufsiz1)
203#define acts (G.acts ) 204#define acts (G.acts )
204#define service (G.service ) 205#define service (G.service )
205#define rc (G.rc ) 206#define rc (G.rc )
206#define tstart (G.tstart ) 207#define tstart (G.tstart )
207#define tnow (G.tnow ) 208#define tnow (G.tnow )
208#define svstatus (G.svstatus ) 209#define svstatus (G.svstatus )
209#define INIT_G() do { } while (0) 210#define INIT_G() do { setup_common_bufsiz(); } while (0)
210 211
211 212
212#define str_equal(s,t) (!strcmp((s), (t))) 213#define str_equal(s,t) (!strcmp((s), (t)))
diff --git a/runit/svlogd.c b/runit/svlogd.c
index dbe8df65c..7cae81cb2 100644
--- a/runit/svlogd.c
+++ b/runit/svlogd.c
@@ -155,6 +155,7 @@ log message, you can use a pattern like this instead
155 155
156#include <sys/file.h> 156#include <sys/file.h>
157#include "libbb.h" 157#include "libbb.h"
158#include "common_bufsiz.h"
158#include "runit_lib.h" 159#include "runit_lib.h"
159 160
160#define LESS(a,b) ((int)((unsigned)(b) - (unsigned)(a)) > 0) 161#define LESS(a,b) ((int)((unsigned)(b) - (unsigned)(a)) > 0)
@@ -233,7 +234,9 @@ struct globals {
233#define blocked_sigset (G.blocked_sigset) 234#define blocked_sigset (G.blocked_sigset)
234#define fl_flag_0 (G.fl_flag_0 ) 235#define fl_flag_0 (G.fl_flag_0 )
235#define dirn (G.dirn ) 236#define dirn (G.dirn )
237#define line bb_common_bufsiz1
236#define INIT_G() do { \ 238#define INIT_G() do { \
239 setup_common_bufsiz(); \
237 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \ 240 SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
238 linemax = 1000; \ 241 linemax = 1000; \
239 /*buflen = 1024;*/ \ 242 /*buflen = 1024;*/ \
@@ -241,8 +244,6 @@ struct globals {
241 replace = ""; \ 244 replace = ""; \
242} while (0) 245} while (0)
243 246
244#define line bb_common_bufsiz1
245
246 247
247#define FATAL "fatal: " 248#define FATAL "fatal: "
248#define WARNING "warning: " 249#define WARNING "warning: "
@@ -1045,9 +1046,9 @@ int svlogd_main(int argc, char **argv)
1045 } 1046 }
1046 if (opt & 2) if (!repl) repl = '_'; // -R 1047 if (opt & 2) if (!repl) repl = '_'; // -R
1047 if (opt & 4) { // -l 1048 if (opt & 4) { // -l
1048 linemax = xatou_range(l, 0, BUFSIZ-26); 1049 linemax = xatou_range(l, 0, COMMON_BUFSIZE-26);
1049 if (linemax == 0) 1050 if (linemax == 0)
1050 linemax = BUFSIZ-26; 1051 linemax = COMMON_BUFSIZE-26;
1051 if (linemax < 256) 1052 if (linemax < 256)
1052 linemax = 256; 1053 linemax = 256;
1053 } 1054 }
diff --git a/scripts/generate_BUFSIZ.sh b/scripts/generate_BUFSIZ.sh
new file mode 100755
index 000000000..844261906
--- /dev/null
+++ b/scripts/generate_BUFSIZ.sh
@@ -0,0 +1,181 @@
1#!/bin/sh
2# Called from top-level directory a-la
3#
4# scripts/generate_BUFSIZ.sh include/common_bufsiz.h
5
6. ./.config || exit 1
7
8debug=false
9#debug=true
10
11postcompile=false
12test x"$1" = x"--post" && { postcompile=true; shift; }
13
14common_bufsiz_h=$1
15
16test x"$NM" = x"" && NM="${CONFIG_CROSS_COMPILER_PREFIX}nm"
17test x"$CC" = x"" && CC="${CONFIG_CROSS_COMPILER_PREFIX}gcc"
18
19exitcmd="exit 0"
20
21regenerate() {
22 cat >"$1.$$"
23 test -f "$1" && diff "$1.$$" "$1" >/dev/null && rm "$1.$$" && return
24 mv "$1.$$" "$1"
25}
26
27generate_std_and_exit() {
28 $debug && echo "Configuring: bb_common_bufsiz1[] in bss"
29 {
30 echo "enum { COMMON_BUFSIZE = 1024 };"
31 echo "extern char bb_common_bufsiz1[];"
32 echo "#define setup_common_bufsiz() ((void)0)"
33 } | regenerate "$common_bufsiz_h"
34 echo "std" >"$common_bufsiz_h.method"
35 $exitcmd
36}
37
38generate_big_and_exit() {
39 $debug && echo "Configuring: bb_common_bufsiz1[] in _end[], COMMON_BUFSIZE = $1"
40 {
41 echo "enum { COMMON_BUFSIZE = $1 };"
42 echo "extern char _end[]; /* linker-provided label */"
43 echo "#define bb_common_bufsiz1 _end"
44 echo "#define setup_common_bufsiz() ((void)0)"
45 } | regenerate "$common_bufsiz_h"
46 echo "$2" >"$common_bufsiz_h.method"
47 $exitcmd
48}
49
50generate_1k_and_exit() {
51 generate_big_and_exit 1024 "1k"
52}
53
54
55generate_malloc_and_exit() {
56 $debug && echo "Configuring: bb_common_bufsiz1[] is malloced"
57 {
58 echo "enum { COMMON_BUFSIZE = 1024 };"
59 echo "extern char *const bb_common_bufsiz1;"
60 echo "void setup_common_bufsiz(void);"
61 } | regenerate "$common_bufsiz_h"
62 echo "malloc" >"$common_bufsiz_h.method"
63 $exitcmd
64}
65
66round_down_COMMON_BUFSIZE() {
67 COMMON_BUFSIZE=$(( ($1-32) & 0xfffffe0 ))
68 COMMON_BUFSIZE=$(( COMMON_BUFSIZE < 1024 ? 1024 : COMMON_BUFSIZE ))
69}
70
71# User does not want any funky stuff?
72test x"$CONFIG_FEATURE_USE_BSS_TAIL" = x"y" || generate_std_and_exit
73
74# The script is run two times: before compilation, when it needs to
75# (re)generate $common_bufsiz_h, and directly after successful build,
76# when it needs to assess whether the build is ok to use at all (not buggy),
77# and (re)generate $common_bufsiz_h for a future build.
78
79if $postcompile; then
80 # Postcompile needs to create/delete OK/FAIL files
81
82 test -f busybox_unstripped || exit 1
83 test -f "$common_bufsiz_h.method" || exit 1
84
85 # How the build was done?
86 method=`cat -- "$common_bufsiz_h.method"`
87
88 # Get _end address
89 END=`$NM busybox_unstripped | grep ' . _end$'| cut -d' ' -f1`
90 test x"$END" = x"" && generate_std_and_exit
91 $debug && echo "END:0x$END $((0x$END))"
92 END=$((0x$END))
93
94 # Get PAGE_SIZE
95 {
96 echo "#include <sys/user.h>"
97 echo "#if defined(PAGE_SIZE) && PAGE_SIZE > 0"
98 echo "char page_size[PAGE_SIZE];"
99 echo "#endif"
100 } >page_size_$$.c
101 $CC -c "page_size_$$.c" || exit 1
102 PAGE_SIZE=`$NM --size-sort "page_size_$$.o" | cut -d' ' -f1`
103 rm "page_size_$$.c" "page_size_$$.o"
104 test x"$PAGE_SIZE" = x"" && exit 1
105 $debug && echo "PAGE_SIZE:0x$PAGE_SIZE $((0x$PAGE_SIZE))"
106 PAGE_SIZE=$((0x$PAGE_SIZE))
107 test $PAGE_SIZE -lt 512 && exit 1
108
109 # How much space between _end[] and next page?
110 PAGE_MASK=$((PAGE_SIZE-1))
111 TAIL_SIZE=$(( (-END) & PAGE_MASK ))
112 $debug && echo "TAIL_SIZE:$TAIL_SIZE bytes"
113
114 if test x"$method" = x"1k" || test x"$method" = x"big"; then
115 if test $TAIL_SIZE -lt 1024; then
116 # _end[] has no enough space for bb_common_bufsiz1[]
117 echo "Warning! Space in _end[] is too small ($TAIL_SIZE bytes)!"
118 echo "Rerun make to build a binary which doesn't use it!"
119 rm -- "$common_bufsiz_h.1k.OK" 2>/dev/null
120 { md5sum <.config | cut -d' ' -f1; stat -c "%Y" .config; } >"$common_bufsiz_h.1k.FAIL"
121 rm busybox_unstripped busybox 2>/dev/null
122# Note: here we can do either a "malloc" or "std" build.
123# "malloc" gives a bit bigger code:
124# text bss filename
125# 804355 5385 busybox.std
126# 804618 4361 busybox.malloc
127# but may have a smaller .bss (not guaranteed!). Use "pmap -x" to verify.
128 exitcmd="exit 1"
129 generate_malloc_and_exit
130 else
131 PREV_SIZE=1024
132 test x"$method" = x"big" && PREV_SIZE=`cat -- "$common_bufsiz_h.1k.OK"`
133 round_down_COMMON_BUFSIZE $PREV_SIZE
134 PREV_BUFSIZE=$COMMON_BUFSIZE
135
136 rm -- "$common_bufsiz_h.1k.FAIL" 2>/dev/null
137 echo $TAIL_SIZE >"$common_bufsiz_h.1k.OK"
138 round_down_COMMON_BUFSIZE $TAIL_SIZE
139 # emit message only if COMMON_BUFSIZE is indeed larger
140 test $COMMON_BUFSIZE -gt $PREV_BUFSIZE \
141 && echo "Rerun make to use larger COMMON_BUFSIZE ($COMMON_BUFSIZE)"
142#TODO: test $PREV_BUFSIZE -lt $TAIL_SIZE && PANIC!!!
143#Code size with COMMON_BUFSIZE > 1024 may be bigger than code with COMMON_BUFSIZE = 1024!
144#(currently we just hope "-32 and round down to 32" saves us)
145
146 test $COMMON_BUFSIZE = 1024 && generate_1k_and_exit
147 generate_big_and_exit $COMMON_BUFSIZE "big"
148 fi
149 fi
150fi
151
152# Based on past success/fail of 1k build, decide next build type
153
154if test -f "$common_bufsiz_h.1k.OK"; then
155 # Previous build succeeded fitting 1k into _end[].
156 # Try bigger COMMON_BUFSIZE if possible.
157 TAIL_SIZE=`cat -- "$common_bufsiz_h.1k.OK"`
158 round_down_COMMON_BUFSIZE $TAIL_SIZE
159 test $COMMON_BUFSIZE = 1024 && generate_1k_and_exit
160 generate_big_and_exit $COMMON_BUFSIZE "big"
161fi
162
163if test -f "$common_bufsiz_h.1k.FAIL"; then
164 # Previous build FAILED to fit 1k into _end[].
165 # Was it with same .config?
166 oldcfg=`cat -- "$common_bufsiz_h.1k.FAIL"`
167 curcfg=`md5sum <.config | cut -d' ' -f1; stat -c "%Y" .config`
168 # If yes, then build a "malloced" version
169 if test x"$oldcfg" = x"$curcfg"; then
170 echo "Will not try 1k build, it failed before. Touch .config to override"
171# Note: here we can do either a "malloc" or "std" build.
172 generate_malloc_and_exit
173 fi
174 # else: try 1k version
175 echo "New .config, will try 1k build"
176 rm -- "$common_bufsiz_h.1k.FAIL"
177 generate_1k_and_exit
178fi
179
180# There was no 1k build yet. Try it.
181generate_1k_and_exit
diff --git a/scripts/trylink b/scripts/trylink
index 15435f009..129570a60 100755
--- a/scripts/trylink
+++ b/scripts/trylink
@@ -209,6 +209,16 @@ else
209 # *(.bss SORT_BY_ALIGNMENT(.bss.*) .gnu.linkonce.b.*) 209 # *(.bss SORT_BY_ALIGNMENT(.bss.*) .gnu.linkonce.b.*)
210 # This will eliminate most of the padding (~3kb). 210 # This will eliminate most of the padding (~3kb).
211 # Hmm, "ld --sort-section alignment" should do it too. 211 # Hmm, "ld --sort-section alignment" should do it too.
212 #
213 # There is a ld hack which is meant to decrease disk usage
214 # at the cost of more RAM usage (??!!) in standard ld script:
215 # /* Adjust the address for the data segment. We want to adjust up to
216 # the same address within the page on the next page up. */
217 # . = ALIGN (0x1000) - ((0x1000 - .) & (0x1000 - 1)); . = DATA_SEGMENT_ALIGN (0x1000, 0x1000);
218 # Replace it with:
219 # . = ALIGN (0x1000); . = DATA_SEGMENT_ALIGN (0x1000, 0x1000);
220 # to unconditionally align .data to the next page boundary,
221 # instead of "next page, plus current offset in this page"
212 try $CC $CFLAGS $LDFLAGS \ 222 try $CC $CFLAGS $LDFLAGS \
213 -o $EXE \ 223 -o $EXE \
214 $SORT_COMMON \ 224 $SORT_COMMON \
diff --git a/selinux/setfiles.c b/selinux/setfiles.c
index de99dfe44..51a7e63bd 100644
--- a/selinux/setfiles.c
+++ b/selinux/setfiles.c
@@ -77,9 +77,10 @@ struct globals {
77 int nerr; 77 int nerr;
78 struct edir excludeArray[MAX_EXCLUDES]; 78 struct edir excludeArray[MAX_EXCLUDES];
79} FIX_ALIASING; 79} FIX_ALIASING;
80#define G (*(struct globals*)&bb_common_bufsiz1) 80#define G (*(struct globals*)bb_common_bufsiz1)
81void BUG_setfiles_globals_too_big(void); 81void BUG_setfiles_globals_too_big(void);
82#define INIT_G() do { \ 82#define INIT_G() do { \
83 setup_common_bufsiz(); \
83 if (sizeof(G) > COMMON_BUFSIZE) \ 84 if (sizeof(G) > COMMON_BUFSIZE) \
84 BUG_setfiles_globals_too_big(); \ 85 BUG_setfiles_globals_too_big(); \
85 /* memset(&G, 0, sizeof(G)); - already is */ \ 86 /* memset(&G, 0, sizeof(G)); - already is */ \
diff --git a/shell/ash.c b/shell/ash.c
index 52feff422..5870a23f3 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -2942,7 +2942,7 @@ pwdcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
2942#else 2942#else
2943# define SIT_ITEM(a,b,c,d) (a | (b << 4) | (c << 8)) 2943# define SIT_ITEM(a,b,c,d) (a | (b << 4) | (c << 8))
2944#endif 2944#endif
2945static const uint16_t S_I_T[] = { 2945static const uint16_t S_I_T[] ALIGN2 = {
2946#if ENABLE_ASH_ALIAS 2946#if ENABLE_ASH_ALIAS
2947 SIT_ITEM(CSPCL , CIGN , CIGN , CIGN ), /* 0, PEOA */ 2947 SIT_ITEM(CSPCL , CIGN , CIGN , CIGN ), /* 0, PEOA */
2948#endif 2948#endif
@@ -3044,7 +3044,7 @@ SIT(int c, int syntax)
3044 3044
3045#else /* !USE_SIT_FUNCTION */ 3045#else /* !USE_SIT_FUNCTION */
3046 3046
3047static const uint8_t syntax_index_table[] = { 3047static const uint8_t syntax_index_table[] ALIGN1 = {
3048 /* BASESYNTAX_DQSYNTAX_SQSYNTAX_ARISYNTAX */ 3048 /* BASESYNTAX_DQSYNTAX_SQSYNTAX_ARISYNTAX */
3049 /* 0 */ CWORD_CWORD_CWORD_CWORD, 3049 /* 0 */ CWORD_CWORD_CWORD_CWORD,
3050 /* 1 */ CWORD_CWORD_CWORD_CWORD, 3050 /* 1 */ CWORD_CWORD_CWORD_CWORD,
@@ -8320,7 +8320,7 @@ static char **nodeptr;
8320#define EV_TESTED 02 /* exit status is checked; ignore -e flag */ 8320#define EV_TESTED 02 /* exit status is checked; ignore -e flag */
8321#define EV_BACKCMD 04 /* command executing within back quotes */ 8321#define EV_BACKCMD 04 /* command executing within back quotes */
8322 8322
8323static const uint8_t nodesize[N_NUMBER] = { 8323static const uint8_t nodesize[N_NUMBER] ALIGN1 = {
8324 [NCMD ] = SHELL_ALIGN(sizeof(struct ncmd)), 8324 [NCMD ] = SHELL_ALIGN(sizeof(struct ncmd)),
8325 [NPIPE ] = SHELL_ALIGN(sizeof(struct npipe)), 8325 [NPIPE ] = SHELL_ALIGN(sizeof(struct npipe)),
8326 [NREDIR ] = SHELL_ALIGN(sizeof(struct nredir)), 8326 [NREDIR ] = SHELL_ALIGN(sizeof(struct nredir)),
@@ -11935,7 +11935,7 @@ parsesub: {
11935 || (c != '(' && c != '{' && !is_name(c) && !is_special(c)) 11935 || (c != '(' && c != '{' && !is_name(c) && !is_special(c))
11936 ) { 11936 ) {
11937#if ENABLE_ASH_BASH_COMPAT 11937#if ENABLE_ASH_BASH_COMPAT
11938 if (c == '\'') 11938 if (syntax != DQSYNTAX && c == '\'')
11939 bash_dollar_squote = 1; 11939 bash_dollar_squote = 1;
11940 else 11940 else
11941#endif 11941#endif
@@ -13072,7 +13072,8 @@ helpcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
13072 out1fmt("\n"); 13072 out1fmt("\n");
13073 col = 0; 13073 col = 0;
13074 } 13074 }
13075 a += strlen(a) + 1; 13075 while (*a++ != '\0')
13076 continue;
13076 } 13077 }
13077 } 13078 }
13078# endif 13079# endif
diff --git a/shell/ash_test/ash-heredoc/heredoc4.right b/shell/ash_test/ash-heredoc/heredoc4.right
new file mode 100644
index 000000000..371b092e2
--- /dev/null
+++ b/shell/ash_test/ash-heredoc/heredoc4.right
@@ -0,0 +1 @@
'$'
diff --git a/shell/ash_test/ash-heredoc/heredoc4.tests b/shell/ash_test/ash-heredoc/heredoc4.tests
new file mode 100755
index 000000000..642ddb324
--- /dev/null
+++ b/shell/ash_test/ash-heredoc/heredoc4.tests
@@ -0,0 +1,3 @@
1cat <<EOF
2'$'
3EOF
diff --git a/shell/ash_test/ash-quoting/dollar_squote_bash1.right b/shell/ash_test/ash-quoting/dollar_squote_bash1.right
index 57536b1d9..9f4e25efa 100644
--- a/shell/ash_test/ash-quoting/dollar_squote_bash1.right
+++ b/shell/ash_test/ash-quoting/dollar_squote_bash1.right
@@ -1,4 +1,5 @@
1a b 1a b
2$'a\tb'
2a 3a
3b c 4b c
4def 5def
diff --git a/shell/ash_test/ash-quoting/dollar_squote_bash1.tests b/shell/ash_test/ash-quoting/dollar_squote_bash1.tests
index 93a56cac3..6fc411b93 100755
--- a/shell/ash_test/ash-quoting/dollar_squote_bash1.tests
+++ b/shell/ash_test/ash-quoting/dollar_squote_bash1.tests
@@ -1,4 +1,5 @@
1echo $'a\tb' 1echo $'a\tb'
2echo "$'a\tb'"
2echo $'a\nb' $'c\nd''ef' 3echo $'a\nb' $'c\nd''ef'
3echo $'a\'b' $'c\"d' $'e\\f' 4echo $'a\'b' $'c\"d' $'e\\f'
4echo $'a\63b' $'c\063b' $'e\0633f' 5echo $'a\63b' $'c\063b' $'e\0633f'
diff --git a/shell/shell_common.c b/shell/shell_common.c
index dbd4286bf..c3bff477d 100644
--- a/shell/shell_common.c
+++ b/shell/shell_common.c
@@ -335,7 +335,7 @@ enum {
335}; 335};
336 336
337/* "-": treat args as parameters of option with ASCII code 1 */ 337/* "-": treat args as parameters of option with ASCII code 1 */
338static const char ulimit_opt_string[] = "-HSa" 338static const char ulimit_opt_string[] ALIGN1 = "-HSa"
339#ifdef RLIMIT_FSIZE 339#ifdef RLIMIT_FSIZE
340 "f::" 340 "f::"
341#endif 341#endif
diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c
index 03d65b37f..4db72110d 100644
--- a/sysklogd/klogd.c
+++ b/sysklogd/klogd.c
@@ -58,6 +58,7 @@
58//usage: "\n -n Run in foreground" 58//usage: "\n -n Run in foreground"
59 59
60#include "libbb.h" 60#include "libbb.h"
61#include "common_bufsiz.h"
61#include <syslog.h> 62#include <syslog.h>
62 63
63 64
@@ -147,7 +148,7 @@ static void klogd_close(void)
147 148
148#define log_buffer bb_common_bufsiz1 149#define log_buffer bb_common_bufsiz1
149enum { 150enum {
150 KLOGD_LOGBUF_SIZE = sizeof(log_buffer), 151 KLOGD_LOGBUF_SIZE = COMMON_BUFSIZE,
151 OPT_LEVEL = (1 << 0), 152 OPT_LEVEL = (1 << 0),
152 OPT_FOREGROUND = (1 << 1), 153 OPT_FOREGROUND = (1 << 1),
153}; 154};
@@ -173,6 +174,8 @@ int klogd_main(int argc UNUSED_PARAM, char **argv)
173 int opt; 174 int opt;
174 int used; 175 int used;
175 176
177 setup_common_bufsiz();
178
176 opt = getopt32(argv, "c:n", &opt_c); 179 opt = getopt32(argv, "c:n", &opt_c);
177 if (opt & OPT_LEVEL) { 180 if (opt & OPT_LEVEL) {
178 /* Valid levels are between 1 and 8 */ 181 /* Valid levels are between 1 and 8 */
diff --git a/sysklogd/logger.c b/sysklogd/logger.c
index b3ca85703..f9eafeb25 100644
--- a/sysklogd/logger.c
+++ b/sysklogd/logger.c
@@ -99,6 +99,8 @@ int logger_main(int argc UNUSED_PARAM, char **argv)
99 int opt; 99 int opt;
100 int i = 0; 100 int i = 0;
101 101
102 setup_common_bufsiz();
103
102 /* Fill out the name string early (may be overwritten later) */ 104 /* Fill out the name string early (may be overwritten later) */
103 str_t = uid2uname_utoa(geteuid()); 105 str_t = uid2uname_utoa(geteuid());
104 106
diff --git a/sysklogd/logread.c b/sysklogd/logread.c
index 781a603b2..5b999730a 100644
--- a/sysklogd/logread.c
+++ b/sysklogd/logread.c
@@ -42,6 +42,7 @@
42//usage: "\n -F Same as -f, but dump buffer first" 42//usage: "\n -F Same as -f, but dump buffer first"
43 43
44#include "libbb.h" 44#include "libbb.h"
45#include "common_bufsiz.h"
45#include <sys/ipc.h> 46#include <sys/ipc.h>
46#include <sys/sem.h> 47#include <sys/sem.h>
47#include <sys/shm.h> 48#include <sys/shm.h>
@@ -67,11 +68,12 @@ struct globals {
67 struct sembuf SMrdn[2]; // {1, 0}, {0, +1, SEM_UNDO} 68 struct sembuf SMrdn[2]; // {1, 0}, {0, +1, SEM_UNDO}
68 struct shbuf_ds *shbuf; 69 struct shbuf_ds *shbuf;
69} FIX_ALIASING; 70} FIX_ALIASING;
70#define G (*(struct globals*)&bb_common_bufsiz1) 71#define G (*(struct globals*)bb_common_bufsiz1)
71#define SMrup (G.SMrup) 72#define SMrup (G.SMrup)
72#define SMrdn (G.SMrdn) 73#define SMrdn (G.SMrdn)
73#define shbuf (G.shbuf) 74#define shbuf (G.shbuf)
74#define INIT_G() do { \ 75#define INIT_G() do { \
76 setup_common_bufsiz(); \
75 memcpy(SMrup, init_sem, sizeof(init_sem)); \ 77 memcpy(SMrup, init_sem, sizeof(init_sem)); \
76} while (0) 78} while (0)
77 79
diff --git a/sysklogd/syslogd_and_logger.c b/sysklogd/syslogd_and_logger.c
index 0964f239c..6458a9332 100644
--- a/sysklogd/syslogd_and_logger.c
+++ b/sysklogd/syslogd_and_logger.c
@@ -8,6 +8,7 @@
8 */ 8 */
9 9
10#include "libbb.h" 10#include "libbb.h"
11#include "common_bufsiz.h"
11#define SYSLOG_NAMES 12#define SYSLOG_NAMES
12#define SYSLOG_NAMES_CONST 13#define SYSLOG_NAMES_CONST
13#include <syslog.h> 14#include <syslog.h>
diff --git a/testsuite/sed.tests b/testsuite/sed.tests
index 5d2356b64..a71f8b1f0 100755
--- a/testsuite/sed.tests
+++ b/testsuite/sed.tests
@@ -135,10 +135,12 @@ testing "sed empty file plus cat" "sed -e 's/nohit//' input -" "one\ntwo" \
135 "" "one\ntwo" 135 "" "one\ntwo"
136testing "sed cat plus empty file" "sed -e 's/nohit//' input -" "one\ntwo" \ 136testing "sed cat plus empty file" "sed -e 's/nohit//' input -" "one\ntwo" \
137 "one\ntwo" "" 137 "one\ntwo" ""
138test x"$SKIP_KNOWN_BUGS" = x"" && {
139testing "sed append autoinserts newline" "sed -e '/woot/a woo' -" \ 138testing "sed append autoinserts newline" "sed -e '/woot/a woo' -" \
140 "woot\nwoo\n" "" "woot" 139 "woot\nwoo\n" "" "woot"
141} 140testing "sed append autoinserts newline 2" "sed -e '/oot/a woo' - input" \
141 "woot\nwoo\nboot\nwoo\n" "boot" "woot"
142testing "sed append autoinserts newline 3" "sed -e '/oot/a woo' -i input && cat input" \
143 "boot\nwoo\n" "boot" ""
142testing "sed insert doesn't autoinsert newline" "sed -e '/woot/i woo' -" \ 144testing "sed insert doesn't autoinsert newline" "sed -e '/woot/i woo' -" \
143 "woo\nwoot" "" "woot" 145 "woo\nwoot" "" "woot"
144testing "sed print autoinsert newlines" "sed -e 'p' -" "one\none" "" "one" 146testing "sed print autoinsert newlines" "sed -e 'p' -" "one\none" "" "one"
@@ -275,6 +277,24 @@ testing "sed a cmd ended by double backslash" \
275 | two \\ 277 | two \\
276' 278'
277 279
280testing "sed a cmd understands \\n,\\t,\\r" \
281 "sed '/1/a\\\\t\\rzero\\none\\\\ntwo\\\\\\nthree'" \
282"\
283line1
284\t\rzero
285one\\\\ntwo\\
286three
287" "" "line1\n"
288
289testing "sed i cmd understands \\n,\\t,\\r" \
290 "sed '/1/i\\\\t\\rzero\\none\\\\ntwo\\\\\\nthree'" \
291"\
292\t\rzero
293one\\\\ntwo\\
294three
295line1
296" "" "line1\n"
297
278# first three lines are deleted; 4th line is matched and printed by "2,3" and by "4" ranges 298# first three lines are deleted; 4th line is matched and printed by "2,3" and by "4" ranges
279testing "sed with N skipping lines past ranges on next cmds" \ 299testing "sed with N skipping lines past ranges on next cmds" \
280 "sed -n '1{N;N;d};1p;2,3p;3p;4p'" \ 300 "sed -n '1{N;N;d};1p;2,3p;3p;4p'" \
diff --git a/util-linux/fatattr.c b/util-linux/fatattr.c
index 5d933874a..6dca24a73 100644
--- a/util-linux/fatattr.c
+++ b/util-linux/fatattr.c
@@ -42,7 +42,7 @@
42 * Extra space at the end is a hack to print space separator in file listing. 42 * Extra space at the end is a hack to print space separator in file listing.
43 * Let's hope no one ever passes space as an option char :) 43 * Let's hope no one ever passes space as an option char :)
44 */ 44 */
45static const char bit_to_char[] = "rhsvda67 "; 45static const char bit_to_char[] ALIGN1 = "rhsvda67 ";
46 46
47static inline unsigned long get_flag(char c) 47static inline unsigned long get_flag(char c)
48{ 48{
diff --git a/util-linux/flock.c b/util-linux/flock.c
index 05a747f72..1f7ade7c4 100644
--- a/util-linux/flock.c
+++ b/util-linux/flock.c
@@ -57,7 +57,6 @@ int flock_main(int argc UNUSED_PARAM, char **argv)
57 /* If it is "flock FILE -c PROG", then -c isn't caught by getopt32: 57 /* If it is "flock FILE -c PROG", then -c isn't caught by getopt32:
58 * we use "+" in order to support "flock -opt FILE PROG -with-opts", 58 * we use "+" in order to support "flock -opt FILE PROG -with-opts",
59 * we need to remove -c by hand. 59 * we need to remove -c by hand.
60 * TODO: in upstream, -c 'PROG ARGS' means "run sh -c 'PROG ARGS'"
61 */ 60 */
62 if (argv[0] 61 if (argv[0]
63 && argv[0][0] == '-' 62 && argv[0][0] == '-'
@@ -66,6 +65,9 @@ int flock_main(int argc UNUSED_PARAM, char **argv)
66 ) 65 )
67 ) { 66 ) {
68 argv++; 67 argv++;
68 if (argv[1])
69 bb_error_msg_and_die("-c takes only one argument");
70 opt |= OPT_c;
69 } 71 }
70 72
71 if (OPT_s == LOCK_SH && OPT_x == LOCK_EX && OPT_n == LOCK_NB && OPT_u == LOCK_UN) { 73 if (OPT_s == LOCK_SH && OPT_x == LOCK_EX && OPT_n == LOCK_NB && OPT_u == LOCK_UN) {
@@ -90,8 +92,21 @@ int flock_main(int argc UNUSED_PARAM, char **argv)
90 bb_perror_nomsg_and_die(); 92 bb_perror_nomsg_and_die();
91 } 93 }
92 94
93 if (argv[0]) 95 if (argv[0]) {
94 return spawn_and_wait(argv); 96 int rc;
97 if (opt & OPT_c) {
98 /* -c 'PROG ARGS' means "run sh -c 'PROG ARGS'" */
99 argv -= 2;
100 argv[0] = (char*)get_shell_name();
101 argv[1] = (char*)"-c";
102 /* argv[2] = "PROG ARGS"; */
103 /* argv[3] = NULL; */
104 }
105 rc = spawn_and_wait(argv);
106 if (rc < 0)
107 bb_simple_perror_msg(argv[0]);
108 return rc;
109 }
95 110
96 return EXIT_SUCCESS; 111 return EXIT_SUCCESS;
97} 112}
diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index 37fa56827..37514eb54 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -97,6 +97,7 @@
97//usage: "If /dev/mdev.log file exists, debug log will be appended to it." 97//usage: "If /dev/mdev.log file exists, debug log will be appended to it."
98 98
99#include "libbb.h" 99#include "libbb.h"
100#include "common_bufsiz.h"
100#include "xregex.h" 101#include "xregex.h"
101 102
102/* "mdev -s" scans /sys/class/xxx, looking for directories which have dev 103/* "mdev -s" scans /sys/class/xxx, looking for directories which have dev
@@ -285,8 +286,9 @@ struct globals {
285 struct rule cur_rule; 286 struct rule cur_rule;
286 char timestr[sizeof("HH:MM:SS.123456")]; 287 char timestr[sizeof("HH:MM:SS.123456")];
287} FIX_ALIASING; 288} FIX_ALIASING;
288#define G (*(struct globals*)&bb_common_bufsiz1) 289#define G (*(struct globals*)bb_common_bufsiz1)
289#define INIT_G() do { \ 290#define INIT_G() do { \
291 setup_common_bufsiz(); \
290 IF_NOT_FEATURE_MDEV_CONF(G.cur_rule.maj = -1;) \ 292 IF_NOT_FEATURE_MDEV_CONF(G.cur_rule.maj = -1;) \
291 IF_NOT_FEATURE_MDEV_CONF(G.cur_rule.mode = 0660;) \ 293 IF_NOT_FEATURE_MDEV_CONF(G.cur_rule.mode = 0660;) \
292} while (0) 294} while (0)
diff --git a/util-linux/mkswap.c b/util-linux/mkswap.c
index b5d2c49b6..dcb53f008 100644
--- a/util-linux/mkswap.c
+++ b/util-linux/mkswap.c
@@ -13,6 +13,7 @@
13//usage: "\n -L LBL Label" 13//usage: "\n -L LBL Label"
14 14
15#include "libbb.h" 15#include "libbb.h"
16#include "common_bufsiz.h"
16 17
17#if ENABLE_SELINUX 18#if ENABLE_SELINUX
18static void mkswap_selinux_setcontext(int fd, const char *path) 19static void mkswap_selinux_setcontext(int fd, const char *path)
@@ -75,6 +76,7 @@ struct swap_header_v1 {
75 76
76#define NWORDS 129 77#define NWORDS 129
77#define hdr ((struct swap_header_v1*)bb_common_bufsiz1) 78#define hdr ((struct swap_header_v1*)bb_common_bufsiz1)
79#define INIT_G() do { setup_common_bufsiz(); } while (0)
78 80
79struct BUG_sizes { 81struct BUG_sizes {
80 char swap_header_v1_wrong[sizeof(*hdr) != (NWORDS * 4) ? -1 : 1]; 82 char swap_header_v1_wrong[sizeof(*hdr) != (NWORDS * 4) ? -1 : 1];
@@ -92,6 +94,8 @@ int mkswap_main(int argc UNUSED_PARAM, char **argv)
92 off_t len; 94 off_t len;
93 const char *label = ""; 95 const char *label = "";
94 96
97 INIT_G();
98
95 opt_complementary = "-1"; /* at least one param */ 99 opt_complementary = "-1"; /* at least one param */
96 /* TODO: -p PAGESZ, -U UUID */ 100 /* TODO: -p PAGESZ, -U UUID */
97 getopt32(argv, "L:", &label); 101 getopt32(argv, "L:", &label);
diff --git a/util-linux/more.c b/util-linux/more.c
index 29984df8c..4812f1bc5 100644
--- a/util-linux/more.c
+++ b/util-linux/more.c
@@ -26,6 +26,7 @@
26#include <conio.h> 26#include <conio.h>
27#endif 27#endif
28#include "libbb.h" 28#include "libbb.h"
29#include "common_bufsiz.h"
29 30
30/* Support for FEATURE_USE_TERMIOS */ 31/* Support for FEATURE_USE_TERMIOS */
31 32
@@ -35,10 +36,10 @@ struct globals {
35 struct termios new_settings; 36 struct termios new_settings;
36} FIX_ALIASING; 37} FIX_ALIASING;
37#define G (*(struct globals*)bb_common_bufsiz1) 38#define G (*(struct globals*)bb_common_bufsiz1)
38#define INIT_G() ((void)0)
39#define initial_settings (G.initial_settings) 39#define initial_settings (G.initial_settings)
40#define new_settings (G.new_settings ) 40#define new_settings (G.new_settings )
41#define cin_fileno (G.cin_fileno ) 41#define cin_fileno (G.cin_fileno )
42#define INIT_G() do { setup_common_bufsiz(); } while (0)
42 43
43#define setTermSettings(fd, argp) \ 44#define setTermSettings(fd, argp) \
44do { \ 45do { \
diff --git a/util-linux/mount.c b/util-linux/mount.c
index c428f5827..c76f6ef61 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -223,6 +223,7 @@
223#define BB_MS_INVERTED_VALUE (1u << 31) 223#define BB_MS_INVERTED_VALUE (1u << 31)
224 224
225#include "libbb.h" 225#include "libbb.h"
226#include "common_bufsiz.h"
226#if ENABLE_FEATURE_MOUNT_LABEL 227#if ENABLE_FEATURE_MOUNT_LABEL
227# include "volume_id.h" 228# include "volume_id.h"
228#else 229#else
@@ -376,7 +377,7 @@ static const int32_t mount_options[] = {
376 /* "remount" */ MS_REMOUNT // action flag 377 /* "remount" */ MS_REMOUNT // action flag
377}; 378};
378 379
379static const char mount_option_str[] = 380static const char mount_option_str[] ALIGN1 =
380 IF_FEATURE_MOUNT_LOOP( 381 IF_FEATURE_MOUNT_LOOP(
381 "loop\0" 382 "loop\0"
382 ) 383 )
@@ -447,7 +448,7 @@ struct globals {
447 char getmntent_buf[1]; 448 char getmntent_buf[1];
448} FIX_ALIASING; 449} FIX_ALIASING;
449enum { GETMNTENT_BUFSIZE = COMMON_BUFSIZE - offsetof(struct globals, getmntent_buf) }; 450enum { GETMNTENT_BUFSIZE = COMMON_BUFSIZE - offsetof(struct globals, getmntent_buf) };
450#define G (*(struct globals*)&bb_common_bufsiz1) 451#define G (*(struct globals*)bb_common_bufsiz1)
451#define nfs_mount_version (G.nfs_mount_version) 452#define nfs_mount_version (G.nfs_mount_version)
452#if ENABLE_FEATURE_MOUNT_VERBOSE 453#if ENABLE_FEATURE_MOUNT_VERBOSE
453#define verbose (G.verbose ) 454#define verbose (G.verbose )
@@ -456,7 +457,7 @@ enum { GETMNTENT_BUFSIZE = COMMON_BUFSIZE - offsetof(struct globals, getmntent_b
456#endif 457#endif
457#define fslist (G.fslist ) 458#define fslist (G.fslist )
458#define getmntent_buf (G.getmntent_buf ) 459#define getmntent_buf (G.getmntent_buf )
459#define INIT_G() do { } while (0) 460#define INIT_G() do { setup_common_bufsiz(); } while (0)
460 461
461#if ENABLE_FEATURE_MTAB_SUPPORT 462#if ENABLE_FEATURE_MTAB_SUPPORT
462/* 463/*
@@ -1002,7 +1003,7 @@ enum {
1002# define EDQUOT ENOSPC 1003# define EDQUOT ENOSPC
1003#endif 1004#endif
1004/* Convert each NFSERR_BLAH into EBLAH */ 1005/* Convert each NFSERR_BLAH into EBLAH */
1005static const uint8_t nfs_err_stat[] = { 1006static const uint8_t nfs_err_stat[] ALIGN1 = {
1006 1, 2, 5, 6, 13, 17, 1007 1, 2, 5, 6, 13, 17,
1007 19, 20, 21, 22, 27, 28, 1008 19, 20, 21, 22, 27, 28,
1008 30, 63, 66, 69, 70, 71 1009 30, 63, 66, 69, 70, 71
@@ -1015,7 +1016,7 @@ typedef uint8_t nfs_err_type;
1015#else 1016#else
1016typedef uint16_t nfs_err_type; 1017typedef uint16_t nfs_err_type;
1017#endif 1018#endif
1018static const nfs_err_type nfs_err_errnum[] = { 1019static const nfs_err_type nfs_err_errnum[] ALIGN2 = {
1019 EPERM , ENOENT , EIO , ENXIO , EACCES, EEXIST, 1020 EPERM , ENOENT , EIO , ENXIO , EACCES, EEXIST,
1020 ENODEV, ENOTDIR , EISDIR , EINVAL, EFBIG , ENOSPC, 1021 ENODEV, ENOTDIR , EISDIR , EINVAL, EFBIG , ENOSPC,
1021 EROFS , ENAMETOOLONG, ENOTEMPTY, EDQUOT, ESTALE, EREMOTE 1022 EROFS , ENAMETOOLONG, ENOTEMPTY, EDQUOT, ESTALE, EREMOTE
diff --git a/util-linux/nsenter.c b/util-linux/nsenter.c
index b08b3dae7..6834292da 100644
--- a/util-linux/nsenter.c
+++ b/util-linux/nsenter.c
@@ -128,7 +128,7 @@ static const struct namespace_descr ns_list[] = {
128/* 128/*
129 * Upstream nsenter doesn't support the short option for --preserve-credentials 129 * Upstream nsenter doesn't support the short option for --preserve-credentials
130 */ 130 */
131static const char opt_str[] = "U::i::u::n::p::m::""t+S+G+r::w::F"; 131static const char opt_str[] ALIGN1 = "U::i::u::n::p::m::""t+S+G+r::w::F";
132 132
133#if ENABLE_FEATURE_NSENTER_LONG_OPTS 133#if ENABLE_FEATURE_NSENTER_LONG_OPTS
134static const char nsenter_longopts[] ALIGN1 = 134static const char nsenter_longopts[] ALIGN1 =
diff --git a/util-linux/script.c b/util-linux/script.c
index abcd73bff..86475c1f1 100644
--- a/util-linux/script.c
+++ b/util-linux/script.c
@@ -23,6 +23,7 @@
23//usage: ) 23//usage: )
24 24
25#include "libbb.h" 25#include "libbb.h"
26#include "common_bufsiz.h"
26 27
27int script_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 28int script_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
28int script_main(int argc UNUSED_PARAM, char **argv) 29int script_main(int argc UNUSED_PARAM, char **argv)
@@ -108,11 +109,12 @@ int script_main(int argc UNUSED_PARAM, char **argv)
108 109
109 if (child_pid) { 110 if (child_pid) {
110 /* parent */ 111 /* parent */
111#define buf bb_common_bufsiz1
112 struct pollfd pfd[2]; 112 struct pollfd pfd[2];
113 int outfd, count, loop; 113 int outfd, count, loop;
114 double oldtime = ENABLE_SCRIPTREPLAY ? time(NULL) : 0; 114 double oldtime = ENABLE_SCRIPTREPLAY ? time(NULL) : 0;
115 smallint fd_count = 2; 115 smallint fd_count = 2;
116#define buf bb_common_bufsiz1
117 setup_common_bufsiz();
116 118
117 outfd = xopen(fname, mode); 119 outfd = xopen(fname, mode);
118 pfd[0].fd = pty; 120 pfd[0].fd = pty;
@@ -134,7 +136,7 @@ int script_main(int argc UNUSED_PARAM, char **argv)
134 } 136 }
135 if (pfd[0].revents) { 137 if (pfd[0].revents) {
136 errno = 0; 138 errno = 0;
137 count = safe_read(pty, buf, sizeof(buf)); 139 count = safe_read(pty, buf, COMMON_BUFSIZE);
138 if (count <= 0 && errno != EAGAIN) { 140 if (count <= 0 && errno != EAGAIN) {
139 /* err/eof from pty: exit */ 141 /* err/eof from pty: exit */
140 goto restore; 142 goto restore;
@@ -157,7 +159,7 @@ int script_main(int argc UNUSED_PARAM, char **argv)
157 } 159 }
158 } 160 }
159 if (pfd[1].revents) { 161 if (pfd[1].revents) {
160 count = safe_read(STDIN_FILENO, buf, sizeof(buf)); 162 count = safe_read(STDIN_FILENO, buf, COMMON_BUFSIZE);
161 if (count <= 0) { 163 if (count <= 0) {
162 /* err/eof from stdin: don't read stdin anymore */ 164 /* err/eof from stdin: don't read stdin anymore */
163 pfd[1].revents = 0; 165 pfd[1].revents = 0;
@@ -176,7 +178,7 @@ int script_main(int argc UNUSED_PARAM, char **argv)
176 * (util-linux's script doesn't do this. buggy :) */ 178 * (util-linux's script doesn't do this. buggy :) */
177 loop = 999; 179 loop = 999;
178 /* pty is in O_NONBLOCK mode, we exit as soon as buffer is empty */ 180 /* pty is in O_NONBLOCK mode, we exit as soon as buffer is empty */
179 while (--loop && (count = safe_read(pty, buf, sizeof(buf))) > 0) { 181 while (--loop && (count = safe_read(pty, buf, COMMON_BUFSIZE)) > 0) {
180 full_write(STDOUT_FILENO, buf, count); 182 full_write(STDOUT_FILENO, buf, count);
181 full_write(outfd, buf, count); 183 full_write(outfd, buf, count);
182 } 184 }
diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c
index c29dd3071..6713852e5 100644
--- a/util-linux/swaponoff.c
+++ b/util-linux/swaponoff.c
@@ -28,6 +28,7 @@
28//usage: "\n -a Stop swapping on all swap devices" 28//usage: "\n -a Stop swapping on all swap devices"
29 29
30#include "libbb.h" 30#include "libbb.h"
31#include "common_bufsiz.h"
31#include <mntent.h> 32#include <mntent.h>
32#ifndef __BIONIC__ 33#ifndef __BIONIC__
33# include <sys/swap.h> 34# include <sys/swap.h>
@@ -62,7 +63,7 @@
62struct globals { 63struct globals {
63 int flags; 64 int flags;
64} FIX_ALIASING; 65} FIX_ALIASING;
65#define G (*(struct globals*)&bb_common_bufsiz1) 66#define G (*(struct globals*)bb_common_bufsiz1)
66#define g_flags (G.flags) 67#define g_flags (G.flags)
67#define save_g_flags() int save_g_flags = g_flags 68#define save_g_flags() int save_g_flags = g_flags
68#define restore_g_flags() g_flags = save_g_flags 69#define restore_g_flags() g_flags = save_g_flags
@@ -71,7 +72,7 @@ struct globals {
71#define save_g_flags() ((void)0) 72#define save_g_flags() ((void)0)
72#define restore_g_flags() ((void)0) 73#define restore_g_flags() ((void)0)
73#endif 74#endif
74#define INIT_G() do { } while (0) 75#define INIT_G() do { setup_common_bufsiz(); } while (0)
75 76
76#define do_swapoff (applet_name[5] == 'f') 77#define do_swapoff (applet_name[5] == 'f')
77 78
diff --git a/util-linux/uevent.c b/util-linux/uevent.c
index 514a9e934..b98fe6160 100644
--- a/util-linux/uevent.c
+++ b/util-linux/uevent.c
@@ -25,11 +25,13 @@
25//usage: "\n"" # uevent mdev & mdev -s" 25//usage: "\n"" # uevent mdev & mdev -s"
26 26
27#include "libbb.h" 27#include "libbb.h"
28#include "common_bufsiz.h"
28#include <linux/netlink.h> 29#include <linux/netlink.h>
29 30
30#define BUFFER_SIZE 16*1024 31#define BUFFER_SIZE 16*1024
31 32
32#define env ((char **)&bb_common_bufsiz1) 33#define env ((char **)bb_common_bufsiz1)
34#define INIT_G() do { setup_common_bufsiz(); } while (0)
33enum { 35enum {
34 MAX_ENV = COMMON_BUFSIZE / sizeof(env[0]) - 1, 36 MAX_ENV = COMMON_BUFSIZE / sizeof(env[0]) - 1,
35}; 37};
@@ -45,6 +47,8 @@ int uevent_main(int argc UNUSED_PARAM, char **argv)
45 struct sockaddr_nl sa; 47 struct sockaddr_nl sa;
46 int fd; 48 int fd;
47 49
50 INIT_G();
51
48 argv++; 52 argv++;
49 53
50 // Subscribe for UEVENT kernel messages 54 // Subscribe for UEVENT kernel messages
diff --git a/util-linux/umount.c b/util-linux/umount.c
index 30bef1686..91da69674 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -34,6 +34,7 @@
34# define MNT_DETACH 0x00000002 34# define MNT_DETACH 0x00000002
35#endif 35#endif
36#include "libbb.h" 36#include "libbb.h"
37#include "common_bufsiz.h"
37 38
38#if defined(__dietlibc__) 39#if defined(__dietlibc__)
39// TODO: This does not belong here. 40// TODO: This does not belong here.
@@ -102,7 +103,8 @@ int umount_main(int argc UNUSED_PARAM, char **argv)
102 if (opt & OPT_ALL) 103 if (opt & OPT_ALL)
103 bb_error_msg_and_die("can't open '%s'", bb_path_mtab_file); 104 bb_error_msg_and_die("can't open '%s'", bb_path_mtab_file);
104 } else { 105 } else {
105 while (getmntent_r(fp, &me, bb_common_bufsiz1, sizeof(bb_common_bufsiz1))) { 106 setup_common_bufsiz();
107 while (getmntent_r(fp, &me, bb_common_bufsiz1, COMMON_BUFSIZE)) {
106 /* Match fstype if passed */ 108 /* Match fstype if passed */
107 if (!match_fstype(&me, fstype)) 109 if (!match_fstype(&me, fstype))
108 continue; 110 continue;
diff --git a/util-linux/unshare.c b/util-linux/unshare.c
index d05cfdb6c..fa7086add 100644
--- a/util-linux/unshare.c
+++ b/util-linux/unshare.c
@@ -137,7 +137,7 @@ static const struct namespace_descr ns_list[] = {
137 * we are forced to use "fake" letters for them. 137 * we are forced to use "fake" letters for them.
138 * '+': stop at first non-option. 138 * '+': stop at first non-option.
139 */ 139 */
140static const char opt_str[] = "+muinpU""fr""\xfd::""\xfe:""\xff:"; 140static const char opt_str[] ALIGN1 = "+muinpU""fr""\xfd::""\xfe:""\xff:";
141static const char unshare_longopts[] ALIGN1 = 141static const char unshare_longopts[] ALIGN1 =
142 "mount\0" Optional_argument "\xf0" 142 "mount\0" Optional_argument "\xf0"
143 "uts\0" Optional_argument "\xf1" 143 "uts\0" Optional_argument "\xf1"
diff --git a/util-linux/volume_id/bcache.c b/util-linux/volume_id/bcache.c
index 648e44de5..fd40eb081 100644
--- a/util-linux/volume_id/bcache.c
+++ b/util-linux/volume_id/bcache.c
@@ -24,7 +24,7 @@
24#define SB_LABEL_SIZE 32 24#define SB_LABEL_SIZE 32
25#define SB_JOURNAL_BUCKETS 256U 25#define SB_JOURNAL_BUCKETS 256U
26 26
27static const char bcache_magic[] = { 27static const char bcache_magic[] ALIGN1 = {
28 0xc6, 0x85, 0x73, 0xf6, 0x4e, 0x1a, 0x45, 0xca, 28 0xc6, 0x85, 0x73, 0xf6, 0x4e, 0x1a, 0x45, 0xca,
29 0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81 29 0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81
30}; 30};
diff --git a/util-linux/volume_id/luks.c b/util-linux/volume_id/luks.c
index 42bf87659..21cb26f51 100644
--- a/util-linux/volume_id/luks.c
+++ b/util-linux/volume_id/luks.c
@@ -40,7 +40,7 @@
40#define LUKS_SALTSIZE 32 40#define LUKS_SALTSIZE 32
41#define LUKS_NUMKEYS 8 41#define LUKS_NUMKEYS 8
42 42
43static const uint8_t LUKS_MAGIC[] = { 'L','U','K','S', 0xba, 0xbe }; 43static const uint8_t LUKS_MAGIC[] ALIGN1 = { 'L','U','K','S', 0xba, 0xbe };
44 44
45struct luks_phdr { 45struct luks_phdr {
46 uint8_t magic[LUKS_MAGIC_L]; 46 uint8_t magic[LUKS_MAGIC_L];