lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Thu, 11 Jul 2013 13:45:53 +0200
From:	Oliver Schinagl <oliver+list@...inagl.nl>
To:	Greg Kroah-Hartman <gregkh@...uxfoundation.org>
CC:	linux-kernel@...r.kernel.org, linux@...ck-us.net,
	khali@...ux-fr.org
Subject: Re: [PATCH v2 5/7] sysfs: add support for binary attributes in groups

On 11-07-13 02:36, Greg Kroah-Hartman wrote:
> groups should be able to support binary attributes, just like it
> supports "normal" attributes.  This lets us only handle one type of
> structure, groups, throughout the driver core and subsystems, making
> binary attributes a "full fledged" part of the driver model, and not
> something just "tacked on".
However when only using binary attributes it warns and doesn't create 
anything. The attached patch fixes that.
>
> Reported-by: Oliver Schinagl <oliver+list@...inagl.nl>
If I may be so bold and ask to change my e-mail address to 
<oliver@...inagl.nl> that would be kind. I use the +list delimiter to 
put all the mailing list mails in a separate mailbox.

> Signed-off-by: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
> ---
>   fs/sysfs/group.c      | 66 +++++++++++++++++++++++++++++++++++----------------
>   include/linux/sysfs.h |  4 ++--
>   2 files changed, 48 insertions(+), 22 deletions(-)
>
> diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c
> index aec3d5c..e5719c6 100644
> --- a/fs/sysfs/group.c
> +++ b/fs/sysfs/group.c
> @@ -20,38 +20,64 @@ static void remove_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
>   			 const struct attribute_group *grp)
>   {
>   	struct attribute *const* attr;
> -	int i;
> +	struct bin_attribute *const* bin_attr;
>
> -	for (i = 0, attr = grp->attrs; *attr; i++, attr++)
> -		sysfs_hash_and_remove(dir_sd, NULL, (*attr)->name);
> +	if (grp->attrs)
> +		for (attr = grp->attrs; *attr; attr++)
> +			sysfs_hash_and_remove(dir_sd, NULL, (*attr)->name);
> +	if (grp->bin_attrs)
> +		for (bin_attr = grp->bin_attrs; *bin_attr; bin_attr++)
> +			sysfs_remove_bin_file(kobj, *bin_attr);
>   }
>
>   static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
>   			const struct attribute_group *grp, int update)
>   {
>   	struct attribute *const* attr;
> +	struct bin_attribute *const* bin_attr;
>   	int error = 0, i;
>
> -	for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++) {
> -		umode_t mode = 0;
> +	if (grp->attrs) {
> +		for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++) {
> +			umode_t mode = 0;
> +
> +			/*
> +			 * In update mode, we're changing the permissions or
> +			 * visibility.  Do this by first removing then
> +			 * re-adding (if required) the file.
> +			 */
> +			if (update)
> +				sysfs_hash_and_remove(dir_sd, NULL,
> +						      (*attr)->name);
> +			if (grp->is_visible) {
> +				mode = grp->is_visible(kobj, *attr, i);
> +				if (!mode)
> +					continue;
> +			}
> +			error = sysfs_add_file_mode(dir_sd, *attr,
> +						    SYSFS_KOBJ_ATTR,
> +						    (*attr)->mode | mode);
> +			if (unlikely(error))
> +				break;
> +		}
> +		if (error) {
> +			remove_files(dir_sd, kobj, grp);
> +			goto exit;
> +		}
> +	}
>
> -		/* in update mode, we're changing the permissions or
> -		 * visibility.  Do this by first removing then
> -		 * re-adding (if required) the file */
> -		if (update)
> -			sysfs_hash_and_remove(dir_sd, NULL, (*attr)->name);
> -		if (grp->is_visible) {
> -			mode = grp->is_visible(kobj, *attr, i);
> -			if (!mode)
> -				continue;
> +	if (grp->bin_attrs) {
> +		for (bin_attr = grp->bin_attrs; *bin_attr; bin_attr++) {
> +			if (update)
> +				sysfs_remove_bin_file(kobj, *bin_attr);
> +			error = sysfs_create_bin_file(kobj, *bin_attr);
> +			if (error)
> +				break;
>   		}
> -		error = sysfs_add_file_mode(dir_sd, *attr, SYSFS_KOBJ_ATTR,
> -					    (*attr)->mode | mode);
> -		if (unlikely(error))
> -			break;
> +		if (error)
> +			remove_files(dir_sd, kobj, grp);
>   	}
> -	if (error)
> -		remove_files(dir_sd, kobj, grp);
> +exit:
>   	return error;
>   }
>
> diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
> index d50a96b..2c3b6a3 100644
> --- a/include/linux/sysfs.h
> +++ b/include/linux/sysfs.h
> @@ -21,6 +21,7 @@
>
>   struct kobject;
>   struct module;
> +struct bin_attribute;
>   enum kobj_ns_type;
>
>   struct attribute {
> @@ -59,10 +60,9 @@ struct attribute_group {
>   	umode_t			(*is_visible)(struct kobject *,
>   					      struct attribute *, int);
>   	struct attribute	**attrs;
> +	struct bin_attribute	**bin_attrs;
>   };
>
> -
> -
>   /**
>    * Use these macros to make defining attributes easier. See include/linux/device.h
>    * for examples..
>


View attachment "0001-sysfs-prevent-warning-when-only-using-binary-attribu.patch" of type "text/x-patch" (1105 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