[v2,2/2] alfred: Mount debugfs before reducing capabilities

Message ID 1458157872-15879-3-git-send-email-andrew@lunn.ch (mailing list archive)
State Accepted, archived
Commit d08b0e098637e57a26ea8076bbedfeb3aa2aa172
Delegated to: Simon Wunderlich
Headers

Commit Message

Andrew Lunn March 16, 2016, 7:51 p.m. UTC
  The debugfs helper code has the ability to mount the debugfs file
system if it is not already mounted. However, it cannot do this
after the capabilities have been dropped. So perform the mount early,
and remove all the other attempts to do the mount.

This is especially important when using network name spaces. Each
namespace has its own /sys, so the mount of debugfs in the global
namespace is not visible in other namespaces.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
v2: Remove the other calls to mount
---
 batadv_query.c | 17 -----------------
 main.c         |  4 ++++
 2 files changed, 4 insertions(+), 17 deletions(-)
  

Comments

Sven Eckelmann March 18, 2016, 11:27 a.m. UTC | #1
On Wednesday 16 March 2016 20:51:12 Andrew Lunn wrote:
> --- a/batadv_query.c
> +++ b/batadv_query.c
> @@ -90,16 +90,9 @@ int ipv6_to_mac(const struct in6_addr *addr, struct ether_addr *mac)
>  
>  int batadv_interface_check(const char *mesh_iface)
>  {
> -	char *debugfs_mnt;
>  	char full_path[MAX_PATH + 1];
>  	FILE *f;
>  
> -	debugfs_mnt = debugfs_mount(NULL);
> -	if (!debugfs_mnt) {
> -		fprintf(stderr, "Could not find debugfs path\n");
> -		return -1;
> -	}
> -
[...]
> diff --git a/main.c b/main.c
> index 9610398..52dca97 100644
> --- a/main.c
> +++ b/main.c
[...]
> @@ -160,6 +161,9 @@ static struct globals *alfred_init(int argc, char *argv[])
>  		{NULL,			0,			NULL,	0},
>  	};
>  
> +	/* We need full capabilities to mount debugfs, so do that now */
> +	debugfs_mount(NULL);
> +
>  	ret = reduce_capabilities();
>  	if (ret < 0)
>  		return NULL;
> 

There were some return value checks for the debugfs_mount calls which you've
removed. Why isn't here some kind of check with error handling/warning, ...?

Kind regards,
	Sven
  
Andrew Lunn March 21, 2016, 2:51 p.m. UTC | #2
On Fri, Mar 18, 2016 at 12:27:38PM +0100, Sven Eckelmann wrote:
> On Wednesday 16 March 2016 20:51:12 Andrew Lunn wrote:
> > --- a/batadv_query.c
> > +++ b/batadv_query.c
> > @@ -90,16 +90,9 @@ int ipv6_to_mac(const struct in6_addr *addr, struct ether_addr *mac)
> >  
> >  int batadv_interface_check(const char *mesh_iface)
> >  {
> > -	char *debugfs_mnt;
> >  	char full_path[MAX_PATH + 1];
> >  	FILE *f;
> >  
> > -	debugfs_mnt = debugfs_mount(NULL);
> > -	if (!debugfs_mnt) {
> > -		fprintf(stderr, "Could not find debugfs path\n");
> > -		return -1;
> > -	}
> > -
> [...]
> > diff --git a/main.c b/main.c
> > index 9610398..52dca97 100644
> > --- a/main.c
> > +++ b/main.c
> [...]
> > @@ -160,6 +161,9 @@ static struct globals *alfred_init(int argc, char *argv[])
> >  		{NULL,			0,			NULL,	0},
> >  	};
> >  
> > +	/* We need full capabilities to mount debugfs, so do that now */
> > +	debugfs_mount(NULL);
> > +
> >  	ret = reduce_capabilities();
> >  	if (ret < 0)
> >  		return NULL;
> > 
> 
> There were some return value checks for the debugfs_mount calls which you've
> removed. Why isn't here some kind of check with error handling/warning, ...?

Hi Sven

I think the other times debugfs mount was called was just before it
was used. So a mount failure means the code that follows is going to
fail.

