]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FreeTDM: Add gcc printf()-style format string checks to ftdm_log(), also add FTDM_...
authorStefan Knoblich <stkn@openisdn.net>
Wed, 11 Jul 2012 20:38:25 +0000 (22:38 +0200)
committerStefan Knoblich <stkn@openisdn.net>
Wed, 11 Jul 2012 20:44:08 +0000 (22:44 +0200)
The format string checks already caught a couple crash-worthy bugs and this
commit fixes a couple more.

Also includes __ftdm_check_scanf(), for completeness (currently unused).

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
libs/freetdm/src/ftdm_state.c
libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
libs/freetdm/src/ftmod/ftmod_misdn/ftmod_misdn.c
libs/freetdm/src/include/freetdm.h
libs/freetdm/src/include/ftdm_declare.h
libs/freetdm/src/include/ftdm_os.h
libs/freetdm/src/testr2.c

index e2ccf83747a5913183de35f6ab13b9f9070079db..db4097e84b492c1cbc6681b4b4951312721dba4d 100644 (file)
@@ -92,7 +92,7 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c
 
        diff = fchan->history[hindex].end_time - fchan->history[hindex].time;
 
-       ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Completed state change from %s to %s in %llums\n", 
+       ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Completed state change from %s to %s in %"FTDM_TIME_FMT" ms\n",
                        ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(state), diff);
        
 
@@ -209,7 +209,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_cancel_state(const char *file, const char
        /* NOTE
         * we could potentially also take out the channel from the pendingchans queue, but I believe is easier just leave it,
         * the only side effect will be a call to ftdm_channel_advance_states() for a channel that has nothing to advance */
-       ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Cancelled state change from %s to %s in %llums\n", 
+       ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Cancelled state change from %s to %s in %"FTDM_TIME_FMT" ms\n",
                        ftdm_channel_state2str(last_state), ftdm_channel_state2str(state), diff);
        
        return FTDM_SUCCESS;
