ldap/servers/slapd/dn.c | 10 +++++--
ldap/servers/slapd/entry.c | 49 ++++++++++++++++++-------------------
ldap/servers/slapd/pw.c | 25 ++++++++++++++++++
ldap/servers/slapd/slap.h | 1
ldap/servers/slapd/slapi-private.h | 1
ldap/servers/slapd/valueset.c | 11 +++-----
6 files changed, 63 insertions(+), 34 deletions(-)
New commits:
commit baa3df4e846526f520d3d3533e2611045c243771
Author: Noriko Hosoi <nhosoi(a)redhat.com>
Date: Mon Feb 10 17:05:16 2014 -0800
Ticket #47677 - Size returned by slapi_entry_size is not accurate
Description: slapi_entry_size calculating the entry size had issues.
. To calculate the Slapi_DN size, local function slapi_dn_size was used.
Local slapi_dn_size missed to count the raw dn length. This patch
replaces slapi_dn_size with (slapi_sdn_get_size - sizeof(Slapi_DN)).
. slapi_entry_size counted Slapi_RDN twice.
. slapi_entry_size did not count the size of e_virtual_lock, e_aux_attrs
and e_extension.
https://fedorahosted.org/389/ticket/47677
Reviewed by rmeggins(a)redhat.com (Thank you, Rich!!)
(cherry picked from commit b1e4cdf5131a1730c9d3674b19d0e2a0670286e7)
(cherry picked from commit 7b0842923c54333bc14539d72e999cbe30814386)
diff --git a/ldap/servers/slapd/dn.c b/ldap/servers/slapd/dn.c
index 1eab631..e48275e 100644
--- a/ldap/servers/slapd/dn.c
+++ b/ldap/servers/slapd/dn.c
@@ -2712,18 +2712,22 @@ sdn_dump( const Slapi_DN *sdn, const char *text)
size_t
slapi_sdn_get_size(const Slapi_DN *sdn)
{
- size_t sz = sizeof(Slapi_DN);
+ size_t sz = 0;
/* slapi_sdn_get_ndn_len returns the normalized dn length
* if dn or ndn exists. If both does not exist, it
* normalizes udn and set it to dn and returns the length.
*/
- sz += slapi_sdn_get_ndn_len(sdn);
+ if (NULL == sdn) {
+ return sz;
+ }
+ sz += slapi_sdn_get_ndn_len(sdn) + 1 /* '\0' */;
if (sdn->dn && sdn->ndn) {
- sz += slapi_sdn_get_ndn_len(sdn);
+ sz *= 2;
}
if (sdn->udn) {
sz += strlen(sdn->udn) + 1;
}
+ sz += sizeof(Slapi_DN);
return sz;
}
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c
index 36f57e9..40a5ed8 100644
--- a/ldap/servers/slapd/entry.c
+++ b/ldap/servers/slapd/entry.c
@@ -79,8 +79,9 @@ struct attrs_in_extension attrs_in_extension[] =
{PSEUDO_ATTR_UNHASHEDUSERPASSWORD,
slapi_pw_get_entry_ext,
slapi_pw_set_entry_ext,
- pw_copy_entry_ext},
- {NULL, NULL, NULL}
+ pw_copy_entry_ext,
+ pw_get_ext_size},
+ {NULL, NULL, NULL, NULL, NULL}
};
/*
@@ -1997,40 +1998,38 @@ static size_t slapi_attrlist_size(Slapi_Attr *attrs)
return size;
}
-static size_t slapi_dn_size(Slapi_DN *sdn)
-{
- size_t size = 0;
-
- if (sdn == NULL) return 0;
-
- if (slapi_sdn_get_dn(sdn)) {
- size += slapi_sdn_get_ndn_len(sdn) + 1;
- }
- if (slapi_sdn_get_ndn(sdn)) {
- size += slapi_sdn_get_ndn_len(sdn) + 1;
- }
-
- return size;
-}
-
/* return the approximate size of an entry --
* useful for checking cache sizes, etc
*/
size_t
slapi_entry_size(Slapi_Entry *e)
{
- u_long size = 0;
-
- /* doesn't include memory used by e_extension */
+ size_t size = 0;
if (e->e_uniqueid) size += strlen(e->e_uniqueid) + 1;
if (e->e_dncsnset) size += csnset_size(e->e_dncsnset);
if (e->e_maxcsn) size += sizeof( CSN );
- size += slapi_dn_size(&e->e_sdn);
- size += slapi_rdn_get_size(&e->e_srdn);
+ if (e->e_virtual_lock) size += sizeof(Slapi_RWLock);
+ /* Slapi_DN and RDN are included in Slapi_Entry */
+ size += (slapi_sdn_get_size(&e->e_sdn) - sizeof(Slapi_DN));
+ size += (slapi_rdn_get_size(&e->e_srdn) - sizeof(Slapi_RDN));
size += slapi_attrlist_size(e->e_attrs);
- if (e->e_deleted_attrs) size += slapi_attrlist_size(e->e_deleted_attrs);
- if (e->e_virtual_attrs) size += slapi_attrlist_size(e->e_virtual_attrs);
+ size += slapi_attrlist_size(e->e_deleted_attrs);
+ size += slapi_attrlist_size(e->e_virtual_attrs);
+ size += slapi_attrlist_size(e->e_aux_attrs);
+ if (e->e_extension) {
+ struct attrs_in_extension *aiep;
+ int cnt;
+ size_t extsiz = 0;
+ for (aiep = attrs_in_extension, cnt = 0;
+ aiep && aiep->ext_type; aiep++, cnt++) {
+
+ if (LDAP_SUCCESS == aiep->ext_get_size(e, &extsiz)) {
+ size += extsiz;
+ }
+ }
+ size += cnt * sizeof(void *);
+ }
size += sizeof(Slapi_Entry);
return size;
diff --git a/ldap/servers/slapd/pw.c b/ldap/servers/slapd/pw.c
index 28302b0..94ececb 100644
--- a/ldap/servers/slapd/pw.c
+++ b/ldap/servers/slapd/pw.c
@@ -2682,3 +2682,28 @@ slapi_get_first_clear_text_pw(Slapi_Entry *entry)
slapi_rwlock_unlock(extp->pw_entry_lock);
return slapi_ch_strdup(password_str); /* slapi_ch_strdup(NULL) is okay */
}
+
+int
+pw_get_ext_size(Slapi_Entry *entry, size_t *size)
+{
+ Slapi_Value **pw_entry_values;
+
+ if (NULL == size) {
+ return LDAP_PARAM_ERROR;
+ }
+ *size = 0;
+ if (NULL == entry->e_extension) {
+ return LDAP_SUCCESS;
+ }
+ *size += sizeof(struct slapi_pw_entry_ext);
+ *size += sizeof(Slapi_RWLock);
+ if (LDAP_SUCCESS == slapi_pw_get_entry_ext(entry, &pw_entry_values)) {
+ Slapi_Value *cvalue;
+ int idx = valuearray_first_value(pw_entry_values, &cvalue);
+ while (idx >= 0) {
+ *size += value_size(cvalue);
+ idx = valuearray_next_value(pw_entry_values, idx, &cvalue);
+ }
+ }
+ return LDAP_SUCCESS;
+}
diff --git a/ldap/servers/slapd/slap.h b/ldap/servers/slapd/slap.h
index ddf8fc8..b88bf99 100644
--- a/ldap/servers/slapd/slap.h
+++ b/ldap/servers/slapd/slap.h
@@ -670,6 +670,7 @@ struct attrs_in_extension {
IFP ext_get;
IFP ext_set;
IFP ext_copy;
+ IFP ext_get_size;
};
extern struct attrs_in_extension attrs_in_extension[];
diff --git a/ldap/servers/slapd/slapi-private.h b/ldap/servers/slapd/slapi-private.h
index eaa5f98..306d3af 100644
--- a/ldap/servers/slapd/slapi-private.h
+++ b/ldap/servers/slapd/slapi-private.h
@@ -1270,6 +1270,7 @@ int slapi_add_internal_attr_syntax( const char *name, const char
*oid, const cha
/* pw.c */
void pw_exp_init ( void );
int pw_copy_entry_ext(Slapi_Entry *src_e, Slapi_Entry *dest_e);
+int pw_get_ext_size(Slapi_Entry *e, size_t *size);
/* op_shared.c */
void modify_update_last_modified_attr(Slapi_PBlock *pb, Slapi_Mods *smods);
diff --git a/ldap/servers/slapd/valueset.c b/ldap/servers/slapd/valueset.c
index 8a4bd03..65086dd 100644
--- a/ldap/servers/slapd/valueset.c
+++ b/ldap/servers/slapd/valueset.c
@@ -511,11 +511,11 @@ valuearray_size(Slapi_Value **va)
if(va!=NULL && va[0]!=NULL)
{
int i;
- for (i = 0; va[i]; i++)
+ for (i = 0; va[i]; i++)
{
s += value_size(va[i]);
}
- s += (i + 1) * sizeof(Slapi_Value*);
+ s += (i + 1) * sizeof(Slapi_Value*);
}
return s;
}
@@ -837,10 +837,9 @@ valueset_get_valuearray(const Slapi_ValueSet *vs)
size_t
valueset_size(const Slapi_ValueSet *vs)
{
- size_t s= 0;
- if(!valuearray_isempty(vs->va))
- {
- s= valuearray_size(vs->va);
+ size_t s = 0;
+ if (vs && !valuearray_isempty(vs->va)) {
+ s = valuearray_size(vs->va);
}
return s;
}