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