index 471b870f3440b3c965425dc47bf74b9b590d03cd..edfd8132a1e84a3a4124fff92d32309043538275 100644 (file)
@@ -1221,7 +1221,7 @@ static int on_info(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event
        ftdm_caller_data_t *caller_data = NULL;
 
        if (!chan) {
-               ftdm_log(FTDM_LOG_CRIT, "-- Info on channel %d:%d %s but it's not in use?\n", ftdm_span_get_id(span), pevent->ring.channel);
+               ftdm_log(FTDM_LOG_CRIT, "-- Info on channel %d:%d but it's not in use?\n", ftdm_span_get_id(span), pevent->ring.channel);
                return 0;
        }
 
@@ -1284,7 +1284,7 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even
        ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->hangup.channel);
 
        if (!chan) {
-               ftdm_log(FTDM_LOG_CRIT, "-- Hangup on channel %d:%d %s but it's not in use?\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
+               ftdm_log(FTDM_LOG_CRIT, "-- Hangup on channel %d:%d but it's not in use?\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
                return 0;
        }
 
index c304a8b37bf7a0182e4dc1940f4ab08494a57a13..c2c1abfb2cd72cd01722d59d8c211d3098cfe986 100644 (file)
@@ -1143,7 +1143,7 @@ static ftdm_status_t misdn_handle_incoming(ftdm_channel_t *ftdmchan, const char
        assert(priv);
 
        if (msg_len < sizeof(*hh)) {
-               ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "mISDN message to small (%d < %d bytes)\n",
+               ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "mISDN message to small (%d < %"FTDM_SIZE_FMT" bytes)\n",
                        msg_len, sizeof(*hh));
                return FTDM_FAIL;
        }
index 6ce9879b9141972461d50e37f38ef891abd0040d..8f5fb4f1f38c1ec367a8beb1b14c1e84355b6283 100755 (executable)
@@ -216,7 +216,7 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_chan_type, ftdm_chan_type2str, ftdm_chan_type_t)
 /*! \brief Logging function prototype to be used for all FreeTDM logs 
  *  you should use ftdm_global_set_logger to set your own logger
  */
-typedef void (*ftdm_logger_t)(const char *file, const char *func, int line, int level, const char *fmt, ...);
+typedef void (*ftdm_logger_t)(const char *file, const char *func, int line, int level, const char *fmt, ...) __ftdm_check_printf(5, 6);
 
 /*! \brief Data queue operation functions
  *  you can use ftdm_global_set_queue_handler if you want to override the default implementation (not recommended)
index cf4dcdd555b276c2d80ca4e0067739be3b5a55a1..3a931fb718dbc217d31f2fd8a28b737e3c5f2247 100644 (file)
@@ -121,6 +121,36 @@ extern "C" {
 #pragma comment(lib, "Winmm")
 #endif
 
+/*
+ * Compiler-specific format checking attributes
+ * use these on custom functions that use printf/scanf-style
+ * format strings (e.g. ftdm_log())
+ */
+#if defined(__GNUC__)
+/**
+ * Enable compiler-specific printf()-style format and argument checks on a function
+ * @param      fmtp    Position of printf()-style format string parameter
+ * @param      argp    Position of variable argument list ("...") parameter
+ * @code
+ *     void log(const int level, const char *fmt, ...) __ftdm_check_printf(2, 3);
+ * @endcode
+ */
+#define __ftdm_check_printf(fmtp, argp) __attribute__((format (printf, fmtp, argp)))
+/**
+ * Enable compiler-specific scanf()-style format and argument checks on a function
+ * @param      fmtp    Position of scanf()-style format string parameter
+ * @param      argp    Position of variable argument list ("...") parameter
+ * @code
+ *     void parse(struct foo *ctx, const char *fmt, ...) __ftdm_check_scanf(2, 3);
+ * @endcode
+ */
+#define __ftdm_check_scanf(fmtp, argp) __attribute__((format (scanf, fmtp, argp)))
+#else
+#define __ftdm_check_printf(fmtp, argp)
+#define __ftdm_check_scanf(fmtp, argp)
+#endif
+
+
 #define FTDM_STR2ENUM_P(_FUNC1, _FUNC2, _TYPE) FT_DECLARE(_TYPE) _FUNC1 (const char *name); FT_DECLARE(const char *) _FUNC2 (_TYPE type);
 #define FTDM_STR2ENUM(_FUNC1, _FUNC2, _TYPE, _STRINGS, _MAX)   \
        FT_DECLARE(_TYPE) _FUNC1 (const char *name)                                                     \
@@ -160,6 +190,8 @@ typedef __int16 int16_t;
 typedef __int8 int8_t;
 #define FTDM_O_BINARY O_BINARY
 #define FTDM_SIZE_FMT "Id"
+#define FTDM_INT64_FMT "lld"
+#define FTDM_UINT64_FMT "llu"
 #if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
 #define DELTA_EPOCH_IN_MICROSECS  11644473600000000Ui64
 #else
@@ -168,6 +200,13 @@ typedef __int8 int8_t;
 #else /* __WINDOWS__ */
 #define FTDM_O_BINARY 0
 #define FTDM_SIZE_FMT "zd"
+#if (defined(__SIZEOF_LONG__) && (__SIZEOF_LONG__ == 8)) || defined(__LP64__) || defined(__LLP64__)
+#define FTDM_INT64_FMT "ld"
+#define FTDM_UINT64_FMT "lu"
+#else
+#define FTDM_INT64_FMT "lld"
+#define FTDM_UINT64_FMT "llu"
+#endif
 #define FTDM_INVALID_SOCKET -1
 typedef int ftdm_socket_t;
 #include <stdio.h>
index a4605c337155a10262858c8e009bd6cb17991d9a..151f8d935eba070bd5ccb50c4f01507152b31623 100644 (file)
@@ -53,6 +53,8 @@ extern "C" {
 
 /*! \brief time data type */
 typedef uint64_t ftdm_time_t; 
+/*! format string for ftdm_time_t */
+#define FTDM_TIME_FMT FTDM_UINT64_FMT
 
 /*! \brief sleep x amount of milliseconds */
 #ifdef __WINDOWS__
index 24dde38b0826db377f9f018dddf1291c0e9e0973..530e6321bcb20d59b9bf74a55942784501916eb7 100644 (file)
@@ -144,7 +144,7 @@ int main(int argc, char *argv[])
                        ftdm_channel_call_indicate(lchan, ind);
                        stop = ftdm_current_time_in_ms();
                        diff = stop - start;
-                       ftdm_log(FTDM_LOG_DEBUG, "Setting indication %s took %llums\n", 
+                       ftdm_log(FTDM_LOG_DEBUG, "Setting indication %s took %"FTDM_TIME_FMT" ms\n",
                                        ftdm_channel_indication2str(ind), diff);
                }
        }