diff options
Diffstat (limited to 'net/netlabel/netlabel_kapi.c')
-rw-r--r-- | net/netlabel/netlabel_kapi.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index 3045a964f39c..84e810bef39a 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
@@ -522,7 +522,7 @@ int netlbl_secattr_catmap_walk_rng(struct netlbl_lsm_secattr_catmap *catmap, | |||
522 | 522 | ||
523 | /** | 523 | /** |
524 | * netlbl_secattr_catmap_setbit - Set a bit in a LSM secattr catmap | 524 | * netlbl_secattr_catmap_setbit - Set a bit in a LSM secattr catmap |
525 | * @catmap: the category bitmap | 525 | * @catmap: pointer to the category bitmap |
526 | * @bit: the bit to set | 526 | * @bit: the bit to set |
527 | * @flags: memory allocation flags | 527 | * @flags: memory allocation flags |
528 | * | 528 | * |
@@ -531,18 +531,25 @@ int netlbl_secattr_catmap_walk_rng(struct netlbl_lsm_secattr_catmap *catmap, | |||
531 | * negative values on failure. | 531 | * negative values on failure. |
532 | * | 532 | * |
533 | */ | 533 | */ |
534 | int netlbl_secattr_catmap_setbit(struct netlbl_lsm_secattr_catmap *catmap, | 534 | int netlbl_secattr_catmap_setbit(struct netlbl_lsm_secattr_catmap **catmap, |
535 | u32 bit, | 535 | u32 bit, |
536 | gfp_t flags) | 536 | gfp_t flags) |
537 | { | 537 | { |
538 | struct netlbl_lsm_secattr_catmap *iter = catmap; | 538 | struct netlbl_lsm_secattr_catmap *iter = *catmap; |
539 | u32 node_bit; | 539 | u32 node_bit; |
540 | u32 node_idx; | 540 | u32 node_idx; |
541 | 541 | ||
542 | while (iter->next != NULL && | 542 | while (iter->next != NULL && |
543 | bit >= (iter->startbit + NETLBL_CATMAP_SIZE)) | 543 | bit >= (iter->startbit + NETLBL_CATMAP_SIZE)) |
544 | iter = iter->next; | 544 | iter = iter->next; |
545 | if (bit >= (iter->startbit + NETLBL_CATMAP_SIZE)) { | 545 | if (bit < iter->startbit) { |
546 | iter = netlbl_secattr_catmap_alloc(flags); | ||
547 | if (iter == NULL) | ||
548 | return -ENOMEM; | ||
549 | iter->next = *catmap; | ||
550 | iter->startbit = bit & ~(NETLBL_CATMAP_SIZE - 1); | ||
551 | *catmap = iter; | ||
552 | } else if (bit >= (iter->startbit + NETLBL_CATMAP_SIZE)) { | ||
546 | iter->next = netlbl_secattr_catmap_alloc(flags); | 553 | iter->next = netlbl_secattr_catmap_alloc(flags); |
547 | if (iter->next == NULL) | 554 | if (iter->next == NULL) |
548 | return -ENOMEM; | 555 | return -ENOMEM; |
@@ -560,7 +567,7 @@ int netlbl_secattr_catmap_setbit(struct netlbl_lsm_secattr_catmap *catmap, | |||
560 | 567 | ||
561 | /** | 568 | /** |
562 | * netlbl_secattr_catmap_setrng - Set a range of bits in a LSM secattr catmap | 569 | * netlbl_secattr_catmap_setrng - Set a range of bits in a LSM secattr catmap |
563 | * @catmap: the category bitmap | 570 | * @catmap: pointer to the category bitmap |
564 | * @start: the starting bit | 571 | * @start: the starting bit |
565 | * @end: the last bit in the string | 572 | * @end: the last bit in the string |
566 | * @flags: memory allocation flags | 573 | * @flags: memory allocation flags |
@@ -570,15 +577,16 @@ int netlbl_secattr_catmap_setbit(struct netlbl_lsm_secattr_catmap *catmap, | |||
570 | * on success, negative values on failure. | 577 | * on success, negative values on failure. |
571 | * | 578 | * |
572 | */ | 579 | */ |
573 | int netlbl_secattr_catmap_setrng(struct netlbl_lsm_secattr_catmap *catmap, | 580 | int netlbl_secattr_catmap_setrng(struct netlbl_lsm_secattr_catmap **catmap, |
574 | u32 start, | 581 | u32 start, |
575 | u32 end, | 582 | u32 end, |
576 | gfp_t flags) | 583 | gfp_t flags) |
577 | { | 584 | { |
578 | int ret_val = 0; | 585 | int ret_val = 0; |
579 | struct netlbl_lsm_secattr_catmap *iter = catmap; | 586 | struct netlbl_lsm_secattr_catmap *iter = *catmap; |
580 | u32 iter_max_spot; | 587 | u32 iter_max_spot; |
581 | u32 spot; | 588 | u32 spot; |
589 | u32 orig_spot = iter->startbit; | ||
582 | 590 | ||
583 | /* XXX - This could probably be made a bit faster by combining writes | 591 | /* XXX - This could probably be made a bit faster by combining writes |
584 | * to the catmap instead of setting a single bit each time, but for | 592 | * to the catmap instead of setting a single bit each time, but for |
@@ -596,7 +604,9 @@ int netlbl_secattr_catmap_setrng(struct netlbl_lsm_secattr_catmap *catmap, | |||
596 | iter = iter->next; | 604 | iter = iter->next; |
597 | iter_max_spot = iter->startbit + NETLBL_CATMAP_SIZE; | 605 | iter_max_spot = iter->startbit + NETLBL_CATMAP_SIZE; |
598 | } | 606 | } |
599 | ret_val = netlbl_secattr_catmap_setbit(iter, spot, flags); | 607 | ret_val = netlbl_secattr_catmap_setbit(&iter, spot, flags); |
608 | if (iter->startbit < orig_spot) | ||
609 | *catmap = iter; | ||
600 | } | 610 | } |
601 | 611 | ||
602 | return ret_val; | 612 | return ret_val; |