Fixes so "make allnoconfig" works again.
The configure system's save function edited out sub-menus that wouldn't be displayed in the current configuration, meaning config.h wouldn't have #udef entries for those symbols, meaning bb_config.h would have the relevant ENABLE_ missing instead of defined to 0. This broke the build. So I fixed it, and then reorganized the applets.c and busybox.c to take away the warnings this revealed (code that would be optimized out was making calls to functions that hadn't been prototyped. So I added an #else case to those #ifdefs to #define the relevant functions to empty macros to placate the warnings. I also reorganized the applets.c code to make adding such an #else case less of a pain (and make the need for prototyping go away by moving the functions up before they were used, and generally wind up with fewer #ifdefs in the code by putting all the logic in one place). This resulted in a huge seeming patch, when most if it just moves code from one place to another without touching it... Upside: make allyesconfig and make allnoconfig should both work now.
This commit is contained in:
parent
a1a1a9fa2c
commit
8a7a678b03
@ -54,10 +54,6 @@ static struct BB_applet *applet_using;
|
|||||||
const size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1);
|
const size_t NUM_APPLETS = (sizeof (applets) / sizeof (struct BB_applet) - 1);
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_SUID
|
|
||||||
|
|
||||||
static void check_suid (struct BB_applet *app);
|
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_SUID_CONFIG
|
#ifdef CONFIG_FEATURE_SUID_CONFIG
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -65,8 +61,6 @@ static void check_suid (struct BB_applet *app);
|
|||||||
#include "pwd_.h"
|
#include "pwd_.h"
|
||||||
#include "grp_.h"
|
#include "grp_.h"
|
||||||
|
|
||||||
static void parse_config_file (void);
|
|
||||||
|
|
||||||
#define CONFIG_FILE "/etc/busybox.conf"
|
#define CONFIG_FILE "/etc/busybox.conf"
|
||||||
|
|
||||||
/* applets [] is const, so we have to define this "override" structure */
|
/* applets [] is const, so we have to define this "override" structure */
|
||||||
@ -79,77 +73,12 @@ struct BB_suid_config
|
|||||||
mode_t m_mode;
|
mode_t m_mode;
|
||||||
|
|
||||||
struct BB_suid_config *m_next;
|
struct BB_suid_config *m_next;
|
||||||
};
|
} static *suid_config;
|
||||||
|
|
||||||
static struct BB_suid_config *suid_config;
|
|
||||||
static int suid_cfg_readable;
|
static int suid_cfg_readable;
|
||||||
|
|
||||||
#endif /* CONFIG_FEATURE_SUID_CONFIG */
|
|
||||||
|
|
||||||
#endif /* CONFIG_FEATURE_SUID */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void bb_show_usage (void)
|
|
||||||
{
|
|
||||||
const char *format_string;
|
|
||||||
const char *usage_string = usage_messages;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = applet_using - applets; i > 0;) {
|
|
||||||
if (!*usage_string++) {
|
|
||||||
--i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
format_string = "%s\n\nUsage: %s %s\n\n";
|
|
||||||
if (*usage_string == '\b')
|
|
||||||
format_string = "%s\n\nNo help available.\n\n";
|
|
||||||
fprintf (stderr, format_string, bb_msg_full_version, applet_using->name,
|
|
||||||
usage_string);
|
|
||||||
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int applet_name_compare (const void *x, const void *y)
|
|
||||||
{
|
|
||||||
const char *name = x;
|
|
||||||
const struct BB_applet *applet = y;
|
|
||||||
|
|
||||||
return strcmp (name, applet->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern const size_t NUM_APPLETS;
|
|
||||||
|
|
||||||
struct BB_applet *find_applet_by_name (const char *name)
|
|
||||||
{
|
|
||||||
return bsearch (name, applets, NUM_APPLETS, sizeof (struct BB_applet),
|
|
||||||
applet_name_compare);
|
|
||||||
}
|
|
||||||
|
|
||||||
void run_applet_by_name (const char *name, int argc, char **argv)
|
|
||||||
{
|
|
||||||
if(ENABLE_FEATURE_SUID_CONFIG) parse_config_file ();
|
|
||||||
|
|
||||||
if(!strncmp(name, "busybox", 7)) busybox_main(argc, argv);
|
|
||||||
/* Do a binary search to find the applet entry given the name. */
|
|
||||||
applet_using = find_applet_by_name(name);
|
|
||||||
if(applet_using) {
|
|
||||||
bb_applet_name = applet_using->name;
|
|
||||||
if(argc==2 && !strcmp(argv[1], "--help")) bb_show_usage ();
|
|
||||||
if(ENABLE_FEATURE_SUID) check_suid (applet_using);
|
|
||||||
exit ((*(applet_using->main)) (argc, argv));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_SUID
|
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_SUID_CONFIG
|
|
||||||
|
|
||||||
/* check if u is member of group g */
|
/* check if u is member of group g */
|
||||||
static int
|
static int ingroup (uid_t u, gid_t g)
|
||||||
ingroup (uid_t u, gid_t g)
|
|
||||||
{
|
{
|
||||||
struct group *grp = getgrgid (g);
|
struct group *grp = getgrgid (g);
|
||||||
|
|
||||||
@ -166,76 +95,6 @@ ingroup (uid_t u, gid_t g)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
check_suid (struct BB_applet *applet)
|
|
||||||
{
|
|
||||||
uid_t ruid = getuid (); /* real [ug]id */
|
|
||||||
uid_t rgid = getgid ();
|
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_SUID_CONFIG
|
|
||||||
if (suid_cfg_readable) {
|
|
||||||
struct BB_suid_config *sct;
|
|
||||||
|
|
||||||
for (sct = suid_config; sct; sct = sct->m_next) {
|
|
||||||
if (sct->m_applet == applet)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (sct) {
|
|
||||||
mode_t m = sct->m_mode;
|
|
||||||
|
|
||||||
if (sct->m_uid == ruid) /* same uid */
|
|
||||||
m >>= 6;
|
|
||||||
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 */
|
|
||||||
if (setegid (sct->m_gid))
|
|
||||||
bb_error_msg_and_die
|
|
||||||
("BusyBox binary has insufficient rights to set proper GID for applet!");
|
|
||||||
} else
|
|
||||||
setgid (rgid); /* no sgid -> drop */
|
|
||||||
|
|
||||||
if (sct->m_mode & S_ISUID) {
|
|
||||||
if (seteuid (sct->m_uid))
|
|
||||||
bb_error_msg_and_die
|
|
||||||
("BusyBox binary has insufficient rights to set proper UID for applet!");
|
|
||||||
} else
|
|
||||||
setuid (ruid); /* no suid -> drop */
|
|
||||||
} else {
|
|
||||||
/* default: drop all priviledges */
|
|
||||||
setgid (rgid);
|
|
||||||
setuid (ruid);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
#ifndef CONFIG_FEATURE_SUID_CONFIG_QUIET
|
|
||||||
static int onetime = 0;
|
|
||||||
|
|
||||||
if (!onetime) {
|
|
||||||
onetime = 1;
|
|
||||||
fprintf (stderr, "Using fallback suid method\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (applet->need_suid == _BB_SUID_ALWAYS) {
|
|
||||||
if (geteuid () != 0)
|
|
||||||
bb_error_msg_and_die ("This applet requires root priviledges!");
|
|
||||||
} else if (applet->need_suid == _BB_SUID_NEVER) {
|
|
||||||
setgid (rgid); /* drop all priviledges */
|
|
||||||
setuid (ruid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_SUID_CONFIG
|
|
||||||
|
|
||||||
/* This should probably be a libbb routine. In that case,
|
/* This should probably be a libbb routine. In that case,
|
||||||
* I'd probably rename it to something like bb_trimmed_slice.
|
* I'd probably rename it to something like bb_trimmed_slice.
|
||||||
*/
|
*/
|
||||||
@ -470,9 +329,134 @@ static void parse_config_file(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define parse_config_file(x)
|
||||||
|
#endif /* CONFIG_FEATURE_SUID_CONFIG */
|
||||||
|
|
||||||
|
#ifdef CONFIG_FEATURE_SUID
|
||||||
|
static void check_suid (struct BB_applet *applet)
|
||||||
|
{
|
||||||
|
uid_t ruid = getuid (); /* real [ug]id */
|
||||||
|
uid_t rgid = getgid ();
|
||||||
|
|
||||||
|
#ifdef CONFIG_FEATURE_SUID_CONFIG
|
||||||
|
if (suid_cfg_readable) {
|
||||||
|
struct BB_suid_config *sct;
|
||||||
|
|
||||||
|
for (sct = suid_config; sct; sct = sct->m_next) {
|
||||||
|
if (sct->m_applet == applet)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sct) {
|
||||||
|
mode_t m = sct->m_mode;
|
||||||
|
|
||||||
|
if (sct->m_uid == ruid) /* same uid */
|
||||||
|
m >>= 6;
|
||||||
|
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 */
|
||||||
|
if (setegid (sct->m_gid))
|
||||||
|
bb_error_msg_and_die
|
||||||
|
("BusyBox binary has insufficient rights to set proper GID for applet!");
|
||||||
|
} else
|
||||||
|
setgid (rgid); /* no sgid -> drop */
|
||||||
|
|
||||||
|
if (sct->m_mode & S_ISUID) {
|
||||||
|
if (seteuid (sct->m_uid))
|
||||||
|
bb_error_msg_and_die
|
||||||
|
("BusyBox binary has insufficient rights to set proper UID for applet!");
|
||||||
|
} else
|
||||||
|
setuid (ruid); /* no suid -> drop */
|
||||||
|
} else {
|
||||||
|
/* default: drop all priviledges */
|
||||||
|
setgid (rgid);
|
||||||
|
setuid (ruid);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
#ifndef CONFIG_FEATURE_SUID_CONFIG_QUIET
|
||||||
|
static int onetime = 0;
|
||||||
|
|
||||||
|
if (!onetime) {
|
||||||
|
onetime = 1;
|
||||||
|
fprintf (stderr, "Using fallback suid method\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
if (applet->need_suid == _BB_SUID_ALWAYS) {
|
||||||
|
if (geteuid () != 0)
|
||||||
|
bb_error_msg_and_die ("This applet requires root priviledges!");
|
||||||
|
} else if (applet->need_suid == _BB_SUID_NEVER) {
|
||||||
|
setgid (rgid); /* drop all priviledges */
|
||||||
|
setuid (ruid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define check_suid(x)
|
||||||
|
#endif /* CONFIG_FEATURE_SUID */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void bb_show_usage (void)
|
||||||
|
{
|
||||||
|
const char *format_string;
|
||||||
|
const char *usage_string = usage_messages;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = applet_using - applets; i > 0;) {
|
||||||
|
if (!*usage_string++) {
|
||||||
|
--i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
format_string = "%s\n\nUsage: %s %s\n\n";
|
||||||
|
if (*usage_string == '\b')
|
||||||
|
format_string = "%s\n\nNo help available.\n\n";
|
||||||
|
fprintf (stderr, format_string, bb_msg_full_version, applet_using->name,
|
||||||
|
usage_string);
|
||||||
|
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int applet_name_compare (const void *x, const void *y)
|
||||||
|
{
|
||||||
|
const char *name = x;
|
||||||
|
const struct BB_applet *applet = y;
|
||||||
|
|
||||||
|
return strcmp (name, applet->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern const size_t NUM_APPLETS;
|
||||||
|
|
||||||
|
struct BB_applet *find_applet_by_name (const char *name)
|
||||||
|
{
|
||||||
|
return bsearch (name, applets, NUM_APPLETS, sizeof (struct BB_applet),
|
||||||
|
applet_name_compare);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run_applet_by_name (const char *name, int argc, char **argv)
|
||||||
|
{
|
||||||
|
if(ENABLE_FEATURE_SUID_CONFIG) parse_config_file ();
|
||||||
|
|
||||||
|
if(!strncmp(name, "busybox", 7)) busybox_main(argc, argv);
|
||||||
|
/* Do a binary search to find the applet entry given the name. */
|
||||||
|
applet_using = find_applet_by_name(name);
|
||||||
|
if(applet_using) {
|
||||||
|
bb_applet_name = applet_using->name;
|
||||||
|
if(argc==2 && !strcmp(argv[1], "--help")) bb_show_usage ();
|
||||||
|
if(ENABLE_FEATURE_SUID) check_suid (applet_using);
|
||||||
|
exit ((*(applet_using->main)) (argc, argv));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* END CODE */
|
/* END CODE */
|
||||||
/*
|
/*
|
||||||
|
@ -5,8 +5,10 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "busybox.h"
|
#include "busybox.h"
|
||||||
#ifdef CONFIG_LOCALE_SUPPORT
|
#if ENABLE_LOCALE_SUPPORT
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#else
|
||||||
|
#define setlocale(x,y)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *bb_applet_name;
|
const char *bb_applet_name;
|
||||||
@ -54,6 +56,8 @@ static void install_links(const char *busybox, int use_symbolic_links)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define install_links(x,y)
|
||||||
#endif /* CONFIG_FEATURE_INSTALLER */
|
#endif /* CONFIG_FEATURE_INSTALLER */
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
@ -322,8 +322,8 @@ int conf_write(const char *name)
|
|||||||
while (menu) {
|
while (menu) {
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
if (!sym) {
|
if (!sym) {
|
||||||
if (!menu_is_visible(menu))
|
//if (!menu_is_visible(menu))
|
||||||
goto next;
|
// goto next;
|
||||||
str = menu_get_prompt(menu);
|
str = menu_get_prompt(menu);
|
||||||
fprintf(out, "\n"
|
fprintf(out, "\n"
|
||||||
"#\n"
|
"#\n"
|
||||||
@ -336,8 +336,8 @@ int conf_write(const char *name)
|
|||||||
" */\n", str);
|
" */\n", str);
|
||||||
} else if (!(sym->flags & SYMBOL_CHOICE)) {
|
} else if (!(sym->flags & SYMBOL_CHOICE)) {
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
if (!(sym->flags & SYMBOL_WRITE))
|
//if (!(sym->flags & SYMBOL_WRITE))
|
||||||
goto next;
|
// goto next;
|
||||||
sym->flags &= ~SYMBOL_WRITE;
|
sym->flags &= ~SYMBOL_WRITE;
|
||||||
type = sym->type;
|
type = sym->type;
|
||||||
if (type == S_TRISTATE) {
|
if (type == S_TRISTATE) {
|
||||||
|
Loading…
Reference in New Issue
Block a user