X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fpagectrl.c;h=c6f1c4ab7578376f97e05fa17922ae6224219a05;hb=623a7a9fe2619abf658fec3d5f690a5ba240e4f3;hp=67f648c37b6c24d48dd187522ba7fe3271d12014;hpb=de79a7bfec60776ffd5a3968fa78c4a00bc05a55;p=openldap diff --git a/libraries/libldap/pagectrl.c b/libraries/libldap/pagectrl.c index 67f648c37b..c6f1c4ab75 100644 --- a/libraries/libldap/pagectrl.c +++ b/libraries/libldap/pagectrl.c @@ -12,23 +12,8 @@ * top-level directory of the distribution or, alternatively, at * . */ -/* Portions Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved. - * - * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND - * TREATIES. USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT - * TO VERSION 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS - * AVAILABLE AT HTTP://WWW.OPENLDAP.ORG/LICENSE.HTML OR IN THE FILE "LICENSE" - * IN THE TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION - * OF THIS WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP - * PUBLIC LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM NOVELL, COULD SUBJECT - * THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. - */ -/* Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License - * can be found in the file "build/LICENSE-2.0.1" in this distribution - * of OpenLDAP Software. - */ -/* Portions Copyright (C) The Internet Society (1997) - * ASN.1 fragments are from RFC 2251; see RFC for full legal notices. +/* Portions Copyright (C) The Internet Society (1999) + * ASN.1 fragments are from RFC 2696; see RFC for full legal notices. */ #include "portable.h" @@ -45,22 +30,14 @@ Create and encode the value of the paged results control (RFC 2696). - ld (IN) An LDAP session handle, as obtained from a call to - ldap_init(). - - pagesize (IN) The number of entries to return per page. - + ld (IN) An LDAP session handle + pagesize (IN) Page size requested cookie (IN) Opaque structure used by the server to track its - location in the search results. Pass in NULL on the + location in the search results. NULL on the first call. - - value (OUT) the pointer to a struct berval; it is filled by this function - with the value that must be assigned to the ldctl_value member - of the LDAPControl structure. The bv_val member of the berval - structure SHOULD be freed by calling ldap_memfree() when done. + value (OUT) Control value, SHOULD be freed by calling + ldap_memfree() when done. - Ber encoding - pagedResultsControl ::= SEQUENCE { controlType 1.2.840.113556.1.4.319, criticality BOOLEAN DEFAULT FALSE, @@ -76,8 +53,8 @@ int ldap_create_page_control_value( - LDAP *ld, - unsigned long pagesize, + LDAP *ld, + ber_int_t pagesize, struct berval *cookie, struct berval *value ) { @@ -85,9 +62,12 @@ ldap_create_page_control_value( ber_tag_t tag; struct berval null_cookie = { 0, NULL }; - if ( ld == NULL || value == NULL ) { - ld->ld_errno = LDAP_PARAM_ERROR; - return ld->ld_errno; + if ( ld == NULL || value == NULL || + pagesize < 1 || pagesize > LDAP_MAXINT ) + { + if ( ld ) + ld->ld_errno = LDAP_PARAM_ERROR; + return LDAP_PARAM_ERROR; } assert( LDAP_VALID( ld ) ); @@ -107,18 +87,15 @@ ldap_create_page_control_value( tag = ber_printf( ber, "{iO}", pagesize, cookie ); if ( tag == LBER_ERROR ) { - goto error_return; + ld->ld_errno = LDAP_ENCODING_ERROR; + goto done; } if ( ber_flatten2( ber, value, 1 ) == -1 ) { ld->ld_errno = LDAP_NO_MEMORY; } - if ( 0 ) { -error_return:; - ld->ld_errno = LDAP_ENCODING_ERROR; - } - +done:; if ( ber != NULL ) { ber_free( ber, 1 ); } @@ -132,24 +109,17 @@ error_return:; Create and encode a page control. - ld (IN) An LDAP session handle, as obtained from a call to - ldap_init(). - - pagesize (IN) The number of entries to return per page. - + ld (IN) An LDAP session handle + pagesize (IN) Page size requested cookie (IN) Opaque structure used by the server to track its - location in the search results. Pass in NULL on the + location in the search results. NULL on the first call. - - iscritical (IN) 0 - The control is not critical to the operation. - non-zero - The control is critical to the operation. - - ctrlp (OUT) Returns a pointer to the LDAPControl created. This - control SHOULD be freed by calling ldap_control_free() - when done. + value (OUT) Control value, SHOULD be freed by calling + ldap_memfree() when done. + iscritical (IN) Criticality + ctrlp (OUT) LDAP control, SHOULD be freed by calling + ldap_control_free() when done. - Ber encoding - pagedResultsControl ::= SEQUENCE { controlType 1.2.840.113556.1.4.319, criticality BOOLEAN DEFAULT FALSE, @@ -166,27 +136,35 @@ error_return:; int ldap_create_page_control( LDAP *ld, - unsigned long pagesize, + ber_int_t pagesize, struct berval *cookie, int iscritical, LDAPControl **ctrlp ) { struct berval value; + BerElement *ber; if ( ctrlp == NULL ) { ld->ld_errno = LDAP_PARAM_ERROR; return ld->ld_errno; } - ld->ld_errno = ldap_create_page_control_value( ld, pagesize, cookie, &value ); + ld->ld_errno = ldap_create_page_control_value( ld, + pagesize, cookie, &value ); if ( ld->ld_errno == LDAP_SUCCESS ) { + if ((ber = ldap_alloc_ber_with_options(ld)) == NULL) { + ld->ld_errno = LDAP_NO_MEMORY; + return LDAP_NO_MEMORY; + } + ld->ld_errno = ldap_create_control( LDAP_CONTROL_PAGEDRESULTS, - NULL, iscritical, ctrlp ); + ber, iscritical, ctrlp ); if ( ld->ld_errno == LDAP_SUCCESS ) { (*ctrlp)->ldctl_value = value; } else { LDAP_FREE( value.bv_val ); } + ber_free(ber, 1); } return ld->ld_errno; @@ -198,36 +176,29 @@ ldap_create_page_control( Decode a page control. - ld (IN) An LDAP session handle, as obtained from a call to - ldap_init(). - - ctrls (IN) The address of a NULL-terminated array of - LDAPControl structures, typically obtained by a - call to ldap_parse_result(). The array SHOULD include - a page control. - - count (OUT) The number of entries returned in the page. - - cookie (OUT) Opaque structure used by the server to track its - location in the search results. Use ldap_memfree() to + ld (IN) An LDAP session handle + ctrl (IN) The page response control + count (OUT) The number of entries in the page. + cookie (OUT) Opaque cookie. Use ldap_memfree() to free the bv_val member of this structure. ---------------------------------------------------------------------------*/ int ldap_parse_pageresponse_control( - LDAP *ld, - LDAPControl *ctrl, - unsigned long *countp, - struct berval *cookie ) + LDAP *ld, + LDAPControl *ctrl, + ber_int_t *countp, + struct berval *cookie ) { BerElement *ber; ber_tag_t tag; ber_int_t count; if ( ld == NULL || ctrl == NULL || cookie == NULL ) { - ld->ld_errno = LDAP_PARAM_ERROR; - return ld->ld_errno; + if ( ld ) + ld->ld_errno = LDAP_PARAM_ERROR; + return LDAP_PARAM_ERROR; } /* Create a BerElement from the berval returned in the control. */ @@ -260,19 +231,11 @@ ldap_parse_pageresponse_control( Decode a page control. - ld (IN) An LDAP session handle, as obtained from a call to - ldap_init(). - - ctrls (IN) The address of a NULL-terminated array of - LDAPControl structures, typically obtained by a - call to ldap_parse_result(). The array SHOULD include - a page control. - - count (OUT) The number of entries returned in the page. - - cookie (OUT) Opaque structure used by the server to track its - location in the search results. Use ber_bvfree() to - free it. + ld (IN) An LDAP session handle + ctrls (IN) Response controls + count (OUT) The number of entries in the page. + cookie (OUT) Opaque cookie. Use ldap_memfree() to + free the bv_val member of this structure. ---------------------------------------------------------------------------*/ @@ -280,11 +243,11 @@ int ldap_parse_page_control( LDAP *ld, LDAPControl **ctrls, - unsigned long *countp, + ber_int_t *countp, struct berval **cookiep ) { + LDAPControl *c; struct berval cookie; - int i; if ( cookiep == NULL ) { ld->ld_errno = LDAP_PARAM_ERROR; @@ -296,20 +259,14 @@ ldap_parse_page_control( return ld->ld_errno; } - /* Search the list of control responses for a page control. */ - for ( i = 0; ctrls[i]; i++ ) { - if ( strcmp( LDAP_CONTROL_PAGEDRESULTS, ctrls[ i ]->ldctl_oid ) == 0 ) { - break; - } - } - - /* No page control was found. */ - if ( ctrls[ i ] == NULL ) { + c = ldap_find_control( LDAP_CONTROL_PAGEDRESULTS, ctrls ); + if ( c == NULL ) { + /* No page control was found. */ ld->ld_errno = LDAP_CONTROL_NOT_FOUND; return ld->ld_errno; } - ld->ld_errno = ldap_parse_pageresponse_control( ld, ctrls[ i ], countp, &cookie ); + ld->ld_errno = ldap_parse_pageresponse_control( ld, c, countp, &cookie ); if ( ld->ld_errno == LDAP_SUCCESS ) { *cookiep = LDAP_MALLOC( sizeof( struct berval * ) ); if ( *cookiep == NULL ) {