[apparmor] [PATCH 1/3] apparmor: Add support for attaching profiles via xattr, presence and value

John Johansen john.johansen at canonical.com
Fri Feb 9 00:04:37 UTC 2018


On 02/08/2018 02:07 PM, Seth Arnold wrote:
> Hello,
> 
> On Thu, Feb 08, 2018 at 12:37:19PM -0800, John Johansen wrote:
>> +static bool unpack_xattrs(struct aa_ext *e, struct aa_profile *profile)
>> +{
>> +	void *pos = e->pos;
>> +
>> +	if (unpack_nameX(e, AA_STRUCT, "xattrs")) {
>> +		int i, size;
>> +
>> +		size = unpack_array(e, NULL);
>> +		profile->xattr_count = size;
>> +		profile->xattrs = kmalloc_array(size, sizeof(char *),
>> +						GFP_KERNEL);
>> +		if (!profile->xattrs)
>> +			goto fail;
>> +		for (i = 0; i < size; i++) {
>> +			if (!unpack_strdup(e, &profile->xattrs[i], NULL))
>> +				goto fail;
> 
> If this step fails before completion, the xattrs array may have some
> entries that weren't properly initialized; I suspect the free operation
> will cause serious trouble in this case.
> 
yep we can switch the kmalloc_array for a kcalloc, and that will fix it

thanks

>> +		}
>> +		if (!unpack_nameX(e, AA_ARRAYEND, NULL))
>> +			goto fail;
>> +		if (!unpack_nameX(e, AA_STRUCTEND, NULL))
>> +			goto fail;
>> +	}
>> +
>> +	if (unpack_nameX(e, AA_STRUCT, "xattr_values")) {
>> +		int i, size;
>> +
>> +		size = unpack_array(e, NULL);
>> +
>> +		/* Must be the same number of xattr values as xattrs */
>> +		if (size != profile->xattr_count)
>> +			goto fail;
>> +
>> +		profile->xattr_lens = kmalloc_array(size, sizeof(size_t),
>> +						    GFP_KERNEL);
>> +		if (!profile->xattr_lens)
>> +			goto fail;
>> +
>> +		profile->xattr_values = kmalloc_array(size, sizeof(char *),
>> +						      GFP_KERNEL);
> 
> Same thing here with the xattr_lens and xattr_values arrays.
> 
>> +		if (!profile->xattr_values)
>> +			goto fail;
>> +
>> +		for (i = 0; i < size; i++) {
>> +			profile->xattr_lens[i] = unpack_blob(e,
>> +					      &profile->xattr_values[i], NULL);
>> +			profile->xattr_values[i] =
>> +				kvmemdup(profile->xattr_values[i],
>> +					 profile->xattr_lens[i]);
>> +		}
>> +
>> +		if (!unpack_nameX(e, AA_ARRAYEND, NULL))
>> +			goto fail;
>> +		if (!unpack_nameX(e, AA_STRUCTEND, NULL))
>> +			goto fail;
>> +	}
>> +	return 1;
>> +
>> +fail:
>> +	e->pos = pos;
>> +	return 0;
>> +}
> 
> Thanks
> 
> 
> 




More information about the AppArmor mailing list