Blame src/mw_debug.c.format-security-fix

Packit 014ca4
Packit 014ca4
/*
Packit 014ca4
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit 014ca4
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit 014ca4
  
Packit 014ca4
  This library is free software; you can redistribute it and/or
Packit 014ca4
  modify it under the terms of the GNU Library General Public
Packit 014ca4
  License as published by the Free Software Foundation; either
Packit 014ca4
  version 2 of the License, or (at your option) any later version.
Packit 014ca4
  
Packit 014ca4
  This library is distributed in the hope that it will be useful,
Packit 014ca4
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 014ca4
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 014ca4
  Library General Public License for more details.
Packit 014ca4
  
Packit 014ca4
  You should have received a copy of the GNU Library General Public
Packit 014ca4
  License along with this library; if not, write to the Free
Packit 014ca4
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit 014ca4
*/
Packit 014ca4
Packit 014ca4
Packit 014ca4
#include <glib.h>
Packit 014ca4
Packit 014ca4
#include "mw_debug.h"
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
#define FRMT1            "%02x"
Packit 014ca4
#define FRMT2            FRMT1 FRMT1 " "
Packit 014ca4
#define FRMT4            FRMT2 FRMT2
Packit 014ca4
#define FRMT8            FRMT4 FRMT4
Packit 014ca4
#define FRMT16           FRMT8 FRMT8
Packit 014ca4
Packit 014ca4
#define ADVANCE(b, n, c)  {b += c; n -= c;}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
/** writes hex pairs of buf to str */
Packit 014ca4
static void pretty_print(GString *str, const guchar *buf, gsize len) {
Packit 014ca4
  while(len >= 16) {
Packit 014ca4
    /* write a complete line */
Packit 014ca4
    g_string_append_printf(str, FRMT16,
Packit 014ca4
			   buf[0],  buf[1],  buf[2],  buf[3],
Packit 014ca4
			   buf[4],  buf[5],  buf[6],  buf[7],
Packit 014ca4
			   buf[8],  buf[9],  buf[10], buf[11],
Packit 014ca4
			   buf[12], buf[13], buf[14], buf[15]);
Packit 014ca4
    ADVANCE(buf, len, 16);
Packit 014ca4
    
Packit 014ca4
    /* append \n to each line but the last */
Packit 014ca4
    if(len) g_string_append(str, "\n");
Packit 014ca4
  }
Packit 014ca4
Packit 014ca4
  /* write an incomplete line */
Packit 014ca4
  if(len >= 8) {
Packit 014ca4
    g_string_append_printf(str, FRMT8,
Packit 014ca4
			   buf[0], buf[1], buf[2], buf[3],
Packit 014ca4
			   buf[4], buf[5], buf[6], buf[7]);
Packit 014ca4
    ADVANCE(buf, len, 8);
Packit 014ca4
  }
Packit 014ca4
  
Packit 014ca4
  if(len >= 4) {
Packit 014ca4
    g_string_append_printf(str, FRMT4,
Packit 014ca4
			   buf[0], buf[1], buf[2], buf[3]);
Packit 014ca4
    ADVANCE(buf, len, 4);
Packit 014ca4
  }
Packit 014ca4
Packit 014ca4
  if(len >= 2) {
Packit 014ca4
    g_string_append_printf(str, FRMT2, buf[0], buf[1]);
Packit 014ca4
    ADVANCE(buf, len, 2);
Packit 014ca4
  }
Packit 014ca4
Packit 014ca4
  if(len >= 1) {
Packit 014ca4
    g_string_append_printf(str, FRMT1, buf[0]);
Packit 014ca4
    ADVANCE(buf, len, 1);
Packit 014ca4
  }
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_debug_datav(const guchar *buf, gsize len,
Packit 014ca4
		    const char *msg, va_list args) {
Packit 014ca4
  GString *str;
Packit 014ca4
Packit 014ca4
  g_return_if_fail(buf != NULL || len == 0);
Packit 014ca4
Packit 014ca4
  str = g_string_new(NULL);
Packit 014ca4
Packit 014ca4
  if(msg) {
Packit 014ca4
    char *txt = g_strdup_vprintf(msg, args);
Packit 014ca4
    g_string_append_printf(str, "%s\n", txt);
Packit 014ca4
    g_free(txt);
Packit 014ca4
  }
Packit 014ca4
  pretty_print(str, buf, len);
Packit 014ca4
Packit 014ca4
  g_debug(str->str);
Packit 014ca4
  g_string_free(str, TRUE);
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_debug_data(const guchar *buf, gsize len,
Packit 014ca4
		   const char *msg, ...) {
Packit 014ca4
  va_list args;
Packit 014ca4
  
Packit 014ca4
  g_return_if_fail(buf != NULL || len == 0);
Packit 014ca4
Packit 014ca4
  va_start(args, msg);
Packit 014ca4
  mw_debug_datav(buf, len, msg, args);
Packit 014ca4
  va_end(args);
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_debug_opaquev(struct mwOpaque *o, const char *txt, va_list args) {
Packit 014ca4
  g_return_if_fail(o != NULL);
Packit 014ca4
  mw_debug_datav(o->data, o->len, txt, args);
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_debug_opaque(struct mwOpaque *o, const char *txt, ...) {
Packit 014ca4
  va_list args;
Packit 014ca4
Packit 014ca4
  g_return_if_fail(o != NULL);
Packit 014ca4
Packit 014ca4
  va_start(args, txt);
Packit 014ca4
  mw_debug_opaquev(o, txt, args);
Packit 014ca4
  va_end(args);
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_mailme_datav(const guchar *buf, gsize len,
Packit 014ca4
		     const char *info, va_list args) {
Packit 014ca4
Packit 014ca4
#if MW_MAILME
Packit 014ca4
  GString *str;
Packit 014ca4
  char *txt;
Packit 014ca4
Packit 014ca4
  str = g_string_new(MW_MAILME_MESSAGE "\n"
Packit 014ca4
		     "  Please send mail to: " MW_MAILME_ADDRESS "\n"
Packit 014ca4
		     MW_MAILME_CUT_START "\n");
Packit 014ca4
  str = g_string_new(NULL);
Packit 014ca4
Packit 014ca4
  txt = g_strdup_vprintf(info, args);
Packit 014ca4
  g_string_append_printf(str, "%s\n", txt);
Packit 014ca4
  g_free(txt);
Packit 014ca4
Packit 014ca4
  if(buf && len) pretty_print(str, buf, len);
Packit 014ca4
Packit 014ca4
  g_string_append(str, MW_MAILME_CUT_STOP);
Packit 014ca4
Packit 014ca4
  g_debug(str->str);
Packit 014ca4
  g_string_free(str, TRUE);
Packit 014ca4
Packit 014ca4
#else
Packit 014ca4
  mw_debug_datav(buf, len, info, args);
Packit 014ca4
Packit 014ca4
#endif
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_mailme_data(const guchar *buf, gsize len,
Packit 014ca4
		    const char *info, ...) {
Packit 014ca4
  va_list args;
Packit 014ca4
  va_start(args, info);
Packit 014ca4
  mw_mailme_datav(buf, len, info, args);
Packit 014ca4
  va_end(args);
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_mailme_opaquev(struct mwOpaque *o, const char *info, va_list args) {
Packit 014ca4
  mw_mailme_datav(o->data, o->len, info, args);
Packit 014ca4
}
Packit 014ca4
Packit 014ca4
Packit 014ca4
Packit 014ca4
void mw_mailme_opaque(struct mwOpaque *o, const char *info, ...) {
Packit 014ca4
  va_list args;
Packit 014ca4
  va_start(args, info);
Packit 014ca4
  mw_mailme_opaquev(o, info, args);
Packit 014ca4
  va_end(args);
Packit 014ca4
}