[systemd-devel] SELinux patch still broken, in that we are not checking the correct source context.

Lennart Poettering lennart at poettering.net
Mon Oct 15 17:00:23 PDT 2012


On Thu, 11.10.12 17:06, Daniel J Walsh (dwalsh at redhat.com) wrote:

Applied both patches, with minor changes (replaced calloc+strncpy with
strndup()).

> diff --git a/src/core/selinux-access.c b/src/core/selinux-access.c
> index d9c3f9b..974e9fe 100644
> --- a/src/core/selinux-access.c
> +++ b/src/core/selinux-access.c
> @@ -59,7 +59,11 @@ static int bus_get_selinux_security_context(
>                  DBusError *error) {
>  
>          _cleanup_dbus_message_unref_ DBusMessage *m = NULL, *reply = NULL;
> +	DBusMessageIter iter, sub;
> +	char *bytes;
> +	int nbytes;
>  
> +        log_debug("GetConnectionSELinuxSecurityContext");
>          m = dbus_message_new_method_call(
>                          DBUS_SERVICE_DBUS,
>                          DBUS_PATH_DBUS,
> @@ -85,11 +89,21 @@ static int bus_get_selinux_security_context(
>          if (dbus_set_error_from_message(error, reply))
>                  return -EIO;
>  
> -        if (!dbus_message_get_args(
> -                            reply, error,
> -                            DBUS_TYPE_STRING, scon,
> -                            DBUS_TYPE_INVALID))
> -                return -EIO;
> +        if (!dbus_message_iter_init (reply, &iter))
> +		return -EIO;
> +
> +        if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_ARRAY)
> +		return -EIO;
> +
> +	dbus_message_iter_recurse (&iter, &sub);
> +	dbus_message_iter_get_fixed_array (&sub, &bytes, &nbytes);
> +
> +	*scon = calloc(1, nbytes + 1);
> +	if (!*scon)
> +                return -ENOMEM;
> +	strncpy(*scon, bytes, nbytes);
> +
> +        log_debug("GetConnectionSELinuxSecurityContext %s (pid %ld)", *scon, (long) bus_get_unix_process_id(connection, name, error));
>  
>          return 0;
>  }
> @@ -293,14 +307,17 @@ static int get_calling_context(
>          */
>          sender = dbus_message_get_sender(message);
>          if (sender) {
> +                log_error("SELinux Got Sender %s", sender);
> +
>                  r = bus_get_selinux_security_context(connection, sender, scon, error);
>                  if (r >= 0)
>                          return r;
>  
> -                log_debug("bus_get_selinux_security_context failed %m");
> -                dbus_error_free(error);
> +                log_error("bus_get_selinux_security_context failed %m");
> +                return r;
>          }
>  
> +        log_debug("SELinux No Sender");
>          if (!dbus_connection_get_unix_fd(connection, &fd)) {
>                  log_error("bus_connection_get_unix_fd failed %m");
>                  return -EINVAL;

> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel



Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list