accumulated post-1.4.0 fixes

This commit is contained in:
Denis Vlasenko 2007-01-24 22:02:01 +00:00
parent 84d2d493b4
commit 218f2f4882
8 changed files with 45 additions and 37 deletions

View File

@ -320,7 +320,7 @@ static void parse_config_file(void)
} }
#else #else
#define parse_config_file() #define parse_config_file() ((void)0)
#endif /* CONFIG_FEATURE_SUID_CONFIG */ #endif /* CONFIG_FEATURE_SUID_CONFIG */
#ifdef CONFIG_FEATURE_SUID #ifdef CONFIG_FEATURE_SUID
@ -340,20 +340,26 @@ static void check_suid(struct BB_applet *applet)
if (sct) { if (sct) {
mode_t m = sct->m_mode; mode_t m = sct->m_mode;
if (sct->m_uid == ruid) /* same uid */ if (sct->m_uid == ruid)
/* same uid */
m >>= 6; 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; m >>= 3;
if (!(m & S_IXOTH)) /* is x bit not set ? */ if (!(m & S_IXOTH)) /* is x bit not set ? */
bb_error_msg_and_die("you have no permission to run this applet!"); 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 */ if (sct->m_gid != 0) {
xsetgid(sct->m_gid); /* _both_ have to be set for sgid */
} else xsetgid(rgid); /* no sgid -> drop */ if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
xsetgid(sct->m_gid);
if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid); } else xsetgid(rgid); /* no sgid -> drop */
else xsetuid(ruid); /* no suid -> drop */ }
if (sct->m_uid != 0) {
if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
else xsetuid(ruid); /* no suid -> drop */
}
} else { } else {
/* default: drop all privileges */ /* default: drop all privileges */
xsetgid(rgid); xsetgid(rgid);

View File

@ -23,10 +23,10 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/ */
#include "busybox.h"
#include "unarchive.h"
#include <fnmatch.h> #include <fnmatch.h>
#include <getopt.h> #include <getopt.h>
#include "busybox.h"
#include "unarchive.h"
#if ENABLE_FEATURE_TAR_CREATE #if ENABLE_FEATURE_TAR_CREATE
@ -37,6 +37,7 @@
/* POSIX tar Header Block, from POSIX 1003.1-1990 */ /* POSIX tar Header Block, from POSIX 1003.1-1990 */
#define NAME_SIZE 100 #define NAME_SIZE 100
#define NAME_SIZE_STR "100" #define NAME_SIZE_STR "100"
typedef struct TarHeader TarHeader;
struct TarHeader { /* byte offset */ struct TarHeader { /* byte offset */
char name[NAME_SIZE]; /* 0-99 */ char name[NAME_SIZE]; /* 0-99 */
char mode[8]; /* 100-107 */ char mode[8]; /* 100-107 */
@ -56,7 +57,6 @@ struct TarHeader { /* byte offset */
char prefix[155]; /* 345-499 */ char prefix[155]; /* 345-499 */
char padding[12]; /* 500-512 (pad to exactly the TAR_BLOCK_SIZE) */ char padding[12]; /* 500-512 (pad to exactly the TAR_BLOCK_SIZE) */
}; };
typedef struct TarHeader TarHeader;
/* /*
** writeTarFile(), writeFileToTarball(), and writeTarHeader() are ** writeTarFile(), writeFileToTarball(), and writeTarHeader() are
@ -73,6 +73,7 @@ struct HardLinkInfo {
}; };
/* Some info to be carried along when creating a new tarball */ /* Some info to be carried along when creating a new tarball */
typedef struct TarBallInfo TarBallInfo;
struct TarBallInfo { struct TarBallInfo {
int tarFd; /* Open-for-write file descriptor int tarFd; /* Open-for-write file descriptor
for the tarball */ for the tarball */
@ -85,7 +86,6 @@ struct TarBallInfo {
HardLinkInfo *hlInfoHead; /* Hard Link Tracking Information */ HardLinkInfo *hlInfoHead; /* Hard Link Tracking Information */
HardLinkInfo *hlInfo; /* Hard Link Info for the current file */ HardLinkInfo *hlInfo; /* Hard Link Info for the current file */
}; };
typedef struct TarBallInfo TarBallInfo;
/* A nice enum with all the possible tar file content types */ /* A nice enum with all the possible tar file content types */
enum TarFileType { enum TarFileType {
@ -348,7 +348,7 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
return TRUE; return TRUE;
} }
# if ENABLE_FEATURE_TAR_FROM #if ENABLE_FEATURE_TAR_FROM
static int exclude_file(const llist_t *excluded_files, const char *file) static int exclude_file(const llist_t *excluded_files, const char *file)
{ {
while (excluded_files) { while (excluded_files) {
@ -371,12 +371,12 @@ static int exclude_file(const llist_t *excluded_files, const char *file)
return 0; return 0;
} }
# else #else
#define exclude_file(excluded_files, file) 0 #define exclude_file(excluded_files, file) 0
# endif #endif
static int writeFileToTarball(const char *fileName, struct stat *statbuf, 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; struct TarBallInfo *tbInfo = (struct TarBallInfo *) userData;
const char *header_name; const char *header_name;
@ -509,14 +509,14 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
if (pipe(gzipDataPipe) < 0 || pipe(gzipStatusPipe) < 0) if (pipe(gzipDataPipe) < 0 || pipe(gzipStatusPipe) < 0)
bb_perror_msg_and_die("pipe"); 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 */ /* Avoid vfork clobbering */
(void) &include; (void) &include;
(void) &errorFlag; (void) &errorFlag;
(void) &zip_exec; (void) &zip_exec;
# endif #endif
gzipPid = vfork(); gzipPid = vfork();
@ -600,7 +600,7 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
int writeTarFile(const int tar_fd, const int verboseFlag, int writeTarFile(const int tar_fd, const int verboseFlag,
const unsigned long dereferenceFlag, const llist_t *include, const unsigned long dereferenceFlag, const llist_t *include,
const llist_t *exclude, const int gzip); const llist_t *exclude, const int gzip);
#endif /* tar_create */ #endif /* FEATURE_TAR_CREATE */
#if ENABLE_FEATURE_TAR_FROM #if ENABLE_FEATURE_TAR_FROM
static llist_t *append_file_list_to_list(llist_t *list) static llist_t *append_file_list_to_list(llist_t *list)
@ -628,7 +628,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
return newlist; return newlist;
} }
#else #else
#define append_file_list_to_list(x) 0 #define append_file_list_to_list(x) 0
#endif #endif
#if ENABLE_FEATURE_TAR_COMPRESS #if ENABLE_FEATURE_TAR_COMPRESS
@ -653,7 +653,7 @@ static char get_header_tar_Z(archive_handle_t *archive_handle)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
#else #else
#define get_header_tar_Z 0 #define get_header_tar_Z NULL
#endif #endif
#ifdef CHECK_FOR_CHILD_EXITCODE #ifdef CHECK_FOR_CHILD_EXITCODE

View File

@ -7,12 +7,8 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/ */
#include <stdio.h>
#include <unistd.h>
#include "libbb.h" #include "libbb.h"
#if defined(__GLIBC__) && __GLIBC__ < 2 #if defined(__GLIBC__) && __GLIBC__ < 2
int vdprintf(int d, const char *format, va_list ap) int vdprintf(int d, const char *format, va_list ap)
{ {

View File

@ -81,13 +81,14 @@ char * xstrndup(const char *s, int n)
t = (char*) s; t = (char*) s;
while (m) { while (m) {
if (!*t) break; if (!*t) break;
m--; t++; m--;
t++;
} }
n = n - m; n -= m;
t = xmalloc(n + 1); t = xmalloc(n + 1);
t[n] = '\0'; 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. // Die if we can't open a file and return a FILE * to it.

View File

@ -36,7 +36,7 @@ char *xreadlink(const char *path)
char *xmalloc_realpath(const char *path) char *xmalloc_realpath(const char *path)
{ {
#ifdef __GLIBC__ #if defined(__GLIBC__) && !defined(__UCLIBC__)
/* glibc provides a non-standard extension */ /* glibc provides a non-standard extension */
return realpath(path, NULL); return realpath(path, NULL);
#else #else

View File

@ -2,6 +2,9 @@
#ifndef __LIBNETLINK_H__ #ifndef __LIBNETLINK_H__
#define __LIBNETLINK_H__ 1 #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/netlink.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
@ -37,6 +40,4 @@ extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, void *data, i
extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
#endif /* __LIBNETLINK_H__ */ #endif /* __LIBNETLINK_H__ */

View File

@ -42,6 +42,8 @@ enum {
PINGINTERVAL = 1 /* second */ PINGINTERVAL = 1 /* second */
}; };
static const char *hostname;
static void ping(const char *host); static void ping(const char *host);
#ifndef CONFIG_FEATURE_FANCY_PING6 #ifndef CONFIG_FEATURE_FANCY_PING6
@ -50,7 +52,7 @@ static void ping(const char *host);
static void noresp(int ign) static void noresp(int ign)
{ {
printf("No response from %s\n", h->h_name); printf("No response from %s\n", hostname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -63,6 +65,8 @@ static void ping(const char *host)
int sockopt; int sockopt;
char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN]; char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN];
hostname = host;
pingsock = create_icmp6_socket(); pingsock = create_icmp6_socket();
lsa = host_and_af2sockaddr(host, 0, AF_INET6); lsa = host_and_af2sockaddr(host, 0, AF_INET6);
@ -105,7 +109,7 @@ static void ping(const char *host)
} }
if (ENABLE_FEATURE_CLEAN_UP) if (ENABLE_FEATURE_CLEAN_UP)
close(pingsock); close(pingsock);
printf("%s is alive!\n", h->h_name); printf("%s is alive!\n", hostname);
} }
int ping6_main(int argc, char **argv) int ping6_main(int argc, char **argv)

View File

@ -569,7 +569,7 @@ int syslogd_main(int argc, char **argv)
//if (option_mask32 & OPT_locallog) // -L //if (option_mask32 & OPT_locallog) // -L
#endif #endif
#if ENABLE_FEATURE_IPC_SYSLOG #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; shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
#endif #endif
@ -588,7 +588,7 @@ int syslogd_main(int argc, char **argv)
#ifdef BB_NOMMU #ifdef BB_NOMMU
vfork_daemon_rexec(0, 1, argc, argv, "-n"); vfork_daemon_rexec(0, 1, argc, argv, "-n");
#else #else
xdaemon(0, 1); bb_daemonize();
#endif #endif
} }
umask(0); umask(0);