1
1
/* io.c - ber general i/o routines */
2
/* $OpenLDAP: pkg/ldap/libraries/liblber/io.c,v 1.111.2.10 2009/03/17 16:21:28 quanah Exp $ */
2
/* $OpenLDAP: pkg/ldap/libraries/liblber/io.c,v 1.111.2.11 2009/08/02 21:06:34 quanah Exp $ */
3
3
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5
5
* Copyright 1998-2009 The OpenLDAP Foundation.
89
91
return( (ber_slen_t) actuallen );
95
* Write to the ber buffer.
96
* Note that ber_start_seqorset/ber_put_seqorset() bypass ber_write().
95
101
LDAP_CONST char *buf,
103
int zero ) /* nonzero is unsupported from OpenLDAP 2.4.18 */
99
107
assert( ber != NULL );
100
108
assert( buf != NULL );
102
109
assert( LBER_VALID( ber ) );
104
if ( nosos || ber->ber_sos == NULL ) {
105
if ( ber->ber_ptr + len > ber->ber_end ) {
106
if ( ber_realloc( ber, len ) != 0 ) return( -1 );
108
AC_MEMCPY( ber->ber_ptr, buf, (size_t)len );
110
return( (ber_slen_t) len );
113
if ( ber->ber_sos->sos_ptr + len > ber->ber_end ) {
114
if ( ber_realloc( ber, len ) != 0 ) return( -1 );
116
AC_MEMCPY( ber->ber_sos->sos_ptr, buf, (size_t)len );
117
ber->ber_sos->sos_ptr += len;
118
ber->ber_sos->sos_clen += len;
119
return( (ber_slen_t) len );
112
ber_log_printf( LDAP_DEBUG_ANY, ber->ber_debug, "%s",
113
"ber_write: nonzero 4th argument not supported\n" );
117
p = ber->ber_sos_ptr == NULL ? &ber->ber_ptr : &ber->ber_sos_ptr;
118
if ( len > (ber_len_t) (ber->ber_end - *p) ) {
119
if ( ber_realloc( ber, len ) != 0 ) return( -1 );
121
AC_MEMCPY( *p, buf, len );
124
return( (ber_slen_t) len );
127
/* Resize the ber buffer */
124
129
ber_realloc( BerElement *ber, ber_len_t len )
131
ber_len_t total, offset, sos_offset;
131
134
assert( ber != NULL );
133
135
assert( LBER_VALID( ber ) );
137
/* leave room for ber_flatten() to \0-terminate ber_buf */
135
142
total = ber_pvt_ber_total( ber );
137
144
#define LBER_EXBUFSIZ 4060 /* a few words less than 2^N for binary buddy */
140
147
/* don't realloc by small amounts */
141
148
total += len < LBER_EXBUFSIZ ? LBER_EXBUFSIZ : len;
143
{ /* not sure what value this adds */
150
{ /* not sure what value this adds. reduce fragmentation? */
144
151
ber_len_t have = (total + (LBER_EXBUFSIZE - 1)) / LBER_EXBUFSIZ;
145
152
ber_len_t need = (len + (LBER_EXBUFSIZ - 1)) / LBER_EXBUFSIZ;
146
153
total = ( have + need ) * LBER_EXBUFSIZ;
150
157
total += len; /* realloc just what's needed */
153
oldbuf = ber->ber_buf;
155
ber->ber_buf = (char *) ber_memrealloc_x( oldbuf, total, ber->ber_memctx );
157
if ( ber->ber_buf == NULL ) {
158
ber->ber_buf = oldbuf;
162
ber->ber_end = ber->ber_buf + total;
165
* If the stinking thing was moved, we need to go through and
166
* reset all the sos and ber pointers. Offsets would've been
167
* a better idea... oh well.
170
if ( ber->ber_buf != oldbuf ) {
171
ber->ber_ptr = ber->ber_buf + (ber->ber_ptr - oldbuf);
173
for ( s = ber->ber_sos; s != NULL; s = s->sos_next ) {
174
off = s->sos_first - oldbuf;
175
s->sos_first = ber->ber_buf + off;
177
off = s->sos_ptr - oldbuf;
178
s->sos_ptr = ber->ber_buf + off;
160
if ( total < len || total > (ber_len_t)-1 / 2 /* max ber_slen_t */ ) {
165
offset = ber->ber_ptr - buf;
166
sos_offset = ber->ber_sos_ptr ? ber->ber_sos_ptr - buf : 0;
167
/* if ber_sos_ptr != NULL, it is > ber_buf so that sos_offset > 0 */
169
buf = (char *) ber_memrealloc_x( buf, total, ber->ber_memctx );
175
ber->ber_end = buf + total;
176
ber->ber_ptr = buf + offset;
178
ber->ber_sos_ptr = buf + sos_offset;
186
184
ber_free_buf( BerElement *ber )
190
186
assert( LBER_VALID( ber ) );
192
188
if ( ber->ber_buf) ber_memfree_x( ber->ber_buf, ber->ber_memctx );
194
for( s = ber->ber_sos ; s != NULL ; s = next ) {
196
ber_memfree_x( s, ber->ber_memctx );
199
190
ber->ber_buf = NULL;
191
ber->ber_sos_ptr = NULL;
201
192
ber->ber_valid = LBER_UNINITIALIZED;
725
717
ber_rewind ( BerElement * ber )
727
719
ber->ber_rwptr = NULL;
720
ber->ber_sos_ptr = NULL;
729
721
ber->ber_end = ber->ber_ptr;
730
722
ber->ber_ptr = ber->ber_buf;
723
#if 0 /* TODO: Should we add this? */
724
ber->ber_tag = LBER_DEFAULT;
725
ber->ber_usertag = 0;