Commit 8a3d8ed0 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of...

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6:
  flex_arrays: allow zero length flex arrays
  flex_array: flex_array_prealloc takes a number of elements, not an end
  SELinux: pass last path component in may_create
parents 30106b8c 6f239284
...@@ -66,10 +66,10 @@ trick is to ensure that any needed memory allocations are done before ...@@ -66,10 +66,10 @@ trick is to ensure that any needed memory allocations are done before
entering atomic context, using: entering atomic context, using:
int flex_array_prealloc(struct flex_array *array, unsigned int start, int flex_array_prealloc(struct flex_array *array, unsigned int start,
unsigned int end, gfp_t flags); unsigned int nr_elements, gfp_t flags);
This function will ensure that memory for the elements indexed in the range This function will ensure that memory for the elements indexed in the range
defined by start and end has been allocated. Thereafter, a defined by start and nr_elements has been allocated. Thereafter, a
flex_array_put() call on an element in that range is guaranteed not to flex_array_put() call on an element in that range is guaranteed not to
block. block.
......
...@@ -61,7 +61,7 @@ struct flex_array { ...@@ -61,7 +61,7 @@ struct flex_array {
struct flex_array *flex_array_alloc(int element_size, unsigned int total, struct flex_array *flex_array_alloc(int element_size, unsigned int total,
gfp_t flags); gfp_t flags);
int flex_array_prealloc(struct flex_array *fa, unsigned int start, int flex_array_prealloc(struct flex_array *fa, unsigned int start,
unsigned int end, gfp_t flags); unsigned int nr_elements, gfp_t flags);
void flex_array_free(struct flex_array *fa); void flex_array_free(struct flex_array *fa);
void flex_array_free_parts(struct flex_array *fa); void flex_array_free_parts(struct flex_array *fa);
int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src,
......
...@@ -232,10 +232,10 @@ EXPORT_SYMBOL(flex_array_clear); ...@@ -232,10 +232,10 @@ EXPORT_SYMBOL(flex_array_clear);
/** /**
* flex_array_prealloc - guarantee that array space exists * flex_array_prealloc - guarantee that array space exists
* @fa: the flex array for which to preallocate parts * @fa: the flex array for which to preallocate parts
* @start: index of first array element for which space is allocated * @start: index of first array element for which space is allocated
* @end: index of last (inclusive) element for which space is allocated * @nr_elements: number of elements for which space is allocated
* @flags: page allocation flags * @flags: page allocation flags
* *
* This will guarantee that no future calls to flex_array_put() * This will guarantee that no future calls to flex_array_put()
* will allocate memory. It can be used if you are expecting to * will allocate memory. It can be used if you are expecting to
...@@ -245,14 +245,24 @@ EXPORT_SYMBOL(flex_array_clear); ...@@ -245,14 +245,24 @@ EXPORT_SYMBOL(flex_array_clear);
* Locking must be provided by the caller. * Locking must be provided by the caller.
*/ */
int flex_array_prealloc(struct flex_array *fa, unsigned int start, int flex_array_prealloc(struct flex_array *fa, unsigned int start,
unsigned int end, gfp_t flags) unsigned int nr_elements, gfp_t flags)
{ {
int start_part; int start_part;
int end_part; int end_part;
int part_nr; int part_nr;
unsigned int end;
struct flex_array_part *part; struct flex_array_part *part;
if (start >= fa->total_nr_elements || end >= fa->total_nr_elements) if (!start && !nr_elements)
return 0;
if (start >= fa->total_nr_elements)
return -ENOSPC;
if (!nr_elements)
return 0;
end = start + nr_elements - 1;
if (end >= fa->total_nr_elements)
return -ENOSPC; return -ENOSPC;
if (elements_fit_in_base(fa)) if (elements_fit_in_base(fa))
return 0; return 0;
...@@ -343,6 +353,8 @@ int flex_array_shrink(struct flex_array *fa) ...@@ -343,6 +353,8 @@ int flex_array_shrink(struct flex_array *fa)
int part_nr; int part_nr;
int ret = 0; int ret = 0;
if (!fa->total_nr_elements)
return 0;
if (elements_fit_in_base(fa)) if (elements_fit_in_base(fa))
return ret; return ret;
for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) { for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) {
......
...@@ -1578,7 +1578,8 @@ static int may_create(struct inode *dir, ...@@ -1578,7 +1578,8 @@ static int may_create(struct inode *dir,
return rc; return rc;
if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) { if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
rc = security_transition_sid(sid, dsec->sid, tclass, NULL, &newsid); rc = security_transition_sid(sid, dsec->sid, tclass,
&dentry->d_name, &newsid);
if (rc) if (rc)
return rc; return rc;
} }
......
...@@ -502,7 +502,7 @@ static int policydb_index(struct policydb *p) ...@@ -502,7 +502,7 @@ static int policydb_index(struct policydb *p)
goto out; goto out;
rc = flex_array_prealloc(p->type_val_to_struct_array, 0, rc = flex_array_prealloc(p->type_val_to_struct_array, 0,
p->p_types.nprim - 1, GFP_KERNEL | __GFP_ZERO); p->p_types.nprim, GFP_KERNEL | __GFP_ZERO);
if (rc) if (rc)
goto out; goto out;
...@@ -519,7 +519,7 @@ static int policydb_index(struct policydb *p) ...@@ -519,7 +519,7 @@ static int policydb_index(struct policydb *p)
goto out; goto out;
rc = flex_array_prealloc(p->sym_val_to_name[i], rc = flex_array_prealloc(p->sym_val_to_name[i],
0, p->symtab[i].nprim - 1, 0, p->symtab[i].nprim,
GFP_KERNEL | __GFP_ZERO); GFP_KERNEL | __GFP_ZERO);
if (rc) if (rc)
goto out; goto out;
...@@ -2375,7 +2375,7 @@ int policydb_read(struct policydb *p, void *fp) ...@@ -2375,7 +2375,7 @@ int policydb_read(struct policydb *p, void *fp)
goto bad; goto bad;
/* preallocate so we don't have to worry about the put ever failing */ /* preallocate so we don't have to worry about the put ever failing */
rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim - 1, rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim,
GFP_KERNEL | __GFP_ZERO); GFP_KERNEL | __GFP_ZERO);
if (rc) if (rc)
goto bad; goto bad;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment