]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/entry-id.c
Add a safety check to bvcasechr
[openldap] / servers / slapd / back-sql / entry-id.c
index e75ded38ffd7dca549b0ca02b073f72f08621811..73086850f458dfbbb137f956f1bd669028236f6b 100644 (file)
@@ -34,18 +34,59 @@ backsql_entryID* backsql_dn2id(backsql_info *bi,backsql_entryID *id,SQLHDBC dbh,
 {
  SQLHSTMT sth; 
  BACKSQL_ROW_NTS row;
- //SQLINTEGER nrows=0;
+ /*SQLINTEGER nrows=0;*/
  RETCODE rc;
 
+ /* TimesTen */
+ char upperdn[BACKSQL_MAX_DN_LEN+1];
+ char* toBind;
+ int i, j, k;
+
  Debug(LDAP_DEBUG_TRACE,"==>backsql_dn2id(): dn='%s'\n",dn,0,0);
- backsql_Prepare(dbh,&sth,bi->id_query,0);
- if ((rc=backsql_BindParamStr(sth,1,dn,BACKSQL_MAX_DN_LEN)) != SQL_SUCCESS)
-  {
+ /* begin TimesTen */
+ Debug(LDAP_DEBUG_TRACE, "id_query '%s'\n", bi->id_query, 0, 0);
+ rc = backsql_Prepare(dbh,&sth,bi->id_query,0);
+ if (rc != SQL_SUCCESS) {
+   Debug(LDAP_DEBUG_TRACE, "backsql_dn2id(): error preparing SQL:\n", 0, 0, 0);
+   Debug(LDAP_DEBUG_TRACE, "%s\n", bi->id_query, 0, 0);
+   backsql_PrintErrors(SQL_NULL_HENV, dbh, sth, rc);
+   SQLFreeStmt(sth, SQL_DROP);
+   return NULL;
+ }
+
+ if (bi->has_ldapinfo_dn_ru) {
+   /* Prepare an upper cased, byte reversed version that can be
+      searched using indexes */
+
+   for ((i=0, j=strlen(dn)-1); *(dn+i); (i++, j--)) {
+     *(upperdn+i) = toupper(*(dn+j));
+   }   
+   *(upperdn+i) = '\0';
+   Debug(LDAP_DEBUG_TRACE,"==>backsql_dn2id(): upperdn='%s'\n",upperdn,0,0);
+   toBind = upperdn;
+ }
+ else {
+   if (bi->isTimesTen) {
+     for (i = 0; *(dn+i); i++) {
+       *(upperdn+i) = toupper(*(dn+i)); /* Copy while upper casing */
+     }
+     *(upperdn+i) = '\0';
+     Debug(LDAP_DEBUG_TRACE,"==>backsql_dn2id(): upperdn='%s'\n",upperdn,0,0);
+     toBind = upperdn;
+   }
+   else
+     toBind = dn;
+ }
+
+ if ((rc=backsql_BindParamStr(sth,1,toBind,
+                  BACKSQL_MAX_DN_LEN)) != SQL_SUCCESS)
+ /* end TimesTen*/
+ {
    Debug(LDAP_DEBUG_TRACE,"backsql_dn2id(): error binding dn parameter:\n",0,0,0);
    backsql_PrintErrors(SQL_NULL_HENV,dbh,sth,rc);
    SQLFreeStmt(sth,SQL_DROP);
    return NULL;
 }
+ }
  
  if ((rc=SQLExecute(sth)) != SQL_SUCCESS)
   {
@@ -121,10 +162,11 @@ int backsql_get_attr_vals(backsql_at_map_rec *at,backsql_srch_info *bsi)
       {
        backsql_entry_addattr(bsi->e,row.col_names[i],row.cols[i],/*row.col_prec[i]*/
                                        strlen(row.cols[i]));
-//       Debug(LDAP_DEBUG_TRACE,"prec=%d\n",(int)row.col_prec[i],0,0);
+/*       Debug(LDAP_DEBUG_TRACE,"prec=%d\n",(int)row.col_prec[i],0,0);*/
       }
-    // else
-    //  Debug(LDAP_DEBUG_TRACE,"NULL value in this row for attribute '%s'\n",row.col_names[i],0,0);
+    /* else
+      Debug(LDAP_DEBUG_TRACE,"NULL value in this row for attribute '%s'\n",row.col_names[i],0,0);
+*/
     }
   }
  backsql_FreeRow(&row);
@@ -147,7 +189,7 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* eid)
  e->e_attrs=NULL;
  e->e_private=NULL;
  
-// if (bsi->base_dn != NULL)???
+/* if (bsi->base_dn != NULL)???*/
 
  e->e_id=eid->id;
  e->e_dn=ch_strdup(bsi->c_eid->dn);
@@ -160,7 +202,7 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* eid)
   {
    if (!strcasecmp(*c_at_name,"objectclass") || !strcasecmp(*c_at_name,"0.10"))
    {
-       //backsql_entry_addattr(bsi->e,"objectclass",bsi->oc->name,strlen(bsi->oc->name));
+       /*backsql_entry_addattr(bsi->e,"objectclass",bsi->oc->name,strlen(bsi->oc->name));*/
     continue;
    }
    at=backsql_at_with_name(bsi->oc,*c_at_name);