Untested patch: back-tcl used wrong types (ITS#1719) ================ Written by Hallvard B. Furuseth and placed into the public domain. This software is not subject to any license of the University of Oslo. ================ This patch is untested (except for compiling it); a compiler bug prevented me from compiling it completely. back-tcl is outdated: - It expected be->be_suffix to be a char**, not a struct berval**. - It expected the string arguments to the tcl_back_*() routines to be const char*, not struct berval. - tcl_back_compare() expected an Ava* instead of AttributeAssertion*. - tcl_back_modify() expected an LDAPModList* instead of Modifications*. - tcl_back_modrdn() expected too few arguments. - And finally, back-tcl did printf(%ld, ber_int_t) instead of printf(%ld, (long) ber_int_t). Note: This patch merely ignores the two new arguments nnewrdn and nnewSuperior to tcl_back_modrdn(), because that's what back-perl does. I have no idea what these arguments do. Whoever invented them should have a look at tcl_modrdn.c. (And maybe back-perl/modrdn.c too.) Hallvard B. Furuseth , April 2002. diff -u2 -r servers/slapd/back-tcl/tcl_back.h~ servers/slapd/back-tcl/tcl_back.h --- servers/slapd/back-tcl/tcl_back.h~ Mon Dec 31 11:35:56 2001 +++ servers/slapd/back-tcl/tcl_back.h Wed Apr 3 08:52:51 2002 @@ -45,4 +45,5 @@ void readtclscript (char *script, Tcl_Interp * my_tcl); char *tcl_clean_entry (Entry * e); +char *tcl_merge_bvlist (struct berval **bvlist); int tcl_ldap_debug ( diff -u2 -r servers/slapd/back-tcl/tcl_abandon.c~ servers/slapd/back-tcl/tcl_abandon.c --- servers/slapd/back-tcl/tcl_abandon.c~ Wed Sep 8 19:06:40 1999 +++ servers/slapd/back-tcl/tcl_abandon.c Wed Apr 3 08:52:24 2002 @@ -25,6 +25,6 @@ ) { - char *suf_tcl, *results, *command; - int i, code, err = 0; + char *suf_tcl, *results, *command, **strlist; + int code, err = 0; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -33,11 +33,10 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); command = (char *) ch_malloc (strlen (ti->ti_abandon) + strlen (suf_tcl) + 20); sprintf (command, "%s ABANDON {%ld} {%s}", - ti->ti_abandon, op->o_msgid, suf_tcl); + ti->ti_abandon, (long) op->o_msgid, suf_tcl); Tcl_Free (suf_tcl); diff -u2 -r servers/slapd/back-tcl/tcl_add.c~ servers/slapd/back-tcl/tcl_add.c --- servers/slapd/back-tcl/tcl_add.c~ Wed Sep 8 19:06:40 1999 +++ servers/slapd/back-tcl/tcl_add.c Wed Apr 3 08:50:18 2002 @@ -25,6 +25,6 @@ ) { - char *command, *suf_tcl, *entrystr, *results; - int i, code, err = 0; + char *command, *suf_tcl, *entrystr, *results, **strlist; + int code, err = 0; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -35,6 +35,5 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); entrystr = tcl_clean_entry (e); @@ -44,5 +43,5 @@ strlen (entrystr) + 32); sprintf (command, "%s ADD {%ld} {%s} {%s}", - ti->ti_add, op->o_msgid, suf_tcl, entrystr); + ti->ti_add, (long) op->o_msgid, suf_tcl, entrystr); Tcl_Free (suf_tcl); free (entrystr); diff -u2 -r servers/slapd/back-tcl/tcl_bind.c~ servers/slapd/back-tcl/tcl_bind.c --- servers/slapd/back-tcl/tcl_bind.c~ Wed Dec 26 11:41:41 2001 +++ servers/slapd/back-tcl/tcl_bind.c Wed Apr 3 08:50:42 2002 @@ -29,6 +29,6 @@ ) { - char *command, *suf_tcl, *results; - int i, code, err = 0; + char *command, *suf_tcl, *results, **strlist; + int code, err = 0; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -39,6 +39,5 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); command = (char *) ch_malloc (strlen (ti->ti_bind) + strlen @@ -46,6 +45,6 @@ dn->bv_len + cred->bv_len + 64); sprintf (command, "%s BIND {%ld} {%s} {%s} {%d} {%lu} {%s}", - ti->ti_bind, op->o_msgid, suf_tcl, dn->bv_val, method, cred->bv_len, - cred->bv_val); + ti->ti_bind, (long) op->o_msgid, suf_tcl, dn->bv_val, + method, cred->bv_len, cred->bv_val); Tcl_Free (suf_tcl); diff -u2 -r servers/slapd/back-tcl/tcl_compare.c~ servers/slapd/back-tcl/tcl_compare.c --- servers/slapd/back-tcl/tcl_compare.c~ Mon May 22 03:59:32 2000 +++ servers/slapd/back-tcl/tcl_compare.c Wed Apr 3 08:50:55 2002 @@ -22,11 +22,11 @@ Connection * conn, Operation * op, - const char *dn, - const char *ndn, - Ava * ava + struct berval *dn, + struct berval *ndn, + AttributeAssertion * ava ) { - char *command, *suf_tcl, *results; - int i, code, err = 0; + char *command, *suf_tcl, *results, **strlist; + int code, err = 0; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -37,13 +37,12 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); command = (char *) ch_malloc (strlen (ti->ti_compare) + - strlen (suf_tcl) + strlen (dn) + strlen (ava->ava_type) + - strlen (ava->ava_value.bv_val) + 64); + strlen (suf_tcl) + dn->bv_len + ava->aa_desc->ad_cname.bv_len + + strlen (ava->aa_value.bv_val) + 64); sprintf (command, "%s COMPARE {%ld} {%s} {%s} {%s: %s}", - ti->ti_compare, op->o_msgid, suf_tcl, dn, ava->ava_type, - ava->ava_value.bv_val); + ti->ti_compare, (long) op->o_msgid, suf_tcl, dn->bv_val, + ava->aa_desc->ad_cname.bv_val, ava->aa_value.bv_val); Tcl_Free (suf_tcl); diff -u2 -r servers/slapd/back-tcl/tcl_delete.c~ servers/slapd/back-tcl/tcl_delete.c --- servers/slapd/back-tcl/tcl_delete.c~ Mon May 22 03:59:32 2000 +++ servers/slapd/back-tcl/tcl_delete.c Wed Apr 3 08:51:20 2002 @@ -21,10 +21,10 @@ Connection * conn, Operation * op, - const char *dn, - const char *ndn + struct berval *dn, + struct berval *ndn ) { - char *command, *suf_tcl, *results; - int i, code, err = 0; + char *command, *suf_tcl, *results, **strlist; + int code, err = 0; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -35,11 +35,10 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); command = (char *) ch_malloc (strlen (ti->ti_delete) + strlen (suf_tcl) - + strlen (dn) + 64); + + dn->bv_len + 64); sprintf (command, "%s DELETE {%ld} {%s} {%s}", - ti->ti_delete, op->o_msgid, suf_tcl, dn); + ti->ti_delete, (long) op->o_msgid, suf_tcl, dn->bv_val); Tcl_Free (suf_tcl); diff -u2 -r servers/slapd/back-tcl/tcl_modify.c~ servers/slapd/back-tcl/tcl_modify.c --- servers/slapd/back-tcl/tcl_modify.c~ Mon May 22 03:59:32 2000 +++ servers/slapd/back-tcl/tcl_modify.c Wed Apr 3 08:51:28 2002 @@ -22,10 +22,10 @@ Connection * conn, Operation * op, - const char *dn, - const char *ndn, - LDAPModList * modlist + struct berval *dn, + struct berval *ndn, + Modifications * modlist ) { - char *command, *suf_tcl, *bp, *tcl_mods, *results; + char *command, *suf_tcl, *bp, *tcl_mods, *results, **strlist; int i, code, err = 0, len, bsize; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -37,6 +37,5 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); tcl_mods = (char *) ch_malloc (BUFSIZ); @@ -45,9 +44,9 @@ bp = tcl_mods; - for (; modlist != NULL; modlist = modlist->ml_next) { - LDAPMod *mods = &modlist->ml_mod; + for (; modlist != NULL; modlist = modlist->sml_next) { + Modification *mods = &modlist->sml_mod; char *op = NULL; - switch (mods->mod_op & ~LDAP_MOD_BVALUES) { + switch (mods->sm_op & ~LDAP_MOD_BVALUES) { case LDAP_MOD_ADD: op = "add"; @@ -61,25 +60,25 @@ } - len = strlen (mods->mod_type) + strlen (op) + 7; + len = mods->sm_type.bv_len + strlen (op) + 7; while (bp + len - tcl_mods > bsize) { bsize += BUFSIZ; tcl_mods = (char *) ch_realloc (tcl_mods, bsize); } - sprintf (bp, "{ {%s: %s} ", op, mods->mod_type); + sprintf (bp, "{ {%s: %s} ", op, mods->sm_type.bv_val); bp += len; for (i = 0; - mods->mod_bvalues != NULL && mods->mod_bvalues[i] + mods->sm_bvalues != NULL && mods->sm_bvalues[i].bv_val != NULL; i++) { - len = strlen (mods->mod_type) + strlen ( - mods->mod_bvalues[i]->bv_val) + 5 + - (mods->mod_bvalues[i + 1] == NULL ? 2 : 0); + len = mods->sm_type.bv_len + + mods->sm_bvalues[i].bv_len + 5 + + (mods->sm_bvalues[i + 1].bv_val == NULL ? 2 : 0); while (bp + len - tcl_mods > bsize) { bsize += BUFSIZ; tcl_mods = (char *) ch_realloc (tcl_mods, bsize); } - sprintf (bp, "{%s: %s} %s", mods->mod_type, - mods->mod_bvalues[i]->bv_val, - mods->mod_bvalues[i + 1] == + sprintf (bp, "{%s: %s} %s", mods->sm_type.bv_val, + mods->sm_bvalues[i].bv_val, + mods->sm_bvalues[i + 1].bv_val == NULL ? "} " : ""); bp += len; @@ -88,8 +87,8 @@ command = (char *) ch_malloc (strlen (ti->ti_modify) + strlen (suf_tcl) - + strlen (dn) + strlen (tcl_mods) + 64); + + dn->bv_len + strlen (tcl_mods) + 64); /* This space is simply for aesthetics--\ */ sprintf (command, "%s MODIFY {%ld} {%s} {%s} { %s}", - ti->ti_modify, op->o_msgid, suf_tcl, dn, tcl_mods); + ti->ti_modify, (long) op->o_msgid, suf_tcl, dn->bv_val, tcl_mods); Tcl_Free (suf_tcl); free (tcl_mods); diff -u2 -r servers/slapd/back-tcl/tcl_modrdn.c~ servers/slapd/back-tcl/tcl_modrdn.c --- servers/slapd/back-tcl/tcl_modrdn.c~ Mon May 22 03:59:32 2000 +++ servers/slapd/back-tcl/tcl_modrdn.c Wed Apr 3 08:51:46 2002 @@ -35,13 +35,15 @@ Connection * conn, Operation * op, - const char *dn, - const char *ndn, - const char *newrdn, + struct berval *dn, + struct berval *ndn, + struct berval *newrdn, + struct berval *nnewrdn, int deleteoldrdn, - const char *newSuperior + struct berval *newSuperior, + struct berval *nnewSuperior ) { - char *command, *suf_tcl, *results; - int i, code, err = 0; + char *command, *suf_tcl, *results, **strlist; + int code, err = 0; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -52,18 +54,17 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); command = (char *) ch_malloc (strlen (ti->ti_modrdn) + strlen (suf_tcl) - + strlen (dn) + strlen (newrdn) - + (newSuperior ? strlen(newSuperior) : 0) + 64); + + dn->bv_len + newrdn->bv_len + + (newSuperior ? newSuperior->bv_len : 0) + 64); if ( newSuperior ) { sprintf (command, "%s MODRDN {%ld} {%s} {%s} {%s} %d {%s}", - ti->ti_add, op->o_msgid, suf_tcl, dn, newrdn, - deleteoldrdn ? 1 : 0, newSuperior ); + ti->ti_add, (long) op->o_msgid, suf_tcl, dn->bv_val, + newrdn->bv_val, deleteoldrdn ? 1 : 0, newSuperior->bv_val ); } else { sprintf (command, "%s MODRDN {%ld} {%s} {%s} {%s} %d", - ti->ti_add, op->o_msgid, suf_tcl, dn, newrdn, - deleteoldrdn ? 1 : 0 ); + ti->ti_add, (long) op->o_msgid, suf_tcl, dn->bv_val, + newrdn->bv_val, deleteoldrdn ? 1 : 0 ); } Tcl_Free (suf_tcl); diff -u2 -r servers/slapd/back-tcl/tcl_search.c~ servers/slapd/back-tcl/tcl_search.c --- servers/slapd/back-tcl/tcl_search.c~ Thu Jan 3 05:41:51 2002 +++ servers/slapd/back-tcl/tcl_search.c Wed Apr 3 08:51:54 2002 @@ -22,6 +22,6 @@ Connection * conn, Operation * op, - const char *base, - const char *nbase, + struct berval *base, + struct berval *nbase, int scope, int deref, @@ -29,10 +29,10 @@ int timelimit, Filter * filter, - const char *filterstr, + struct berval *filterstr, AttributeName *attrs, int attrsonly ) { - char *attrs_tcl = NULL, *suf_tcl, *results, *command; + char *attrs_tcl = NULL, *suf_tcl, *results, *command, **strlist; int i, err = 0, code; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -57,15 +57,14 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); command = (char *) ch_malloc (strlen (ti->ti_search) + strlen (suf_tcl) - + strlen (base) + 40 + strlen (filterstr) + (attrs_tcl == + + base->bv_len + 40 + filterstr->bv_len + (attrs_tcl == NULL ? 5 : strlen (attrs_tcl)) + 72); sprintf (command, "%s SEARCH {%ld} {%s} {%s} {%d} {%d} {%d} {%d} {%s} {%d} {%s}", - ti->ti_search, op->o_msgid, suf_tcl, base, scope, deref, - sizelimit, timelimit, filterstr, attrsonly ? 1 : 0, + ti->ti_search, (long) op->o_msgid, suf_tcl, base->bv_val, scope, deref, + sizelimit, timelimit, filterstr->bv_val, attrsonly ? 1 : 0, attrs_tcl == NULL ? "{all}" : attrs_tcl); diff -u2 -r servers/slapd/back-tcl/tcl_unbind.c~ servers/slapd/back-tcl/tcl_unbind.c --- servers/slapd/back-tcl/tcl_unbind.c~ Wed Sep 8 19:06:40 1999 +++ servers/slapd/back-tcl/tcl_unbind.c Wed Apr 3 08:52:10 2002 @@ -24,6 +24,6 @@ ) { - char *command, *suf_tcl, *results; - int i, code, err = 0; + char *command, *suf_tcl, *results, **strlist; + int code, err = 0; struct tclinfo *ti = (struct tclinfo *) be->be_private; @@ -32,11 +32,10 @@ } - for (i = 0; be->be_suffix[i] != NULL; i++); - suf_tcl = Tcl_Merge (i, be->be_suffix); + suf_tcl = tcl_merge_bvlist (be->be_suffix); command = (char *) ch_malloc (strlen (ti->ti_unbind) + strlen (suf_tcl) + strlen (conn->c_dn ? conn->c_dn : "") + 64); sprintf (command, "%s UNBIND {%ld} {%s} {%s}", - ti->ti_unbind, op->o_msgid, suf_tcl, conn->c_dn ? + ti->ti_unbind, (long) op->o_msgid, suf_tcl, conn->c_dn ? conn->c_dn : ""); Tcl_Free (suf_tcl); diff -u2 -r servers/slapd/back-tcl/tcl_util.c~ servers/slapd/back-tcl/tcl_util.c --- servers/slapd/back-tcl/tcl_util.c~ Mon Dec 31 11:35:57 2001 +++ servers/slapd/back-tcl/tcl_util.c Wed Apr 3 09:01:55 2002 @@ -189,2 +189,22 @@ } } + + +char * +tcl_merge_bvlist( + struct berval **bvlist) +{ + char *ret, **strlist; + int i; + + if (bvlist == NULL) + return NULL; + for (i = 0; bvlist[i++] != NULL; ) ; + strlist = ch_malloc (i * sizeof(char *)); + for (i = 0; bvlist[i] != NULL; i++) + strlist[i] = bvlist[i]->bv_val; + strlist[i] = NULL; + ret = Tcl_Merge (i, strlist); + ch_free (strlist); + return ret; +}