+static char *
+safe_strncopy( char *ptr, const char *src, size_t n, struct berval *buf )
+{
+ while ( ptr + n >= buf->bv_val + buf->bv_len ) {
+ char *tmp = ch_realloc( buf->bv_val, 2*buf->bv_len );
+ if ( tmp == NULL ) {
+ return NULL;
+ }
+ ptr = tmp + (ptr - buf->bv_val);
+ buf->bv_val = tmp;
+ buf->bv_len *= 2;
+ }
+
+ return lutil_strncopy( ptr, src, n );
+}
+
+static char *
+safe_strcopy( char *ptr, const char *s, struct berval *buf )
+{
+ size_t n = strlen( s );
+
+ return safe_strncopy( ptr, s, n, buf );
+}
+
+static char *
+safe_strbvcopy( char *ptr, const struct berval *bv, struct berval *buf )
+{
+ return safe_strncopy( ptr, bv->bv_val, bv->bv_len, buf );
+}