diff options
author | Dan Carpenter <error27@gmail.com> | 2010-06-12 14:50:35 -0400 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2010-08-02 01:35:01 -0400 |
commit | 9e0bd4cba4460bff64fb07cfb07849cdfd4d325a (patch) | |
tree | feebec6167012e461d286c02ae45348ad0b2d3a1 /security/selinux | |
parent | dce3a3d2ee038d230323fe06b061dbaace6b8f94 (diff) |
selinux: cleanup return codes in avtab_read_item()
The avtab_read_item() function tends to return -1 as a default error
code which is wrong (-1 means -EPERM). I modified it to return
appropriate error codes which is -EINVAL or the error code from
next_entry() or insertf().
next_entry() returns -EINVAL.
insertf() is a function pointer to either avtab_insert() or
cond_insertf().
avtab_insert() returns -EINVAL, -ENOMEM, and -EEXIST.
cond_insertf() currently returns -1, but I will fix it in a later patch.
There is code in avtab_read() which translates the -1 returns from
avtab_read_item() to -EINVAL. The translation is no longer needed, so I
removed it.
Signed-off-by: Dan Carpenter <error27@gmail.com>
Acked-by: Stephen D. Smalley <sds@tycho.nsa.gov>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/selinux')
-rw-r--r-- | security/selinux/ss/avtab.c | 39 |
1 files changed, 19 insertions, 20 deletions
diff --git a/security/selinux/ss/avtab.c b/security/selinux/ss/avtab.c index 1215b8e47dba..929480c6c430 100644 --- a/security/selinux/ss/avtab.c +++ b/security/selinux/ss/avtab.c | |||
@@ -342,20 +342,20 @@ int avtab_read_item(struct avtab *a, void *fp, struct policydb *pol, | |||
342 | 342 | ||
343 | if (vers < POLICYDB_VERSION_AVTAB) { | 343 | if (vers < POLICYDB_VERSION_AVTAB) { |
344 | rc = next_entry(buf32, fp, sizeof(u32)); | 344 | rc = next_entry(buf32, fp, sizeof(u32)); |
345 | if (rc < 0) { | 345 | if (rc) { |
346 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); | 346 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); |
347 | return -1; | 347 | return rc; |
348 | } | 348 | } |
349 | items2 = le32_to_cpu(buf32[0]); | 349 | items2 = le32_to_cpu(buf32[0]); |
350 | if (items2 > ARRAY_SIZE(buf32)) { | 350 | if (items2 > ARRAY_SIZE(buf32)) { |
351 | printk(KERN_ERR "SELinux: avtab: entry overflow\n"); | 351 | printk(KERN_ERR "SELinux: avtab: entry overflow\n"); |
352 | return -1; | 352 | return -EINVAL; |
353 | 353 | ||
354 | } | 354 | } |
355 | rc = next_entry(buf32, fp, sizeof(u32)*items2); | 355 | rc = next_entry(buf32, fp, sizeof(u32)*items2); |
356 | if (rc < 0) { | 356 | if (rc) { |
357 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); | 357 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); |
358 | return -1; | 358 | return rc; |
359 | } | 359 | } |
360 | items = 0; | 360 | items = 0; |
361 | 361 | ||
@@ -363,19 +363,19 @@ int avtab_read_item(struct avtab *a, void *fp, struct policydb *pol, | |||
363 | key.source_type = (u16)val; | 363 | key.source_type = (u16)val; |
364 | if (key.source_type != val) { | 364 | if (key.source_type != val) { |
365 | printk(KERN_ERR "SELinux: avtab: truncated source type\n"); | 365 | printk(KERN_ERR "SELinux: avtab: truncated source type\n"); |
366 | return -1; | 366 | return -EINVAL; |
367 | } | 367 | } |
368 | val = le32_to_cpu(buf32[items++]); | 368 | val = le32_to_cpu(buf32[items++]); |
369 | key.target_type = (u16)val; | 369 | key.target_type = (u16)val; |
370 | if (key.target_type != val) { | 370 | if (key.target_type != val) { |
371 | printk(KERN_ERR "SELinux: avtab: truncated target type\n"); | 371 | printk(KERN_ERR "SELinux: avtab: truncated target type\n"); |
372 | return -1; | 372 | return -EINVAL; |
373 | } | 373 | } |
374 | val = le32_to_cpu(buf32[items++]); | 374 | val = le32_to_cpu(buf32[items++]); |
375 | key.target_class = (u16)val; | 375 | key.target_class = (u16)val; |
376 | if (key.target_class != val) { | 376 | if (key.target_class != val) { |
377 | printk(KERN_ERR "SELinux: avtab: truncated target class\n"); | 377 | printk(KERN_ERR "SELinux: avtab: truncated target class\n"); |
378 | return -1; | 378 | return -EINVAL; |
379 | } | 379 | } |
380 | 380 | ||
381 | val = le32_to_cpu(buf32[items++]); | 381 | val = le32_to_cpu(buf32[items++]); |
@@ -383,12 +383,12 @@ int avtab_read_item(struct avtab *a, void *fp, struct policydb *pol, | |||
383 | 383 | ||
384 | if (!(val & (AVTAB_AV | AVTAB_TYPE))) { | 384 | if (!(val & (AVTAB_AV | AVTAB_TYPE))) { |
385 | printk(KERN_ERR "SELinux: avtab: null entry\n"); | 385 | printk(KERN_ERR "SELinux: avtab: null entry\n"); |
386 | return -1; | 386 | return -EINVAL; |
387 | } | 387 | } |
388 | if ((val & AVTAB_AV) && | 388 | if ((val & AVTAB_AV) && |
389 | (val & AVTAB_TYPE)) { | 389 | (val & AVTAB_TYPE)) { |
390 | printk(KERN_ERR "SELinux: avtab: entry has both access vectors and types\n"); | 390 | printk(KERN_ERR "SELinux: avtab: entry has both access vectors and types\n"); |
391 | return -1; | 391 | return -EINVAL; |
392 | } | 392 | } |
393 | 393 | ||
394 | for (i = 0; i < ARRAY_SIZE(spec_order); i++) { | 394 | for (i = 0; i < ARRAY_SIZE(spec_order); i++) { |
@@ -403,15 +403,15 @@ int avtab_read_item(struct avtab *a, void *fp, struct policydb *pol, | |||
403 | 403 | ||
404 | if (items != items2) { | 404 | if (items != items2) { |
405 | printk(KERN_ERR "SELinux: avtab: entry only had %d items, expected %d\n", items2, items); | 405 | printk(KERN_ERR "SELinux: avtab: entry only had %d items, expected %d\n", items2, items); |
406 | return -1; | 406 | return -EINVAL; |
407 | } | 407 | } |
408 | return 0; | 408 | return 0; |
409 | } | 409 | } |
410 | 410 | ||
411 | rc = next_entry(buf16, fp, sizeof(u16)*4); | 411 | rc = next_entry(buf16, fp, sizeof(u16)*4); |
412 | if (rc < 0) { | 412 | if (rc) { |
413 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); | 413 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); |
414 | return -1; | 414 | return rc; |
415 | } | 415 | } |
416 | 416 | ||
417 | items = 0; | 417 | items = 0; |
@@ -424,7 +424,7 @@ int avtab_read_item(struct avtab *a, void *fp, struct policydb *pol, | |||
424 | !policydb_type_isvalid(pol, key.target_type) || | 424 | !policydb_type_isvalid(pol, key.target_type) || |
425 | !policydb_class_isvalid(pol, key.target_class)) { | 425 | !policydb_class_isvalid(pol, key.target_class)) { |
426 | printk(KERN_ERR "SELinux: avtab: invalid type or class\n"); | 426 | printk(KERN_ERR "SELinux: avtab: invalid type or class\n"); |
427 | return -1; | 427 | return -EINVAL; |
428 | } | 428 | } |
429 | 429 | ||
430 | set = 0; | 430 | set = 0; |
@@ -434,19 +434,19 @@ int avtab_read_item(struct avtab *a, void *fp, struct policydb *pol, | |||
434 | } | 434 | } |
435 | if (!set || set > 1) { | 435 | if (!set || set > 1) { |
436 | printk(KERN_ERR "SELinux: avtab: more than one specifier\n"); | 436 | printk(KERN_ERR "SELinux: avtab: more than one specifier\n"); |
437 | return -1; | 437 | return -EINVAL; |
438 | } | 438 | } |
439 | 439 | ||
440 | rc = next_entry(buf32, fp, sizeof(u32)); | 440 | rc = next_entry(buf32, fp, sizeof(u32)); |
441 | if (rc < 0) { | 441 | if (rc) { |
442 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); | 442 | printk(KERN_ERR "SELinux: avtab: truncated entry\n"); |
443 | return -1; | 443 | return rc; |
444 | } | 444 | } |
445 | datum.data = le32_to_cpu(*buf32); | 445 | datum.data = le32_to_cpu(*buf32); |
446 | if ((key.specified & AVTAB_TYPE) && | 446 | if ((key.specified & AVTAB_TYPE) && |
447 | !policydb_type_isvalid(pol, datum.data)) { | 447 | !policydb_type_isvalid(pol, datum.data)) { |
448 | printk(KERN_ERR "SELinux: avtab: invalid type\n"); | 448 | printk(KERN_ERR "SELinux: avtab: invalid type\n"); |
449 | return -1; | 449 | return -EINVAL; |
450 | } | 450 | } |
451 | return insertf(a, &key, &datum, p); | 451 | return insertf(a, &key, &datum, p); |
452 | } | 452 | } |
@@ -487,8 +487,7 @@ int avtab_read(struct avtab *a, void *fp, struct policydb *pol) | |||
487 | printk(KERN_ERR "SELinux: avtab: out of memory\n"); | 487 | printk(KERN_ERR "SELinux: avtab: out of memory\n"); |
488 | else if (rc == -EEXIST) | 488 | else if (rc == -EEXIST) |
489 | printk(KERN_ERR "SELinux: avtab: duplicate entry\n"); | 489 | printk(KERN_ERR "SELinux: avtab: duplicate entry\n"); |
490 | else | 490 | |
491 | rc = -EINVAL; | ||
492 | goto bad; | 491 | goto bad; |
493 | } | 492 | } |
494 | } | 493 | } |