aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-10-20 02:00:49 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-10-20 02:00:49 +0000
commit2edbc2ab85b96fb01a3862db09df12f40d4382cd (patch)
tree0637a680a89fb11a986e59657875adda2546ec18
parentaa7a888e423fc85daa8af0ac3aabe8fc7af86312 (diff)
downloadbusybox-w32-2edbc2ab85b96fb01a3862db09df12f40d4382cd.tar.gz
busybox-w32-2edbc2ab85b96fb01a3862db09df12f40d4382cd.tar.bz2
busybox-w32-2edbc2ab85b96fb01a3862db09df12f40d4382cd.zip
ping: fix breakage from -I fix
passwd: SELinux support by KaiGai Kohei <kaigai@ak.jp.nec.com>
-rw-r--r--include/libbb.h5
-rw-r--r--libbb/selinux_common.c14
-rw-r--r--libbb/update_passwd.c29
-rw-r--r--networking/ping.c4
4 files changed, 50 insertions, 2 deletions
diff --git a/include/libbb.h b/include/libbb.h
index af385e232..71f439fa9 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -44,6 +44,8 @@
44#if ENABLE_SELINUX 44#if ENABLE_SELINUX
45#include <selinux/selinux.h> 45#include <selinux/selinux.h>
46#include <selinux/context.h> 46#include <selinux/context.h>
47#include <selinux/flask.h>
48#include <selinux/av_permissions.h>
47#endif 49#endif
48 50
49#if ENABLE_LOCALE_SUPPORT 51#if ENABLE_LOCALE_SUPPORT
@@ -818,6 +820,9 @@ extern void set_current_security_context(security_context_t sid);
818extern context_t set_security_context_component(security_context_t cur_context, 820extern context_t set_security_context_component(security_context_t cur_context,
819 char *user, char *role, char *type, char *range); 821 char *user, char *role, char *type, char *range);
820extern void setfscreatecon_or_die(security_context_t scontext); 822extern void setfscreatecon_or_die(security_context_t scontext);
823extern void selinux_preserve_fcontext(int fdesc);
824#else
825#define selinux_preserve_fcontext(fdesc) ((void)0)
821#endif 826#endif
822extern void selinux_or_die(void); 827extern void selinux_or_die(void);
823extern int restricted_shell(const char *shell); 828extern int restricted_shell(const char *shell);
diff --git a/libbb/selinux_common.c b/libbb/selinux_common.c
index ff076f6f0..7478cc7b5 100644
--- a/libbb/selinux_common.c
+++ b/libbb/selinux_common.c
@@ -38,3 +38,17 @@ void setfscreatecon_or_die(security_context_t scontext)
38 "file creation context to %s", scontext); 38 "file creation context to %s", scontext);
39 } 39 }
40} 40}
41
42void selinux_preserve_fcontext(int fdesc)
43{
44 security_context_t context;
45
46 if (fgetfilecon(fdesc, &context) < 0) {
47 if (errno == ENODATA || errno == ENOTSUP)
48 return;
49 bb_perror_msg_and_die("fgetfilecon failed");
50 }
51 setfscreatecon_or_die(context);
52 freecon(context);
53}
54
diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c
index 8914b8b45..388adf81f 100644
--- a/libbb/update_passwd.c
+++ b/libbb/update_passwd.c
@@ -11,6 +11,31 @@
11 11
12#include "libbb.h" 12#include "libbb.h"
13 13
14#if ENABLE_SELINUX
15static void check_selinux_update_passwd(const char *username)
16{
17 security_context_t context;
18 char *seuser;
19
20 if (getuid() != (uid_t)0 || is_selinux_enabled() == 0)
21 return; /* No need to check */
22
23 if (getprevcon_raw(&context) < 0)
24 bb_perror_msg_and_die("getprevcon failed");
25 seuser = strtok(context, ":");
26 if (!seuser)
27 bb_error_msg_and_die("invalid context '%s'", context);
28 if (strcmp(seuser, username) != 0) {
29 if (checkPasswdAccess(PASSWD__PASSWD) != 0)
30 bb_error_msg_and_die("SELinux: access denied");
31 }
32 if (ENABLE_FEATURE_CLEAN_UP)
33 freecon(context);
34}
35#else
36#define check_selinux_update_passwd(username) ((void)0)
37#endif
38
14int update_passwd(const char *filename, const char *username, 39int update_passwd(const char *filename, const char *username,
15 const char *new_pw) 40 const char *new_pw)
16{ 41{
@@ -27,6 +52,8 @@ int update_passwd(const char *filename, const char *username,
27 int cnt = 0; 52 int cnt = 0;
28 int ret = -1; /* failure */ 53 int ret = -1; /* failure */
29 54
55 check_selinux_update_passwd(username);
56
30 /* New passwd file, "/etc/passwd+" for now */ 57 /* New passwd file, "/etc/passwd+" for now */
31 fnamesfx = xasprintf("%s+", filename); 58 fnamesfx = xasprintf("%s+", filename);
32 sfx_char = &fnamesfx[strlen(fnamesfx)-1]; 59 sfx_char = &fnamesfx[strlen(fnamesfx)-1];
@@ -38,6 +65,8 @@ int update_passwd(const char *filename, const char *username,
38 goto free_mem; 65 goto free_mem;
39 old_fd = fileno(old_fp); 66 old_fd = fileno(old_fp);
40 67
68 selinux_preserve_fcontext(old_fd);
69
41 /* Try to create "/etc/passwd+". Wait if it exists. */ 70 /* Try to create "/etc/passwd+". Wait if it exists. */
42 i = 30; 71 i = 30;
43 do { 72 do {
diff --git a/networking/ping.c b/networking/ping.c
index bd98a21e6..0de1b33f7 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -540,7 +540,7 @@ static void ping4(len_and_sockaddr *lsa)
540 xbind(pingsock, &source_lsa->sa, source_lsa->len); 540 xbind(pingsock, &source_lsa->sa, source_lsa->len);
541 } 541 }
542 if (opt_I) 542 if (opt_I)
543 setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(opt_I) + 1); 543 setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
544 544
545 /* enable broadcast pings */ 545 /* enable broadcast pings */
546 setsockopt_broadcast(pingsock); 546 setsockopt_broadcast(pingsock);
@@ -589,7 +589,7 @@ static void ping6(len_and_sockaddr *lsa)
589 if (source_lsa) 589 if (source_lsa)
590 xbind(pingsock, &source_lsa->sa, source_lsa->len); 590 xbind(pingsock, &source_lsa->sa, source_lsa->len);
591 if (opt_I) 591 if (opt_I)
592 setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(opt_I) + 1); 592 setsockopt(pingsock, SOL_SOCKET, SO_BINDTODEVICE, opt_I, strlen(opt_I) + 1);
593 593
594#ifdef ICMP6_FILTER 594#ifdef ICMP6_FILTER
595 { 595 {