X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Fstdio.c;h=bebfb50a3120eda001fc5499307a087a4c077f7b;hb=966cef8c9a3238efe0c482ad0ee08fd98944d112;hp=0c5205ac80e113b52c97790579ee84d5729b8042;hpb=890d4b9449f9f022505ece7811dde7c36fcc4c68;p=openldap diff --git a/libraries/liblber/stdio.c b/libraries/liblber/stdio.c index 0c5205ac80..bebfb50a31 100644 --- a/libraries/liblber/stdio.c +++ b/libraries/liblber/stdio.c @@ -1,7 +1,16 @@ /* $OpenLDAP$ */ -/* - * Copyright 2002 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2011 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -9,6 +18,8 @@ #include #include #include +#include +#include #if !defined(HAVE_VSNPRINTF) && !defined(HAVE_EBCDIC) /* Write at most n characters to the buffer in str, return the @@ -55,6 +66,9 @@ int ber_pvt_vsnprintf( char *str, size_t n, const char *fmt, va_list ap ) fclose( f ); signal( SIGPIPE, sig ); + if ( res > 0 && res < n ) { + res = vsprintf( str, fmt, ap ); + } return res; } #endif @@ -70,7 +84,7 @@ int ber_pvt_snprintf( char *str, size_t n, const char *fmt, ... ) va_end( ap ); return res; } -#endif /* !HAVE_VSNPRINTF */ +#endif /* !HAVE_SNPRINTF */ #ifdef HAVE_EBCDIC /* stdio replacements with ASCII/EBCDIC translation for OS/390. @@ -123,10 +137,11 @@ int ber_pvt_vsnprintf( char *str, size_t n, const char *fmt, va_list ap ) ptr = (char *)fmt; s2 = str; fm2[0] = '%'; - if (n) + if (n) { end = str + n; - else + } else { end = NULL; + } for (pct = strchr(ptr, '%'); pct; pct = strchr(ptr, '%')) { len = pct-ptr; @@ -135,13 +150,14 @@ int ber_pvt_vsnprintf( char *str, size_t n, const char *fmt, va_list ap ) if (rem < 1) return -1; if (rem < len) len = rem; } - s2 = ber_pvt_strncopy( s2, ptr, len ); + s2 = lutil_strncopy( s2, ptr, len ); /* Did we cheat the length above? If so, bail out */ if (len < pct-ptr) return -1; for (pct++, f2 = fm2+1; isdigit(*pct);) *f2++ = *pct++; if (*pct == 'l') *f2++ = *pct++; - if (*pct == '%') *s2++ = '%'; - else { + if (*pct == '%') { + *s2++ = '%'; + } else { *f2++ = *pct; *f2 = '\0'; if (*pct == 's') { @@ -161,8 +177,9 @@ int ber_pvt_vsnprintf( char *str, size_t n, const char *fmt, va_list ap ) } else { s2 += sprintf(s2, fm2, ss); } - } else + } else { s2 += sprintf(s2, fm2, va_arg(ap, int)); + } } ptr = pct + 1; } @@ -170,12 +187,12 @@ int ber_pvt_vsnprintf( char *str, size_t n, const char *fmt, va_list ap ) rem = end-s2; if (rem > 0) { len = strlen(ptr); - s2 = ber_pvt_strncopy( s2, ptr, rem ); + s2 = lutil_strncopy( s2, ptr, rem ); rem -= len; } if (rem < 0) return -1; } else { - s2 = ber_pvt_strcopy( s2, ptr ); + s2 = lutil_strcopy( s2, ptr ); } return s2 - str; }