1bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2005 Darren Tucker 3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2005 Damien Miller 4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Permission to use, copy, modify, and distribute this software for any 6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * purpose with or without fee is hereby granted, provided that the above 7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * copyright notice and this permission notice appear in all copies. 8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define BUFSZ 2048 19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <sys/types.h> 21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdlib.h> 22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdio.h> 23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <stdarg.h> 24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <string.h> 25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstatic int failed = 0; 27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstatic void 29bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanfail(const char *m) 30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fprintf(stderr, "snprintftest: %s\n", m); 32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman failed = 1; 33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint x_snprintf(char *str, size_t count, const char *fmt, ...) 36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman size_t ret; 38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman va_list ap; 39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman va_start(ap, fmt); 41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman ret = vsnprintf(str, count, fmt, ap); 42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman va_end(ap); 43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return ret; 44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint 47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanmain(void) 48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman char b[5]; 50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman char *src; 51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman snprintf(b,5,"123456789"); 53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (b[4] != '\0') 54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fail("snprintf does not correctly terminate long strings"); 55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* check for read overrun on unterminated string */ 57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if ((src = malloc(BUFSZ)) == NULL) { 58bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fail("malloc failed"); 59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } else { 60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman memset(src, 'a', BUFSZ); 61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman snprintf(b, sizeof(b), "%.*s", 1, src); 62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (strcmp(b, "a") != 0) 63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fail("failed with length limit '%%.s'"); 64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* check that snprintf and vsnprintf return sane values */ 67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (snprintf(b, 1, "%s %d", "hello", 12345) != 11) 68bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fail("snprintf does not return required length"); 69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (x_snprintf(b, 1, "%s %d", "hello", 12345) != 11) 70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman fail("vsnprintf does not return required length"); 71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return failed; 73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 74