Putting the mount very early in the program means it could be about to
do something which does not require debugfs. e.g. run in client
mode. So the most we can do a print a warning, something like: "No
access to debugfs. Some functionality may not work".

The other option is a bigger change. Move the calls to
reduce_capabilities() and debugfs_mount() to later, after the option
parsing. We then have a better idea if debugfs is needed or not, and
can then print a fatal error.

	Andrew
  
Simon Wunderlich May 27, 2016, 12:01 p.m. UTC | #3
On Wednesday 16 March 2016 20:51:12 Andrew Lunn wrote:
> The debugfs helper code has the ability to mount the debugfs file
> system if it is not already mounted. However, it cannot do this
> after the capabilities have been dropped. So perform the mount early,
> and remove all the other attempts to do the mount.
> 
> This is especially important when using network name spaces. Each
> namespace has its own /sys, so the mount of debugfs in the global
> namespace is not visible in other namespaces.
> 
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> ---
> v2: Remove the other calls to mount

Applied in revision d08b0e0.

Thanks!
     Simon
  

Patch

diff --git a/batadv_query.c b/batadv_query.c
index 1b9e631..1a385c9 100644
--- a/batadv_query.c
+++ b/batadv_query.c
@@ -90,16 +90,9 @@  int ipv6_to_mac(const struct in6_addr *addr, struct ether_addr *mac)
 
 int batadv_interface_check(const char *mesh_iface)
 {
-	char *debugfs_mnt;
 	char full_path[MAX_PATH + 1];
 	FILE *f;
 
-	debugfs_mnt = debugfs_mount(NULL);
-	if (!debugfs_mnt) {
-		fprintf(stderr, "Could not find debugfs path\n");
-		return -1;
-	}
-
 	debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" DEBUG_TRANSTABLE_GLOBAL,
 			  mesh_iface, full_path, sizeof(full_path));
 	f = fopen(full_path, "r");
@@ -134,7 +127,6 @@  struct ether_addr *translate_mac(const char *mesh_iface, struct ether_addr *mac)
 		tg_originator,
 	} pos;
 	char full_path[MAX_PATH + 1];
-	char *debugfs_mnt;
 	static struct ether_addr in_mac;
 	struct ether_addr *mac_result, *mac_tmp;
 	FILE *f = NULL;
@@ -146,10 +138,6 @@  struct ether_addr *translate_mac(const char *mesh_iface, struct ether_addr *mac)
 	memcpy(&in_mac, mac, sizeof(in_mac));
 	mac_result = &in_mac;
 
-	debugfs_mnt = debugfs_mount(NULL);
-	if (!debugfs_mnt)
-		goto out;
-
 	debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" DEBUG_TRANSTABLE_GLOBAL,
 			  mesh_iface, full_path, sizeof(full_path));
 
@@ -216,7 +204,6 @@  uint8_t get_tq(const char *mesh_iface, struct ether_addr *mac)
 		orig_tqvalue,
 	} pos;
 	char full_path[MAX_PATH + 1];
-	char *debugfs_mnt;
 	static struct ether_addr in_mac;
 	struct ether_addr *mac_tmp;
 	FILE *f = NULL;
@@ -228,10 +215,6 @@  uint8_t get_tq(const char *mesh_iface, struct ether_addr *mac)
 
 	memcpy(&in_mac, mac, sizeof(in_mac));
 
-	debugfs_mnt = debugfs_mount(NULL);
-	if (!debugfs_mnt)
-		goto out;
-
 	debugfs_make_path(DEBUG_BATIF_PATH_FMT "/" DEBUG_ORIGINATORS,
 			  mesh_iface, full_path, sizeof(full_path));
 
diff --git a/main.c b/main.c
index 9610398..52dca97 100644
--- a/main.c
+++ b/main.c
@@ -30,6 +30,7 @@ 
 #include <unistd.h>
 #endif
 #include "alfred.h"
+#include "debugfs.h"
 #include "packet.h"
 #include "list.h"
 
@@ -160,6 +161,9 @@  static struct globals *alfred_init(int argc, char *argv[])
 		{NULL,			0,			NULL,	0},
 	};
 
+	/* We need full capabilities to mount debugfs, so do that now */
+	debugfs_mount(NULL);
+
 	ret = reduce_capabilities();
 	if (ret < 0)
 		return NULL;