[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] snprintf wrapper with consistant (though not C99) overflow ...
- To: or-cvs@freehaven.net
- Subject: [or-cvs] snprintf wrapper with consistant (though not C99) overflow ...
- From: nickm@seul.org (Nick Mathewson)
- Date: Wed, 27 Oct 2004 02:26:25 -0400 (EDT)
- Delivered-to: archiver@seul.org
- Delivered-to: or-cvs-outgoing@seul.org
- Delivered-to: or-cvs@seul.org
- Delivery-date: Wed, 27 Oct 2004 02:26:48 -0400
- Reply-to: or-dev@freehaven.net
- Sender: owner-or-cvs@freehaven.net
Update of /home/or/cvsroot/src/common
In directory moria.mit.edu:/tmp/cvs-serv2154/src/common
Modified Files:
util.c util.h
Log Message:
snprintf wrapper with consistant (though not C99) overflow behavior
Index: util.c
===================================================================
RCS file: /home/or/cvsroot/src/common/util.c,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -d -r1.154 -r1.155
--- util.c 27 Oct 2004 06:03:28 -0000 1.154
+++ util.c 27 Oct 2004 06:26:23 -0000 1.155
@@ -2185,7 +2185,7 @@
* "mask" is the Mask|Maskbits part...
* and "port" is the *|port|min-max part.
*/
-
+
if (strcmp(address,"*")==0) {
*addr_out = 0;
} else if (tor_inet_aton(address, &in) != 0) {
@@ -2318,6 +2318,41 @@
return 0;
}
+/** Replacement for snprintf. Differs from platform snprintf in two
+ * ways: First, always NUL-terminates its output. Second, always
+ * returns -1 if the result is truncated. (Note that this return
+ * behavior does <i>not</i> conform to C99; it just happens to be the
+ * easiest to emulate "return -1" with conformant implementations than
+ * it is to emulate "return number that would be written" with
+ * non-conformant implementations.) */
+int tor_snprintf(char *str, size_t size, const char *format, ...)
+{
+ va_list ap;
+ int r;
+ va_start(ap,format);
+ r = tor_vsnprintf(str,size,format,ap);
+ va_end(ap);
+ return r;
+}
+
+/** Replacement for vsnpritnf; behavior differs as tor_snprintf differs from
+ * snprintf.
+ */
+int tor_vsnprintf(char *str, size_t size, const char *format, va_list args)
+{
+ int r;
+#ifdef MS_WINDOWS
+ r = _vsnprintf(str, size, format, args);
+#else
+ r = vsnprintf(str, size, format, args);
+#endif
+ str[size-1] = '\0';
+ if (r < 0 || r >= size)
+ return -1;
+ return r;
+}
+
+
#ifndef MS_WINDOWS
struct tor_mutex_t {
};
Index: util.h
===================================================================
RCS file: /home/or/cvsroot/src/common/util.h,v
retrieving revision 1.105
retrieving revision 1.106
diff -u -d -r1.105 -r1.106
--- util.h 24 Oct 2004 00:55:18 -0000 1.105
+++ util.h 27 Oct 2004 06:26:23 -0000 1.106
@@ -13,6 +13,7 @@
#include "orconfig.h"
#include "torint.h"
#include <stdio.h>
+#include <stdarg.h>
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
@@ -106,7 +107,18 @@
unsigned long tor_parse_ulong(const char *s, int base, unsigned long min,
unsigned long max, int *ok, char **next);
+/* XXXX duplicated from log.h */
+#ifdef __GNUC__
+#define CHECK_PRINTF(formatIdx, firstArg) \
+ __attribute__ ((format (printf, formatIdx, firstArg)))
+#else
+#define CHECK_PRINTF(formatIdx, firstArg)
+#endif
+int tor_snprintf(char *str, size_t size, const char *format, ...)
+ CHECK_PRINTF(3,4);
+int tor_vsnprintf(char *str, size_t size, const char *format, va_list args);
+
/* Some platforms segfault when you try to access a multi-byte type
* that isn't aligned to a word boundary. The macros and/or functions
* below can be used to access unaligned data on any platform.