lib/slprintf.c tiny bug on FreeBSD - test program

Michail Vidiassov master at iaas.msu.ru
Sat Feb 24 10:18:51 GMT 2001


Sorry, it seems I have forgotten to attach it to my previous mail


#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#define HAVE_STDARG_H 1



/* this is like vsnprintf but the 'n' limit does not include
   the terminating null. So if you have a 1024 byte buffer then
   pass 1023 for n */
int vslprintf(char *str, int n, char *format, va_list ap)
{
	int ret = vsnprintf(str, n, format, ap);
	if (ret > n || ret < 0) {
		str[n] = 0;
		return -1;
	}
	str[ret] = 0;
	return ret;
}

#ifdef HAVE_STDARG_H
 int slprintf(char *str, int n, char *format, ...)
{
#else
 int slprintf(va_alist)
va_dcl
{
	char *str, *format;
	int n;
#endif
	va_list ap;
	int ret;

#ifdef HAVE_STDARG_H
	va_start(ap, format);
#else
	va_start(ap);
	str = va_arg(ap,char *);
	n = va_arg(ap,int);
	format = va_arg(ap,char *);
#endif

	ret = vslprintf(str,n,format,ap);
	va_end(ap);
	return ret;
}
int main()
{
 char buf[11];
 char *str;
 int i;

 printf("buffer size: %d\n",sizeof(buf));

 puts("slprintf(buf,sizeof(buf)-1,\"%s\",str)");

 bzero(buf,sizeof(buf));
 str = "1234567890";
 i = slprintf(buf,sizeof(buf)-1,"%s",str);
 printf("str:%s buf:%s\n sizeof:%d strlen:%d return code:%d\n",
  str, buf, sizeof(buf), strlen(buf), i);

 bzero(buf,sizeof(buf));
 str = "12345678901";
 i = slprintf(buf,sizeof(buf)-1,"%s",str);
 printf("str:%s buf:%s\n sizeof:%d strlen:%d return code:%d\n",
  str, buf, sizeof(buf), strlen(buf), i);

 puts("snprintf(buf,sizeof(buf),\"%s\",str)");

 bzero(buf,sizeof(buf));
 str = "1234567890";
 i = snprintf(buf,sizeof(buf),"%s",str);
 printf("str:%s buf:%s\n sizeof:%d strlen:%d return code:%d\n",
  str, buf, sizeof(buf), strlen(buf), i);

 bzero(buf,sizeof(buf));
 str = "12345678901";
 i = snprintf(buf,sizeof(buf),"%s",str);
 printf("str:%s buf:%s\n sizeof:%d strlen:%d return code:%d\n",
  str, buf, sizeof(buf), strlen(buf), i);

 return (0);
}





More information about the samba-technical mailing list