mirror of
https://github.com/sheumann/hush.git
synced 2024-10-11 10:23:41 +00:00
accumulated post-1.4.0 fixes
This commit is contained in:
parent
84d2d493b4
commit
218f2f4882
@ -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) {
|
||||||
|
/* _both_ have to be set for sgid */
|
||||||
|
if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
|
||||||
xsetgid(sct->m_gid);
|
xsetgid(sct->m_gid);
|
||||||
} else xsetgid(rgid); /* no sgid -> drop */
|
} else xsetgid(rgid); /* no sgid -> drop */
|
||||||
|
}
|
||||||
|
if (sct->m_uid != 0) {
|
||||||
if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
|
if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
|
||||||
else xsetuid(ruid); /* no suid -> drop */
|
else xsetuid(ruid); /* no suid -> drop */
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* default: drop all privileges */
|
/* default: drop all privileges */
|
||||||
xsetgid(rgid);
|
xsetgid(rgid);
|
||||||
|
@ -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;
|
||||||
@ -511,12 +511,12 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
|
|||||||
|
|
||||||
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)
|
||||||
@ -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
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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__ */
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user