[Freeipa-devel] [PATCHES 0172-0176] ipa_range_check improvements
Alexander Bokovoy
abokovoy at redhat.com
Thu Apr 17 12:44:21 UTC 2014
On Thu, 17 Apr 2014, Tomas Babej wrote:
>>From 43cd26a0a42c3b18e4dbb5c6ed0f20ee1562b98a Mon Sep 17 00:00:00 2001
>From: Tomas Babej <tbabej at redhat.com>
>Date: Wed, 16 Apr 2014 17:15:55 +0200
>Subject: [PATCH] ipa_range_check: Use special attributes to determine presence
> of RID bases
>
>The slapi_entry_attr_get_ulong which is used to get value of the RID base
>attributes returns 0 in case the attribute is not set at all. We need
>to distinguish this situation from the situation where RID base attributes
>are present, but deliberately set to 0.
>
>Otherwise this can cause false negative results of checks in the range_check
>plugin.
>
>Part of: https://fedorahosted.org/freeipa/ticket/4137
>---
> .../ipa-range-check/ipa_range_check.c | 40 +++++++++++++++++-----
> 1 file changed, 31 insertions(+), 9 deletions(-)
>
>diff --git a/daemons/ipa-slapi-plugins/ipa-range-check/ipa_range_check.c b/daemons/ipa-slapi-plugins/ipa-range-check/ipa_range_check.c
>index da5169e6e9bf74d5fbbf3aea40ee3e1a2c8f6016..68948f599aa4e6d21b071424ab27e3c62c0afefe 100644
>--- a/daemons/ipa-slapi-plugins/ipa-range-check/ipa_range_check.c
>+++ b/daemons/ipa-slapi-plugins/ipa-range-check/ipa_range_check.c
>@@ -88,6 +88,8 @@ struct range_info {
> uint32_t id_range_size;
> uint32_t base_rid;
> uint32_t secondary_base_rid;
>+ bool base_rid_set;
>+ bool secondary_base_rid_set;
> };
>
> static void free_range_info(struct range_info *range) {
>@@ -281,6 +283,7 @@ static int slapi_entry_to_range_info(struct domain_info *domain_info_head,
> int ret;
> unsigned long ul_val;
> struct range_info *range = NULL;
>+ Slapi_Attr *attr;
>
> range = calloc(1, sizeof(struct range_info));
> if (range == NULL) {
>@@ -326,6 +329,20 @@ static int slapi_entry_to_range_info(struct domain_info *domain_info_head,
> }
> range->secondary_base_rid = ul_val;
>
>+ if (slapi_entry_attr_find(entry, IPA_BASE_RID, &attr) == -1) {
>+ range->base_rid_set = false;
>+ }
>+ else {
>+ range->base_rid_set = true;
>+ }
You replace this by
range->base_rid_set = (slapi_entry_attr_find(entry, IPA_BASE_RID, &attr) == -1);
>+
>+ if (slapi_entry_attr_find(entry, IPA_SECONDARY_BASE_RID, &attr) == -1) {
>+ range->secondary_base_rid_set = false;
>+ }
>+ else {
>+ range->secondary_base_rid_set = true;
>+ }
>+
Same here.
> *_range = range;
> ret = 0;
>
>@@ -398,12 +415,14 @@ static int check_ranges(struct range_info *r1, struct range_info *r2)
>
> /* For ipa-local or ipa-ad-trust range types primary RID ranges should
> * not overlap */
>+
> if (strcasecmp(r1->id_range_type, AD_TRUST_RANGE_TYPE) == 0 ||
> strcasecmp(r1->id_range_type, LOCAL_RANGE_TYPE) == 0) {
>
>- /* Check if rid range overlaps with existing rid range */
>- if (intervals_overlap(r1->base_rid, r2->base_rid,
>- r1->id_range_size, r2->id_range_size))
>+ /* Check if primary rid range overlaps with existing primary rid range */
>+ if ((r1->base_rid_set && r2->base_rid_set) &&
>+ intervals_overlap(r1->base_rid, r2->base_rid,
>+ r1->id_range_size, r2->id_range_size))
> return 2;
> }
>
>@@ -412,18 +431,21 @@ static int check_ranges(struct range_info *r1, struct range_info *r2)
>
> /* Check if secondary RID range overlaps with existing secondary or
> * primary RID range. */
>- if (intervals_overlap(r1->secondary_base_rid,
>- r2->secondary_base_rid, r1->id_range_size, r2->id_range_size))
>+ if ((r1->secondary_base_rid_set && r2->secondary_base_rid_set) &&
>+ intervals_overlap(r1->secondary_base_rid, r2->secondary_base_rid,
>+ r1->id_range_size, r2->id_range_size))
> return 3;
>
> /* Check if RID range overlaps with existing secondary RID range */
>- if (intervals_overlap(r1->base_rid, r2->secondary_base_rid,
>- r1->id_range_size, r2->id_range_size))
>+ if ((r1->base_rid_set && r2->secondary_base_rid_set) &&
>+ intervals_overlap(r1->base_rid, r2->secondary_base_rid,
>+ r1->id_range_size, r2->id_range_size))
> return 4;
>
> /* Check if secondary RID range overlaps with existing RID range */
>- if (intervals_overlap(r1->secondary_base_rid, r2->base_rid,
>- r1->id_range_size, r2->id_range_size))
>+ if ((r1->secondary_base_rid_set && r2->base_rid_set) &&
>+ intervals_overlap(r1->secondary_base_rid, r2->base_rid,
>+ r1->id_range_size, r2->id_range_size))
> return 5;
> }
> }
I know that is was in your original code, but can we get numbers
replaced by an enum? I'd prefer to see symbolic names used instead of
numbers.
--
/ Alexander Bokovoy
More information about the Freeipa-devel
mailing list