]> git.sur5r.net Git - openldap/blob - servers/slapd/slapi/slapi_pblock.c
Do not return pointers into BerElement we do not own
[openldap] / servers / slapd / slapi / slapi_pblock.c
1 /*
2  * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5 /*
6  * (C) Copyright IBM Corp. 1997,2002
7  * Redistribution and use in source and binary forms are permitted
8  * provided that this notice is preserved and that due credit is 
9  * given to IBM Corporation. This software is provided ``as is'' 
10  * without express or implied warranty.
11  */
12
13 #include "portable.h"
14 #include <slap.h>
15 #include <slapi.h>
16
17 static int 
18 isOkNetscapeParam( int param ) 
19 {
20         switch ( param ) {
21         case SLAPI_BACKEND:
22         case SLAPI_CONNECTION:
23         case SLAPI_OPERATION:
24         case SLAPI_OPERATION_PARAMETERS:
25         case SLAPI_OPERATION_TYPE:
26         case SLAPI_OPERATION_ID:
27         case SLAPI_OPERATION_AUTHTYPE:
28         case SLAPI_REQUESTOR_ISROOT:
29         case SLAPI_BE_MONITORDN:
30         case SLAPI_BE_TYPE:
31         case SLAPI_BE_READONLY:
32         case SLAPI_BE_LASTMOD:
33         case SLAPI_CONN_ID:
34         case SLAPI_OPINITIATED_TIME:
35         case SLAPI_REQUESTOR_DN:
36         case SLAPI_REQUESTOR_ISUPDATEDN:
37         case SLAPI_CONN_DN:
38         case SLAPI_CONN_CLIENTIP:
39         case SLAPI_CONN_SERVERIP:
40         case SLAPI_CONN_AUTHTYPE:
41         case SLAPI_CONN_AUTHMETHOD:
42         case SLAPI_CONN_CERT:
43         case SLAPI_X_CONN_IS_UDP:
44         case SLAPI_X_CONN_CLIENTPATH:
45         case SLAPI_X_CONN_SERVERPATH:
46         case SLAPI_IBM_CONN_DN_ALT:
47         case SLAPI_IBM_CONN_DN_ORIG:
48         case SLAPI_IBM_GSSAPI_CONTEXT:
49         case SLAPI_PLUGIN:
50         case SLAPI_PLUGIN_PRIVATE:
51         case SLAPI_PLUGIN_TYPE:
52         case SLAPI_PLUGIN_ARGV:
53         case SLAPI_PLUGIN_ARGC:
54         case SLAPI_PLUGIN_VERSION:
55         case SLAPI_PLUGIN_OPRETURN:
56         case SLAPI_PLUGIN_OBJECT:
57         case SLAPI_PLUGIN_DESTROY_FN:
58         case SLAPI_PLUGIN_DESCRIPTION:
59         case SLAPI_PLUGIN_INTOP_RESULT:
60         case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES:
61         case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS:
62         case SLAPI_PLUGIN_DB_BIND_FN:
63         case SLAPI_PLUGIN_DB_UNBIND_FN:
64         case SLAPI_PLUGIN_DB_SEARCH_FN:
65         case SLAPI_PLUGIN_DB_COMPARE_FN:
66         case SLAPI_PLUGIN_DB_MODIFY_FN:
67         case SLAPI_PLUGIN_DB_MODRDN_FN:
68         case SLAPI_PLUGIN_DB_ADD_FN:
69         case SLAPI_PLUGIN_DB_DELETE_FN:
70         case SLAPI_PLUGIN_DB_ABANDON_FN:
71         case SLAPI_PLUGIN_DB_CONFIG_FN:
72         case SLAPI_PLUGIN_CLOSE_FN:
73         case SLAPI_PLUGIN_DB_FLUSH_FN:
74         case SLAPI_PLUGIN_START_FN:
75         case SLAPI_PLUGIN_DB_SEQ_FN:
76         case SLAPI_PLUGIN_DB_ENTRY_FN:
77         case SLAPI_PLUGIN_DB_REFERRAL_FN:
78         case SLAPI_PLUGIN_DB_RESULT_FN:
79         case SLAPI_PLUGIN_DB_LDIF2DB_FN:
80         case SLAPI_PLUGIN_DB_DB2LDIF_FN:
81         case SLAPI_PLUGIN_DB_BEGIN_FN:
82         case SLAPI_PLUGIN_DB_COMMIT_FN:
83         case SLAPI_PLUGIN_DB_ABORT_FN:
84         case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
85         case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
86         case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
87         case SLAPI_PLUGIN_DB_FREE_RESULT_SET_FN:
88         case SLAPI_PLUGIN_DB_SIZE_FN:
89         case SLAPI_PLUGIN_DB_TEST_FN:
90         case SLAPI_PLUGIN_DB_NO_ACL:
91         case SLAPI_PLUGIN_EXT_OP_FN:
92         case SLAPI_PLUGIN_EXT_OP_OIDLIST:
93         case SLAPI_PLUGIN_PRE_BIND_FN:
94         case SLAPI_PLUGIN_PRE_UNBIND_FN:
95         case SLAPI_PLUGIN_PRE_SEARCH_FN:
96         case SLAPI_PLUGIN_PRE_COMPARE_FN:
97         case SLAPI_PLUGIN_PRE_MODIFY_FN:
98         case SLAPI_PLUGIN_PRE_MODRDN_FN:
99         case SLAPI_PLUGIN_PRE_ADD_FN:
100         case SLAPI_PLUGIN_PRE_DELETE_FN:
101         case SLAPI_PLUGIN_PRE_ABANDON_FN:
102         case SLAPI_PLUGIN_PRE_ENTRY_FN:
103         case SLAPI_PLUGIN_PRE_REFERRAL_FN:
104         case SLAPI_PLUGIN_PRE_RESULT_FN:
105         case SLAPI_PLUGIN_POST_BIND_FN:
106         case SLAPI_PLUGIN_POST_UNBIND_FN:
107         case SLAPI_PLUGIN_POST_SEARCH_FN:
108         case SLAPI_PLUGIN_POST_COMPARE_FN:
109         case SLAPI_PLUGIN_POST_MODIFY_FN:
110         case SLAPI_PLUGIN_POST_MODRDN_FN:
111         case SLAPI_PLUGIN_POST_ADD_FN:
112         case SLAPI_PLUGIN_POST_DELETE_FN:
113         case SLAPI_PLUGIN_POST_ABANDON_FN:
114         case SLAPI_PLUGIN_POST_ENTRY_FN:
115         case SLAPI_PLUGIN_POST_REFERRAL_FN:
116         case SLAPI_PLUGIN_POST_RESULT_FN:
117         case SLAPI_PLUGIN_MR_FILTER_CREATE_FN:
118         case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN:
119         case SLAPI_PLUGIN_MR_FILTER_MATCH_FN:
120         case SLAPI_PLUGIN_MR_FILTER_INDEX_FN:
121         case SLAPI_PLUGIN_MR_FILTER_RESET_FN:
122         case SLAPI_PLUGIN_MR_INDEX_FN:
123         case SLAPI_PLUGIN_MR_OID:
124         case SLAPI_PLUGIN_MR_TYPE:
125         case SLAPI_PLUGIN_MR_VALUE:
126         case SLAPI_PLUGIN_MR_VALUES:
127         case SLAPI_PLUGIN_MR_KEYS:
128         case SLAPI_PLUGIN_MR_FILTER_REUSABLE:
129         case SLAPI_PLUGIN_MR_QUERY_OPERATOR:
130         case SLAPI_PLUGIN_MR_USAGE:
131         case SLAPI_OP_LESS:
132         case SLAPI_OP_LESS_OR_EQUAL:
133         case SLAPI_PLUGIN_MR_USAGE_INDEX:
134         case SLAPI_PLUGIN_SYNTAX_FILTER_AVA:
135         case SLAPI_PLUGIN_SYNTAX_FILTER_SUB:
136         case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS:
137         case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA:
138         case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB:
139         case SLAPI_PLUGIN_SYNTAX_NAMES:
140         case SLAPI_PLUGIN_SYNTAX_OID:
141         case SLAPI_PLUGIN_SYNTAX_FLAGS:
142         case SLAPI_PLUGIN_SYNTAX_COMPARE:
143         case SLAPI_MANAGEDSAIT:
144         case SLAPI_CONFIG_FILENAME:
145         case SLAPI_CONFIG_LINENO:
146         case SLAPI_CONFIG_ARGC:
147         case SLAPI_CONFIG_ARGV:
148         case SLAPI_TARGET_DN:
149         case SLAPI_REQCONTROLS:
150         case SLAPI_ENTRY_PRE_OP:
151         case SLAPI_ENTRY_POST_OP:
152         case SLAPI_RESCONTROLS:
153         case SLAPI_ADD_RESCONTROL:
154         case SLAPI_ADD_ENTRY:
155         case SLAPI_BIND_METHOD:
156         case SLAPI_BIND_CREDENTIALS:
157         case SLAPI_BIND_SASLMECHANISM:
158         case SLAPI_BIND_RET_SASLCREDS:
159         case SLAPI_COMPARE_TYPE:
160         case SLAPI_COMPARE_VALUE:
161         case SLAPI_MODIFY_MODS:
162         case SLAPI_MODRDN_NEWRDN:
163         case SLAPI_MODRDN_DELOLDRDN:
164         case SLAPI_MODRDN_NEWSUPERIOR:
165         case SLAPI_SEARCH_SCOPE:
166         case SLAPI_SEARCH_DEREF:
167         case SLAPI_SEARCH_SIZELIMIT:
168         case SLAPI_SEARCH_TIMELIMIT:
169         case SLAPI_SEARCH_FILTER:
170         case SLAPI_SEARCH_STRFILTER:
171         case SLAPI_SEARCH_ATTRS:
172         case SLAPI_SEARCH_ATTRSONLY:
173         case SLAPI_ABANDON_MSGID:
174         case SLAPI_SEQ_TYPE:
175         case SLAPI_SEQ_ATTRNAME:
176         case SLAPI_SEQ_VAL:
177         case SLAPI_EXT_OP_REQ_OID:
178         case SLAPI_EXT_OP_REQ_VALUE:
179         case SLAPI_EXT_OP_RET_OID:
180         case SLAPI_EXT_OP_RET_VALUE:
181         case SLAPI_MR_FILTER_ENTRY:
182         case SLAPI_MR_FILTER_TYPE:
183         case SLAPI_MR_FILTER_VALUE:
184         case SLAPI_MR_FILTER_OID:
185         case SLAPI_MR_FILTER_DNATTRS:
186         case SLAPI_LDIF2DB_FILE:
187         case SLAPI_LDIF2DB_REMOVEDUPVALS:
188         case SLAPI_DB2LDIF_PRINTKEY:
189         case SLAPI_PARENT_TXN:
190         case SLAPI_TXN:
191         case SLAPI_SEARCH_RESULT_SET:
192         case SLAPI_SEARCH_RESULT_ENTRY:
193         case SLAPI_NENTRIES:
194         case SLAPI_SEARCH_REFERRALS:
195         case SLAPI_CHANGENUMBER:
196         case SLAPI_LOG_OPERATION:
197         case SLAPI_DBSIZE:
198         case SLAPI_RESULT_CODE:
199         case SLAPI_RESULT_TEXT:
200         case SLAPI_RESULT_MATCHED:
201         case SLAPI_PLUGIN_COMPUTE_EVALUATOR_FN:
202         case SLAPI_PLUGIN_COMPUTE_SEARCH_REWRITER_FN:
203                 return LDAP_SUCCESS;
204         default:
205                 return INVALID_PARAM;
206         }
207 }
208
209 static int
210 isValidParam( Slapi_PBlock *pb, int param ) 
211 {
212         if ( pb->ckParams == TRUE ) {
213                 if ( IBM_RESERVED( param ) ) return LDAP_SUCCESS;
214                 if (param == SLAPI_PLUGIN_AUDIT_FN ||
215                                 param == SLAPI_PLUGIN_AUDIT_DATA )
216                         return LDAP_SUCCESS;
217                 if ( param < LAST_IBM_PARAM ) {
218                         return INVALID_PARAM;
219                 } else if ( NETSCAPE_RESERVED( param ) ) {
220                         return INVALID_PARAM;
221                 } else {
222                         return isOkNetscapeParam(param);
223                 }
224         } else {
225                 return LDAP_SUCCESS;
226         }
227 }
228
229 static void
230 Lock( Slapi_PBlock *pb )
231 {
232         ldap_pvt_thread_mutex_lock(&pb->pblockMutex);
233 }
234
235 static void
236 unLock( Slapi_PBlock *pb )
237 {
238         ldap_pvt_thread_mutex_unlock(&pb->pblockMutex);
239 }
240
241 static int 
242 get( Slapi_PBlock *pb, int param, void **val ) 
243 {       
244         int i;
245
246         if ( isValidParam( pb, param ) == INVALID_PARAM ) {
247                 return PBLOCK_ERROR;
248         }
249         
250         Lock( pb );
251         
252         *val = NULL;
253         for ( i = 0; i < pb->numParams; i++ ) {
254                 if ( pb->curParams[i] == param ) {
255                         *val = pb->curVals[i];
256                         break;
257                 }
258         }
259         unLock( pb );   
260         return LDAP_SUCCESS;
261 }
262
263 static int 
264 set( Slapi_PBlock *pb, int param, void *val ) 
265 {
266 #if defined(LDAP_SLAPI)
267         int i;
268
269         if ( isValidParam( pb, param ) == INVALID_PARAM ) {
270                 return PBLOCK_ERROR;
271         }
272
273         Lock( pb );     
274
275         if ( pb->numParams == PBLOCK_MAX_PARAMS ) {
276                 unLock( pb );
277                 return PBLOCK_ERROR; 
278         }
279
280         for( i = 0; i < pb->numParams; i++ ) { 
281                 if ( pb->curParams[i] == param ) {
282                         break;
283                 }
284         }
285
286         if ( i >= pb->numParams ) {
287                 pb->curParams[i] = param;
288                 pb->numParams++;
289         }
290         pb->curVals[i] = val;
291
292         unLock( pb );   
293         return LDAP_SUCCESS;
294 #endif /* LDAP_SLAPI */
295         return PBLOCK_ERROR;
296 }
297
298 static void
299 clearPB( Slapi_PBlock *pb ) 
300 {
301         pb->numParams = 1;
302 }
303
304 static void
305 checkParams( Slapi_PBlock *pb, int flag ) 
306 {
307         pb->ckParams = flag;
308 }
309
310 static int
311 deleteParam( Slapi_PBlock *p, int param ) 
312 {
313         int i;
314
315         Lock(p);
316         for ( i = 0; i < p->numParams; i++ ) { 
317                 if ( p->curParams[i] == param ) {
318                         break;
319                 }
320         }
321     
322         if (i >= p->numParams ) {
323                 unLock( p );
324                 return PBLOCK_ERROR;
325         }
326         if ( p->numParams > 1 ) {
327                 p->curParams[i] = p->curParams[p->numParams];
328                 p->curVals[i] = p->curVals[p->numParams];
329         }
330         p->numParams--;
331         unLock( p );    
332         return LDAP_SUCCESS;
333 }
334
335 Slapi_PBlock *
336 slapi_pblock_new() 
337 {
338 #if defined(LDAP_SLAPI)
339         Slapi_PBlock *pb;
340
341         pb = (Slapi_PBlock *) ch_malloc(sizeof(Slapi_PBlock));
342         if ( pb != NULL ) {
343                 pb->ckParams = TRUE;
344                 ldap_pvt_thread_mutex_init( &pb->pblockMutex );
345                 memset( pb->curParams, 0, sizeof(pb->curParams) );
346                 memset( pb->curVals, 0, sizeof(pb->curVals) );
347                 pb->curParams[0] = SLAPI_IBM_PBLOCK;
348                 pb->curVals[0] = NULL;
349                 pb->numParams = 1;
350         }
351         return pb;
352 #endif /* LDAP_SLAPI */
353         return NULL;
354 }
355
356 void 
357 slapi_pblock_destroy( Slapi_PBlock* pb ) 
358 {
359 #if defined(LDAP_SLAPI)
360         char *str = NULL;
361
362         get( pb, SLAPI_CONN_DN,(void **)&str );
363         if ( str != NULL ) {
364                 ch_free( str );
365                 str = NULL;
366         }
367
368         get( pb, SLAPI_CONN_AUTHMETHOD, (void **)&str );
369         if ( str != NULL ) {
370                 ch_free( str );
371                 str = NULL;
372         }
373
374         get( pb, SLAPI_IBM_CONN_DN_ALT, (void **)&str );
375         if ( str != NULL ) {
376                 ch_free( str );
377                 str = NULL;
378         }
379
380         get( pb, SLAPI_IBM_CONN_DN_ORIG, (void **)&str );
381         if ( str != NULL ) {
382                 ch_free( str );
383         }
384
385         get( pb, SLAPI_RESULT_TEXT, (void **)&str );
386         if ( str != NULL ) {
387                 ch_free( str );
388                 str = NULL;
389         }
390
391         get( pb, SLAPI_RESULT_MATCHED, (void **)&str );
392         if ( str != NULL ) {
393                 ch_free( str );
394                 str = NULL;
395         }
396
397         ldap_pvt_thread_mutex_destroy( &pb->pblockMutex );
398
399         ch_free( pb ); 
400 #endif /* LDAP_SLAPI */
401 }
402
403 int 
404 slapi_pblock_get( Slapi_PBlock *pb, int arg, void *value ) 
405 {
406 #if defined(LDAP_SLAPI)
407         return get( pb, arg, (void **)value );
408 #endif /* LDAP_SLAPI */
409         return PBLOCK_ERROR;
410 }
411
412 int 
413 slapi_pblock_set( Slapi_PBlock *pb, int arg, void *value ) 
414 {
415 #if defined(LDAP_SLAPI)
416         void *pTmp = NULL;
417
418         switch ( arg ) {
419         case SLAPI_CONN_DN:
420         case SLAPI_CONN_AUTHMETHOD:
421         case SLAPI_IBM_CONN_DN_ALT:
422         case SLAPI_IBM_CONN_DN_ORIG:
423         case SLAPI_RESULT_TEXT:
424         case SLAPI_RESULT_MATCHED:
425                 if ( value != NULL ) {
426                         pTmp = (void *)slapi_ch_strdup((char *)value);
427                         if ( pTmp == NULL ) {
428                                 return LDAP_NO_MEMORY;
429                         }
430                 }
431                 break;
432         default:
433                 pTmp = value;
434                 break;
435         }
436         return set( pb, arg, pTmp );
437 #endif /* LDAP_SLAPI */
438         return LDAP_NO_MEMORY;
439 }
440
441 void
442 slapi_pblock_clear( Slapi_PBlock *pb ) 
443 {
444 #if defined(LDAP_SLAPI)
445    clearPB( pb );
446 #endif /* LDAP_SLAPI */
447 }
448
449 int 
450 slapi_pblock_delete_param( Slapi_PBlock *p, int param ) 
451 {
452 #if defined(LDAP_SLAPI)
453         return deleteParam( p, param );
454 #endif /* LDAP_SLAPI */
455         return PBLOCK_ERROR;
456 }
457
458 void
459 slapi_pblock_check_params( Slapi_PBlock *pb, int flag ) 
460 {
461 #if defined(LDAP_SLAPI)
462         checkParams( pb, flag );
463 #endif /* LDAP_SLAPI */
464 }
465
466 /*
467  * OpenLDAP extension
468  */
469 int
470 slapi_x_pblock_get_first( Backend *be, Slapi_PBlock **pb )
471 {
472 #if defined(LDAP_SLAPI)
473         assert( pb );
474         *pb = (Slapi_PBlock *)be->be_pb;
475         return (*pb == NULL ? LDAP_OTHER : LDAP_SUCCESS);
476 #else /* LDAP_SLAPI */
477         return LDAP_OTHER;
478 #endif /* LDAP_SLAPI */
479 }
480
481 /*
482  * OpenLDAP extension
483  */
484 int
485 slapi_x_pblock_get_next( Slapi_PBlock **pb )
486 {
487 #if defined(LDAP_SLAPI)
488         assert( pb );
489         return slapi_pblock_get( *pb, SLAPI_IBM_PBLOCK, pb );
490 #else /* LDAP_SLAPI */
491         return LDAP_OTHER;
492 #endif /* LDAP_SLAPI */
493 }
494