accumulated post-1.4.0 fixes
diff --git a/applets/applets.c b/applets/applets.c
index ebd1ff3..a974743 100644
--- a/applets/applets.c
+++ b/applets/applets.c
@@ -320,7 +320,7 @@
}
#else
-#define parse_config_file()
+#define parse_config_file() ((void)0)
#endif /* CONFIG_FEATURE_SUID_CONFIG */
#ifdef CONFIG_FEATURE_SUID
@@ -340,20 +340,26 @@
if (sct) {
mode_t m = sct->m_mode;
- if (sct->m_uid == ruid) /* same uid */
+ if (sct->m_uid == ruid)
+ /* same uid */
m >>= 6;
- else if ((sct->m_gid == rgid) || ingroup(ruid, sct->m_gid)) /* same group / in group */
+ else if ((sct->m_gid == rgid) || ingroup(ruid, sct->m_gid))
+ /* same group / in group */
m >>= 3;
if (!(m & S_IXOTH)) /* is x bit not set ? */
bb_error_msg_and_die("you have no permission to run this applet!");
- if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { /* *both* have to be set for sgid */
- xsetgid(sct->m_gid);
- } else xsetgid(rgid); /* no sgid -> drop */
-
- if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
- else xsetuid(ruid); /* no suid -> drop */
+ if (sct->m_gid != 0) {
+ /* _both_ have to be set for sgid */
+ if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
+ xsetgid(sct->m_gid);
+ } else xsetgid(rgid); /* no sgid -> drop */
+ }
+ if (sct->m_uid != 0) {
+ if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
+ else xsetuid(ruid); /* no suid -> drop */
+ }
} else {
/* default: drop all privileges */
xsetgid(rgid);
diff --git a/archival/tar.c b/archival/tar.c
index 2ba51ad..ca59643 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -23,10 +23,10 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
-#include "busybox.h"
-#include "unarchive.h"
#include <fnmatch.h>
#include <getopt.h>
+#include "busybox.h"
+#include "unarchive.h"
#if ENABLE_FEATURE_TAR_CREATE
@@ -37,6 +37,7 @@
/* POSIX tar Header Block, from POSIX 1003.1-1990 */
#define NAME_SIZE 100
#define NAME_SIZE_STR "100"
+typedef struct TarHeader TarHeader;
struct TarHeader { /* byte offset */
char name[NAME_SIZE]; /* 0-99 */
char mode[8]; /* 100-107 */
@@ -56,7 +57,6 @@
char prefix[155]; /* 345-499 */
char padding[12]; /* 500-512 (pad to exactly the TAR_BLOCK_SIZE) */
};
-typedef struct TarHeader TarHeader;
/*
** writeTarFile(), writeFileToTarball(), and writeTarHeader() are
@@ -73,6 +73,7 @@
};
/* Some info to be carried along when creating a new tarball */
+typedef struct TarBallInfo TarBallInfo;
struct TarBallInfo {
int tarFd; /* Open-for-write file descriptor
for the tarball */
@@ -85,7 +86,6 @@
HardLinkInfo *hlInfoHead; /* Hard Link Tracking Information */
HardLinkInfo *hlInfo; /* Hard Link Info for the current file */
};
-typedef struct TarBallInfo TarBallInfo;
/* A nice enum with all the possible tar file content types */
enum TarFileType {
@@ -348,7 +348,7 @@
return TRUE;
}
-# if ENABLE_FEATURE_TAR_FROM
+#if ENABLE_FEATURE_TAR_FROM
static int exclude_file(const llist_t *excluded_files, const char *file)
{
while (excluded_files) {
@@ -371,12 +371,12 @@
return 0;
}
-# else
+#else
#define exclude_file(excluded_files, file) 0
-# endif
+#endif
static int writeFileToTarball(const char *fileName, struct stat *statbuf,
- void *userData, int depth)
+ void *userData, int depth ATTRIBUTE_UNUSED)
{
struct TarBallInfo *tbInfo = (struct TarBallInfo *) userData;
const char *header_name;
@@ -509,14 +509,14 @@
if (pipe(gzipDataPipe) < 0 || pipe(gzipStatusPipe) < 0)
bb_perror_msg_and_die("pipe");
- signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
+ signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
-# if __GNUC__
+#if defined(__GNUC__) && __GNUC__
/* Avoid vfork clobbering */
(void) &include;
(void) &errorFlag;
(void) &zip_exec;
-# endif
+#endif
gzipPid = vfork();
@@ -600,7 +600,7 @@
int writeTarFile(const int tar_fd, const int verboseFlag,
const unsigned long dereferenceFlag, const llist_t *include,
const llist_t *exclude, const int gzip);
-#endif /* tar_create */
+#endif /* FEATURE_TAR_CREATE */
#if ENABLE_FEATURE_TAR_FROM
static llist_t *append_file_list_to_list(llist_t *list)
@@ -628,7 +628,7 @@
return newlist;
}
#else
-#define append_file_list_to_list(x) 0
+#define append_file_list_to_list(x) 0
#endif
#if ENABLE_FEATURE_TAR_COMPRESS
@@ -653,7 +653,7 @@
return EXIT_FAILURE;
}
#else
-#define get_header_tar_Z 0
+#define get_header_tar_Z NULL
#endif
#ifdef CHECK_FOR_CHILD_EXITCODE
diff --git a/libbb/vdprintf.c b/libbb/vdprintf.c
index ea2a9d4..d16c519 100644
--- a/libbb/vdprintf.c
+++ b/libbb/vdprintf.c
@@ -7,12 +7,8 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
-#include <stdio.h>
-#include <unistd.h>
#include "libbb.h"
-
-
#if defined(__GLIBC__) && __GLIBC__ < 2
int vdprintf(int d, const char *format, va_list ap)
{
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index 4252e76..f6b904f 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -81,13 +81,14 @@
t = (char*) s;
while (m) {
if (!*t) break;
- m--; t++;
+ m--;
+ t++;
}
- n = n - m;
+ n -= m;
t = xmalloc(n + 1);
t[n] = '\0';
- return memcpy(t,s,n);
+ return memcpy(t, s, n);
}
// Die if we can't open a file and return a FILE * to it.
diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c
index 76f52ca..fb67cde 100644
--- a/libbb/xreadlink.c
+++ b/libbb/xreadlink.c
@@ -36,7 +36,7 @@
char *xmalloc_realpath(const char *path)
{
-#ifdef __GLIBC__
+#if defined(__GLIBC__) && !defined(__UCLIBC__)
/* glibc provides a non-standard extension */
return realpath(path, NULL);
#else
diff --git a/networking/libiproute/libnetlink.h b/networking/libiproute/libnetlink.h
index 6dd242d..9a5a9d3 100644
--- a/networking/libiproute/libnetlink.h
+++ b/networking/libiproute/libnetlink.h
@@ -2,6 +2,9 @@
#ifndef __LIBNETLINK_H__
#define __LIBNETLINK_H__ 1
+#include <linux/types.h>
+/* We need linux/types.h because older kernels use __u32 etc
+ * in linux/[rt]netlink.h. 2.6.19 seems to be ok, though */
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
@@ -37,6 +40,4 @@
extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
-
#endif /* __LIBNETLINK_H__ */
-
diff --git a/networking/ping6.c b/networking/ping6.c
index b95e098..c691fa7 100644
--- a/networking/ping6.c
+++ b/networking/ping6.c
@@ -42,6 +42,8 @@
PINGINTERVAL = 1 /* second */
};
+static const char *hostname;
+
static void ping(const char *host);
#ifndef CONFIG_FEATURE_FANCY_PING6
@@ -50,7 +52,7 @@
static void noresp(int ign)
{
- printf("No response from %s\n", h->h_name);
+ printf("No response from %s\n", hostname);
exit(EXIT_FAILURE);
}
@@ -63,6 +65,8 @@
int sockopt;
char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN];
+ hostname = host;
+
pingsock = create_icmp6_socket();
lsa = host_and_af2sockaddr(host, 0, AF_INET6);
@@ -105,7 +109,7 @@
}
if (ENABLE_FEATURE_CLEAN_UP)
close(pingsock);
- printf("%s is alive!\n", h->h_name);
+ printf("%s is alive!\n", hostname);
}
int ping6_main(int argc, char **argv)
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 716e41f..dca488e 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -569,7 +569,7 @@
//if (option_mask32 & OPT_locallog) // -L
#endif
#if ENABLE_FEATURE_IPC_SYSLOG
- if ((option_mask32 & OPT_circularlog) && opt_C) // -C
+ if (opt_C) // -Cn
shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
#endif
@@ -588,7 +588,7 @@
#ifdef BB_NOMMU
vfork_daemon_rexec(0, 1, argc, argv, "-n");
#else
- xdaemon(0, 1);
+ bb_daemonize();
#endif
}
umask(0);