Index: kdelibs/arts/mcop/debug.cc
diff -u kdelibs/arts/mcop/debug.cc:1.6 kdelibs/arts/mcop/debug.cc:1.6.2.2
--- kdelibs/arts/mcop/debug.cc:1.6      Wed Jul 25 12:41:35 2001
+++ kdelibs/arts/mcop/debug.cc  Fri Dec  6 16:12:02 2002
@@ -1,8 +1,11 @@
    /*

-    Copyright (C) 2000 Stefan Westerfeld
+    Copyright (C) 2000-2002 Stefan Westerfeld
                       [email protected]

+       (see also below for details on the copyright of arts_strdup_printf,
+        which is taken from GLib)
+
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
@@ -33,8 +36,36 @@
static char *messageAppName = 0;
static Arts::Mutex *arts_debug_mutex = 0;

+/* routines for variable length sprintf without buffer overflow (from GLib) */
+static char* arts_strdup_vprintf(const char *format, va_list args1);
+static char* arts_strdup_printf (const char *format, ...);
+
namespace Arts {

+static char * shell_quote(const char *s)
+{
+   char *result;
+   char *p;
+   p = result = (char *) malloc(strlen(s)*5+1);
+   while(*s)
+   {
+     if (*s == '\'')
+     {
+        *p++ = '\'';
+        *p++ = '"';
+        *p++ = *s++;
+        *p++ = '"';
+        *p++ = '\'';
+     }
+     else
+     {
+        *p++ = *s++;
+     }
+   }
+   *p = '\0';
+   return result;
+}
+
/*
 * Call the graphical application to display a message, if
 * defined. Otherwise, send to standard error. Debug messages are
@@ -42,8 +73,9 @@
 * Note that the external application is run in the background to
 * avoid blocking the sound server.
 */
-void output_message(Debug::Level level, const char *msg) {
-       char buff[1024];
+static void output_message(Debug::Level level, const char *msg) {
+       char *quoted_msg;
+       char *buff = 0;

       /* default to text output if no message app is defined or if it is a debug message. */
       if (messageAppName == 0 || !strcmp(messageAppName, "") || (level == Debug::lDebug))
@@ -52,20 +84,27 @@
               return;
       }

+        quoted_msg = shell_quote(msg);
       switch (level) {
         case Debug::lFatal:
-                 sprintf(buff, "%s -e \"Sound server fatal error:\n\n%s\" &", messageAppName, msg);
+                 buff = arts_strdup_printf("%s -e 'Sound server fatal error:\n\n%s' &", messageAppName, quoted_msg);
                 break;
         case Debug::lWarning:
-                 sprintf(buff, "%s -w \"Sound server warning message:\n\n%s\" &", messageAppName, msg);
+                 buff = arts_strdup_printf("%s -w 'Sound server warning message:\n\n%s' &", messageAppName, quoted_msg);
                 break;
         case Debug::lInfo:
-                 sprintf(buff, "%s -i \"Sound server informational message:\n\n%s\" &", messageAppName, msg);
+                 buff = arts_strdup_printf("%s -i 'Sound server informational message:\n\n%s' &", messageAppName, quoted_msg);
                 break;
         default:
                 break; // avoid compile warning
       }
+       free(quoted_msg);
+
+       if(buff != 0)
+       {
       system(buff);
+               free(buff);
+       }
}

/*
@@ -76,7 +115,7 @@
 * previously repeated message (if any) and reset the last message and
 * count.
 */
-void display_message(Debug::Level level, const char *msg) {
+static void display_message(Debug::Level level, const char *msg) {
       static char lastMsg[1024];
       static Debug::Level lastLevel;
       static int msgCount = 0;
@@ -90,9 +129,10 @@
       } else {
               if (msgCount > 0)
               {
-                       char buff[1024];
-                       sprintf(buff, "%s\n(The previous message was repeated %d times.)", lastMsg, msgCount);
+                       char *buff;
+                       buff = arts_strdup_printf("%s\n(The previous message was repeated %d times.)", lastMsg, msgCount);
                       output_message(lastLevel, buff);
+                       free(buff);
               }
               strncpy(lastMsg, msg, 1024);
               lastLevel = level;
@@ -140,12 +180,15 @@

void Arts::Debug::fatal(const char *fmt, ...)
{
-       char buff[1024];
+       char *buff;
    va_list ap;
+
    va_start(ap, fmt);
-       vsprintf(buff, fmt, ap);
+       buff = arts_strdup_vprintf(fmt, ap);
    va_end(ap);
+
       display_message(Debug::lFatal, buff);
+       free(buff);

       if(arts_debug_abort) abort();
       exit(1);
@@ -155,12 +198,15 @@
{
       if(lWarning >= arts_debug_level)
       {
-               char buff[1024];
+               char *buff;
               va_list ap;
+
               va_start(ap, fmt);
-               vsprintf(buff, fmt, ap);
+               buff = arts_strdup_vprintf(fmt, ap);
               va_end(ap);
+
               display_message(Debug::lWarning, buff);
+               free(buff);
       }
}

@@ -168,12 +214,15 @@
{
       if(lInfo >= arts_debug_level)
       {
-               char buff[1024];
+               char *buff;
               va_list ap;
+
               va_start(ap, fmt);
-               vsprintf(buff, fmt, ap);
+               buff = arts_strdup_vprintf(fmt, ap);
               va_end(ap);
+
               display_message(Debug::lInfo, buff);
+               free(buff);
       }
}

@@ -181,12 +230,15 @@
{
       if(lDebug >= arts_debug_level)
       {
-               char buff[1024];
+               char *buff;
               va_list ap;
+
               va_start(ap, fmt);
-               vsprintf(buff, fmt, ap);
+               buff = arts_strdup_vprintf(fmt, ap);
               va_end(ap);
+
               display_message(Debug::lDebug, buff);
+               free(buff);
       }
}

@@ -209,4 +261,551 @@

       delete arts_debug_mutex;
       arts_debug_mutex = 0;
+}
+
+/*
+ * For the sake of portability (snprintf is non-portable), what follows is an
+ * implementation of a variant g_strdup_printf, to format debug messages of
+ * an arbitary length appropriately. This is reduntant with flow/gsl/gslglib.c,
+ * however, as libmcop doesn't necessarily link against gslglib.c, this is a
+ * more-or-less complete copy.
+ */
+
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * GScanner: Flexible lexical scanner for general purpose.
+ * Copyright (C) 1997, 1998 Tim Janik
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GLib Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+
+#include <sys/types.h>
+#include <stdarg.h>
+#include <string.h>
+
+#define g_warning printf
+#define g_strerror strerror
+
+/*--- gslglib.h ---*/
+
+#include <limits.h>
+#include <float.h>
+#include <stddef.h>
+#include <stdarg.h>
+
+/* --- GLib typedefs --- */
+typedef void*           gpointer;
+typedef const void*     gconstpointer;
+typedef char            gchar;
+typedef unsigned char   guchar;
+typedef signed short    gshort;
+typedef unsigned short  gushort;
+typedef signed int      gint;
+typedef unsigned int    guint;
+typedef signed long     glong;
+typedef unsigned long   gulong;
+typedef float           gfloat;
+typedef double          gdouble;
+typedef size_t          gsize;
+typedef gchar           gint8;
+typedef guchar          guint8;
+typedef gshort          gint16;
+typedef gushort         guint16;
+typedef gint            gint32;
+typedef guint           guint32;
+typedef gint            gboolean;
+typedef gint32          GTime;
+#ifdef __alpha
+typedef long int                gint64;
+typedef unsigned long int       guint64;
+#else
+typedef long long int   gint64;
+typedef unsigned long long int  guint64;
+#endif
+typedef struct _GString GString;
+
+/* --- standard macros --- */
+#ifndef ABS
+#define ABS(a)          ((a) > 0 ? (a) : -(a))
+#endif
+#ifndef MAX
+#define MAX(a,b)        ((a) > (b) ? (a) : (b))
+#endif
+#ifndef MIN
+#define MIN(a,b)        ((a) < (b) ? (a) : (b))
+#endif
+#ifndef CLAMP
+#define CLAMP(v,l,h)    ((v) < (l) ? (l) : (v) > (h) ? (h) : (v))
+#endif
+#ifndef FALSE
+#define FALSE           0
+#endif
+#ifndef TRUE
+#define TRUE            (!FALSE)
+#endif
+#ifndef NULL
+#define NULL            ((void*) 0)
+#endif
+
+/* --- configure stuff!!! --- */
+#ifdef WORDS_BIGENDIAN
+#define G_BYTE_ORDER G_BIG_ENDIAN
+#else
+#define G_BYTE_ORDER G_LITTLE_ENDIAN
+#endif
+
+/* #define      GLIB_HAVE_STPCPY        1 */
+/* Define G_VA_COPY() to do the right thing for copying va_list variables.
+ * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy.
+ */
+#if !defined (G_VA_COPY)
+#  if defined (__GNUC__) && ( defined (__PPC__) || defined (__s390__) ) && (defined (_CALL_SYSV) || defined (_WIN32) || defined (__s390__) )
+#    define G_VA_COPY(ap1, ap2)   (*(ap1) = *(ap2))
+#  elif defined (G_VA_COPY_AS_ARRAY)
+#    define G_VA_COPY(ap1, ap2)   g_memmove ((ap1), (ap2), sizeof (va_list))
+#  else /* va_list is a pointer */
+#    define G_VA_COPY(ap1, ap2)   ((ap1) = (ap2))
+#  endif /* va_list is a pointer */
+#endif /* !G_VA_COPY */
+
+/* --- glib macros --- */
+#define G_MINFLOAT      FLT_MIN
+#define G_MAXFLOAT      FLT_MAX
+#define G_MINDOUBLE     DBL_MIN
+#define G_MAXDOUBLE     DBL_MAX
+#define G_MINSHORT      SHRT_MIN
+#define G_MAXSHORT      SHRT_MAX
+#define G_MAXUSHORT     USHRT_MAX
+#define G_MININT        INT_MIN
+#define G_MAXINT        INT_MAX
+#define G_MAXUINT       UINT_MAX
+#define G_MINLONG       LONG_MIN
+#define G_MAXLONG       LONG_MAX
+#define G_MAXULONG      ULONG_MAX
+#define G_USEC_PER_SEC  1000000
+#define G_LITTLE_ENDIAN 1234
+#define G_BIG_ENDIAN    4321
+
+#define G_STRINGIFY(macro_or_string)    G_STRINGIFY_ARG (macro_or_string)
+#define G_STRINGIFY_ARG(contents)       #contents
+#if  defined __GNUC__ && !defined __cplusplus
+#  define G_STRLOC      __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"
+#else
+#  define G_STRLOC      __FILE__ ":" G_STRINGIFY (__LINE__)
+#endif
+
+/* subtract from biased_exponent to form base2 exponent (normal numbers) */
+typedef union  _GDoubleIEEE754  GDoubleIEEE754;
+typedef union  _GFloatIEEE754   GFloatIEEE754;
+#define G_IEEE754_FLOAT_BIAS    (127)
+#define G_IEEE754_DOUBLE_BIAS   (1023)
+/* multiply with base2 exponent to get base10 exponent (nomal numbers) */
+#define G_LOG_2_BASE_10         (0.30102999566398119521)
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+union _GFloatIEEE754
+{
+  gfloat v_float;
+  struct {
+    guint mantissa : 23;
+    guint biased_exponent : 8;
+    guint sign : 1;
+  } mpn;
+};
+union _GDoubleIEEE754
+{
+  gdouble v_double;
+  struct {
+    guint mantissa_low : 32;
+    guint mantissa_high : 20;
+    guint biased_exponent : 11;
+    guint sign : 1;
+  } mpn;
+};
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+union _GFloatIEEE754
+{
+  gfloat v_float;
+  struct {
+    guint sign : 1;
+    guint biased_exponent : 8;
+    guint mantissa : 23;
+  } mpn;
+};
+union _GDoubleIEEE754
+{
+  gdouble v_double;
+  struct {
+    guint sign : 1;
+    guint biased_exponent : 11;
+    guint mantissa_high : 20;
+    guint mantissa_low : 32;
+  } mpn;
+};
+#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+#error unknown ENDIAN type
+#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#define GLIB_SIZEOF_INTMAX      (8 /* educated guess */)
+
+typedef struct
+{
+  guint min_width;
+  guint precision;
+  gboolean alternate_format, zero_padding, adjust_left, locale_grouping;
+  gboolean add_space, add_sign, possible_sign, seen_precision;
+  gboolean mod_half, mod_long, mod_extra_long;
+} PrintfArgSpec;
+
+
+static gsize
+printf_string_upper_bound (const gchar *format,
+                           gboolean     may_warn,
+                           va_list      args)
+{
+  static  gboolean honour_longs = sizeof(long) > 4 || sizeof(void*) > 4;
+  gsize len = 1;
+
+  if (!format)
+    return len;
+
+  while (*format)
+    {
+      register gchar c = *format++;
+
+      if (c != '%')
+        len += 1;
+      else /* (c == '%') */
+        {
+          PrintfArgSpec spec = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+          gboolean seen_l = FALSE, conv_done = FALSE;
+          gsize conv_len = 0;
+          const gchar *spec_start = format;
+
+          do
+            {
+              c = *format++;
+              switch (c)
+                {
+                  GDoubleIEEE754 u_double;
+                  guint v_uint;
+                  gint v_int;
+                  const gchar *v_string;
+
+                  /* beware of positional parameters
+                   */
+                case '$':
+                  if (may_warn)
+                    g_warning (G_STRLOC ": unable to handle positional parameters (%%n$)");
+                  len += 1024; /* try adding some safety padding */
+                  break;
+
+                  /* parse flags
+                   */
+                case '#':
+                  spec.alternate_format = TRUE;
+                  break;
+                case '0':
+                  spec.zero_padding = TRUE;
+                  break;
+                case '-':
+                  spec.adjust_left = TRUE;
+                  break;
+                case ' ':
+                  spec.add_space = TRUE;
+                  break;
+                case '+':
+                  spec.add_sign = TRUE;
+                  break;
+                case '\'':
+                  spec.locale_grouping = TRUE;
+                  break;
+
+                  /* parse output size specifications
+                   */
+                case '.':
+                  spec.seen_precision = TRUE;
+                  break;
+                case '1':
+                case '2':
+                case '3':
+                case '4':
+                case '5':
+                case '6':
+                case '7':
+                case '8':
+                case '9':
+                  v_uint = c - '0';
+                  c = *format;
+                  while (c >= '0' && c <= '9')
+                    {
+                      format++;
+                      v_uint = v_uint * 10 + c - '0';
+                      c = *format;
+                    }
+                  if (spec.seen_precision)
+                    spec.precision = MAX (spec.precision, v_uint);
+                  else
+                    spec.min_width = MAX (spec.min_width, v_uint);
+                  break;
+                case '*':
+                  v_int = va_arg (args, int);
+                  if (spec.seen_precision)
+                    {
+                      /* forget about negative precision */
+                      if (v_int >= 0)
+                        spec.precision = MAX (spec.precision, (unsigned)v_int);
+                    }
+                  else
+                    {
+                      if (v_int < 0)
+                        {
+                          v_int = - v_int;
+                          spec.adjust_left = TRUE;
+                        }
+                      spec.min_width = MAX (spec.min_width, (unsigned)v_int);
+                    }
+                  break;
+
+                  /* parse type modifiers
+                   */
+                case 'h':
+                  spec.mod_half = TRUE;
+                  break;
+                case 'l':
+                  if (!seen_l)
+                    {
+                      spec.mod_long = TRUE;
+                      seen_l = TRUE;
+                      break;
+                    }
+                  /* else, fall through */
+                case 'L':
+                case 'q':
+                  spec.mod_long = TRUE;
+                  spec.mod_extra_long = TRUE;
+                  break;
+                case 'z':
+                case 'Z':
+                  if (sizeof(size_t))
+                    {
+                      spec.mod_long = TRUE;
+                      spec.mod_extra_long = TRUE;
+                    }
+                  break;
+                case 't':
+                  if (sizeof(ptrdiff_t) > 4)
+                    {
+                      spec.mod_long = TRUE;
+                      spec.mod_extra_long = TRUE;
+                    }
+                  break;
+                case 'j':
+                  if (GLIB_SIZEOF_INTMAX > 4)
+                    {
+                      spec.mod_long = TRUE;
+                      spec.mod_extra_long = TRUE;
+                    }
+                  break;
+
+                  /* parse output conversions
+                   */
+                case '%':
+                  conv_len += 1;
+                  break;
+                case 'O':
+                case 'D':
+                case 'I':
+                case 'U':
+                  /* some C libraries feature long variants for these as well? */
+                  spec.mod_long = TRUE;
+                  /* fall through */
+                case 'o':
+                  conv_len += 2;
+                  /* fall through */
+                case 'd':
+                case 'i':
+                  conv_len += 1; /* sign */
+                  /* fall through */
+                case 'u':
+                  conv_len += 4;
+                  /* fall through */
+                case 'x':
+                case 'X':
+                  spec.possible_sign = TRUE;
+                  conv_len += 10;
+                  if (spec.mod_long && honour_longs)
+                    conv_len *= 2;
+                  if (spec.mod_extra_long)
+                    conv_len *= 2;
+                  if (spec.mod_extra_long)
+                    {
+                      (void) va_arg (args, gint64);
+                    }
+                  else if (spec.mod_long)
+                    (void) va_arg (args, long);
+                  else
+                    (void) va_arg (args, int);
+                  break;
+                case 'A':
+                case 'a':
+                  /*          0x */
+                  conv_len += 2;
+                  /* fall through */
+                case 'g':
+                case 'G':
+                case 'e':
+                case 'E':
+                case 'f':
+                  spec.possible_sign = TRUE;
+                  /*          n   .   dddddddddddddddddddddddd   E   +-  eeee */
+                  conv_len += 1 + 1 + MAX (24, spec.precision) + 1 + 1 + 4;
+                  if (may_warn && spec.mod_extra_long)
+                    g_warning (G_STRLOC ": unable to handle long double, collecting double only");
+#ifdef HAVE_LONG_DOUBLE
+#error need to implement special handling for long double
+#endif
+                  u_double.v_double = va_arg (args, double);
+                  /* %f can expand up to all significant digits before '.' (308) */
+                  if (c == 'f' &&
+                      u_double.mpn.biased_exponent > 0 && u_double.mpn.biased_exponent < 2047)
+                    {
+                      gint exp = u_double.mpn.biased_exponent;
+
+                      exp -= G_IEEE754_DOUBLE_BIAS;
+                      exp = (gint)(exp * G_LOG_2_BASE_10 + 1);
+                      conv_len += ABS (exp);    /* exp can be <0 */
+                    }
+                  /* some printf() implementations require extra padding for rounding */
+                  conv_len += 2;
+                  /* we can't really handle locale specific grouping here */
+                  if (spec.locale_grouping)
+                    conv_len *= 2;
+                  break;
+                case 'C':
+                  spec.mod_long = TRUE;
+                  /* fall through */
+                case 'c':
+                  conv_len += spec.mod_long ? MB_LEN_MAX : 1;
+                  (void) va_arg (args, int);
+                  break;
+                case 'S':
+                  spec.mod_long = TRUE;
+                  /* fall through */
+                case 's':
+                  v_string = va_arg (args, char*);
+                  if (!v_string)
+                    conv_len += 8; /* hold "(null)" */
+                  else if (spec.seen_precision)
+                    conv_len += spec.precision;
+                  else
+                    conv_len += strlen (v_string);
+                  conv_done = TRUE;
+                  if (spec.mod_long)
+                    {
+                      if (may_warn)
+                        g_warning (G_STRLOC": unable to handle wide char strings");
+                      len += 1024; /* try adding some safety padding */
+                    }
+                  break;
+                case 'P': /* do we actually need this? */
+                  /* fall through */
+                case 'p':
+                  spec.alternate_format = TRUE;
+                  conv_len += 10;
+                  if (honour_longs)
+                    conv_len *= 2;
+                  /* fall through */
+                case 'n':
+                  conv_done = TRUE;
+                  (void) va_arg (args, void*);
+                  break;
+                case 'm':
+                  /* there's not much we can do to be clever */
+                  v_string = g_strerror (errno);
+                  v_uint = v_string ? strlen (v_string) : 0;
+                  conv_len += MAX (256, v_uint);
+                  break;
+
+                  /* handle invalid cases
+                   */
+                case '\000':
+                  /* no conversion specification, bad bad */
+                  conv_len += format - spec_start;
+                  break;
+                default:
+                  if (may_warn)
+                    g_warning (G_STRLOC": unable to handle `%c' while parsing format",
+                               c);
+                  break;
+                }
+              conv_done |= conv_len > 0;
+            }
+          while (!conv_done);
+          /* handle width specifications */
+          conv_len = MAX (conv_len, MAX (spec.precision, spec.min_width));
+          /* handle flags */
+          conv_len += spec.alternate_format ? 2 : 0;
+          conv_len += (spec.add_space || spec.add_sign || spec.possible_sign);
+          /* finally done */
+          len += conv_len;
+        } /* else (c == '%') */
+    } /* while (*format) */
+
+  return len;
+}
+
+static char*
+arts_strdup_vprintf (const char *format, va_list args1)
+{
+  gchar *buffer;
+  va_list args2;
+
+  G_VA_COPY (args2, args1);
+
+  buffer = (gchar *)malloc (printf_string_upper_bound (format, TRUE, args1));
+
+  vsprintf (buffer, format, args2);
+  va_end (args2);
+
+  return buffer;
+}
+
+char*
+arts_strdup_printf (const char *format, ...)
+{
+  gchar *buffer;
+  va_list args;
+
+  va_start (args, format);
+  buffer = arts_strdup_vprintf (format, args);
+  va_end (args);
+
+  return buffer;
}
Index: kdelibs/dcop/dcopc.c
diff -u kdelibs/dcop/dcopc.c:1.17 kdelibs/dcop/dcopc.c:1.17.2.1
--- kdelibs/dcop/dcopc.c:1.17   Wed Apr 18 18:18:55 2001
+++ kdelibs/dcop/dcopc.c        Sat Dec  7 18:48:29 2002
@@ -36,6 +36,9 @@
#include "dcopglobal.h"
#include "dcopc.h"

+
+#define BUFFER_SIZE 1024
+
enum {
  DCOP_REPLY_PENDING,
  DCOP_REPLY_OK,
@@ -133,7 +136,11 @@
  int length;
  char * pos = dcop_read_int(buf, &length);
  fprintf(stderr, "dcop_read_string: length == %d\n", length);
+
  *output = (char *)malloc(length);
+  if (*output == NULL)
+    return pos;
+
  memcpy(*output, pos, length);
  return pos + length;
}
@@ -215,6 +222,8 @@

      fprintf(stderr, "dcop_process_message(): length == %ld\n", length);
      buf = (char *)malloc(length);
+      if (buf == NULL)
+        return;
      status = IceReadData(dcop_ice_conn, length, buf);
      if (False == status) {
        fprintf(stderr, "dcop_process_message(): IceReadData failed\n");
@@ -253,6 +262,9 @@
      fprintf(stderr, "dcop_process_message(): DCOPSend received\n");

      buf = (char *)malloc(length);
+      if (buf == NULL)
+        return;
+
      IceReadData(dcop_ice_conn, length, buf);

      pos = buf;
@@ -307,6 +319,8 @@

  struct DCOPMsg * pMsgPtr = 0;

+  static const char sAnonymous = "anonymous";
+
  if (0 == dcop_ice_conn) {
    fprintf(stderr, "Try running dcop_attach(), moron\n");
    return False;
@@ -338,10 +352,19 @@
   * as last field into the dcop msg header ;-)
   */

-  header = (char *)malloc(1024);
+  headerLength = strlen(sAnonymous) + 1 +
+                 strlen(receiving_app) + 1 +
+                 strlen(object) + 1 +
+                 strlen(function) + 1 +
+                 4*5;  /* 4 string lengths + 1 int */
+
+  header = (char *)malloc(headerLength);
+  if (header == NULL)
+    return False;
+
  pos = header;

-  pos = dcop_write_string(pos, "anonymous");
+  pos = dcop_write_string(pos, sAnonymous);
  pos = dcop_write_string(pos, receiving_app);
  pos = dcop_write_string(pos, object);
  pos = dcop_write_string(pos, function);
@@ -423,6 +446,8 @@
  temp += 1024; /* Extra space for marshalling overhead */

  outputData = (char *)malloc(temp);
+  if (outputData == NULL)
+    return False;

  temp = 0;

@@ -556,10 +581,16 @@
    /* Leave room for "-pid" */
    int len = strlen(app_name) + 64;
    dcop_requested_name = (char *)malloc(len);
+    if (dcop_requested_name == NULL)
+      return NULL;
+
    snprintf(dcop_requested_name, len, "%s-%ld", app_name, (long)getpid());
  }

  data = (char *)malloc(strlen(dcop_requested_name) + 42);
+  if (data == NULL)
+    return NULL;
+
  pos = data;
  pos = dcop_write_string(pos, dcop_requested_name);
  dataLength = pos - data;
@@ -616,6 +647,7 @@
  return (dcop_major_opcode >= 0) ? True : False;
}

+
/***************************************************************************/

  Bool
@@ -628,10 +660,10 @@
  char      * homeDir       = 0L;
  char      * display       = 0L;
  char      * dcopServer    = 0L;
-  char        errBuf[1024];
-  char        fileName[512];
-  char        hostName[256];
-  char        displayName[256];
+  char        errBuf[BUFFER_SIZE];
+  char        fileName[BUFFER_SIZE];
+  char        hostName[BUFFER_SIZE];
+  char        displayName[BUFFER_SIZE];
  char      * i;

  homeDir = getenv("HOME");
@@ -644,7 +676,9 @@
  if (NULL == display)
    return False;

-  strcpy(displayName, display);
+  strncpy(displayName, display, sizeof(displayName));
+  displayName[sizeof(displayName) - 1] = 0;
+
  if((i = strrchr(displayName, '.')) > strrchr(displayName, ':') && i)
      *i = '\0';

@@ -668,9 +702,12 @@
      return False;
    }

-    dcopServer = (char *)malloc(1024);
+    dcopServer = (char *)malloc(BUFFER_SIZE);
+    if (dcopServer == NULL)
+      return False;

-    bytesRead = fread((void *)dcopServer, sizeof(char), 1024, f);
+    bytesRead = fread((void *)dcopServer, sizeof(char), BUFFER_SIZE, f);
+    dcopServer[BUFFER_SIZE - 1] = 0;

    if (0 == bytesRead)
      return False;
@@ -719,7 +756,7 @@
  int           majorVersion  = 0;
  int           minorVersion  = 0;
  int           status        = 0;
-  char          errBuf[1024];
+  char          errBuf[BUFFER_SIZE];

  status =
    IceProtocolSetup(
@@ -731,7 +768,7 @@
      &(minorVersion),
      &(vendor),
      &(release),
-      1024,
+      BUFFER_SIZE,
      errBuf
    );

Index: kdelibs/dcop/dcopserver.cpp
diff -u kdelibs/dcop/dcopserver.cpp:1.130 kdelibs/dcop/dcopserver.cpp:1.130.2.1
--- kdelibs/dcop/dcopserver.cpp:1.130   Thu Aug  2 19:23:20 2001
+++ kdelibs/dcop/dcopserver.cpp Sat Dec  7 18:48:31 2002
@@ -475,12 +475,15 @@
    char tempFile[PATH_MAX];
    char *tmp;

-    sprintf (tempFile, "%s/%sXXXXXX", path, prefix);
+    snprintf (tempFile, PATH_MAX, "%s/%sXXXXXX", path, prefix);
    tmp = (char *) mktemp (tempFile);
    if (tmp)
       {
           char *ptr = (char *) malloc (strlen (tmp) + 1);
-           strcpy (ptr, tmp);
+        if (ptr != NULL)
+        {
+               strcpy (ptr, tmp);
+        }
           return (ptr);
       }
    else
@@ -490,7 +493,7 @@
    char tempFile[PATH_MAX];
    char *ptr;

-    sprintf (tempFile, "%s/%sXXXXXX", path, prefix);
+    snprintf (tempFile, PATH_MAX, "%s/%sXXXXXX", path, prefix);
    ptr = static_cast<char *>(malloc(strlen(tempFile) + 1));
    if (ptr != NULL)
       {
@@ -541,7 +544,7 @@
    FILE        *removefp = NULL;
    const char  *path;
    int         original_umask;
-    char        command[256];
+    char        command[PATH_MAX + 32];
    int         i;
#ifdef HAVE_MKSTEMP
    int         fd;
@@ -613,7 +616,7 @@

    umask (original_umask);

-    sprintf (command, "iceauth source %s", addAuthFile);
+    snprintf (command, PATH_MAX + 32, "iceauth source %s", addAuthFile);
    system (command);

    unlink(addAuthFile);
Index: kdelibs/dcop/KDE-ICE/Xtrans.c
diff -u kdelibs/dcop/KDE-ICE/Xtrans.c:1.2 kdelibs/dcop/KDE-ICE/Xtrans.c:1.2.2.1
--- kdelibs/dcop/KDE-ICE/Xtrans.c:1.2   Mon May 14 08:32:16 2001
+++ kdelibs/dcop/KDE-ICE/Xtrans.c       Sat Dec  7 18:48:25 2002
@@ -1021,7 +1021,7 @@
       if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN)
           continue;

-       sprintf(buffer,"%s/:%s", trans->TransName, port ? port : "");
+       snprintf(buffer, 256, "%s/:%s", trans->TransName, port ? port : "");

       PRMSG (5,"MakeAllCOTSServerListeners: opening %s\n",
              buffer, 0, 0);
@@ -1123,7 +1123,7 @@
       if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN)
           continue;

-       sprintf(buffer,"%s/:%s", trans->TransName, port ? port : "");
+       snprintf(buffer, 256, "%s/:%s", trans->TransName, port ? port : "");

       PRMSG (5,"MakeAllCLTSServerListeners: opening %s\n",
           buffer, 0, 0);
Index: kdelibs/dcop/KDE-ICE/Xtransutil.c
diff -u kdelibs/dcop/KDE-ICE/Xtransutil.c:1.4 kdelibs/dcop/KDE-ICE/Xtransutil.c:1.4.2.1
--- kdelibs/dcop/KDE-ICE/Xtransutil.c:1.4       Sun May  6 18:35:54 2001
+++ kdelibs/dcop/KDE-ICE/Xtransutil.c   Sat Dec  7 18:48:26 2002
@@ -367,9 +367,9 @@

       if (np = getnodebyaddr(saddr->sdn_add.a_addr,
           saddr->sdn_add.a_len, AF_DECnet)) {
-           sprintf(addrbuf, "%s:", np->n_name);
+           snprintf(addrbuf, 256, "%s:", np->n_name);
       } else {
-           sprintf(addrbuf, "%s:", dnet_htoa(&saddr->sdn_add));
+           snprintf(addrbuf, 256, "%s:", dnet_htoa(&saddr->sdn_add));
       }
       addr = addrbuf;
       break;
Index: kdelibs/dcop/KDE-ICE/process.c
diff -u kdelibs/dcop/KDE-ICE/process.c:1.2 kdelibs/dcop/KDE-ICE/process.c:1.2.2.1
--- kdelibs/dcop/KDE-ICE/process.c:1.2  Tue Mar 13 02:36:38 2001
+++ kdelibs/dcop/KDE-ICE/process.c      Sat Dec  7 18:48:28 2002
@@ -734,7 +734,7 @@
           case IceMajorOpcodeDuplicate:

               prefix = "The major opcode was already used : ";
-               errorStr = (char *) malloc (strlen (prefix) + 2);
+               errorStr = (char *) malloc (strlen (prefix) + 16);
               sprintf (errorStr, "%s%d", prefix, (int) *pData);
               break;

Index: kdelibs/kdecore/kapp.cpp
diff -u kdelibs/kdecore/kapp.cpp:1.454.2.2 kdelibs/kdecore/kapp.cpp:1.454.2.3
--- kdelibs/kdecore/kapp.cpp:1.454.2.2  Sun Sep  2 21:36:47 2001
+++ kdelibs/kdecore/kapp.cpp    Wed Dec  5 02:42:24 2001
@@ -2163,6 +2163,8 @@
  int pos = dirName.findRev('/');
  if ( pos == -1 )
    return false;   // No path in argument. This is evil, we won't allow this
+  else if ( pos == 0 ) // don't turn e.g. /root into an empty string
+      pos = 1;

  dirName.truncate(pos); // strip everything starting from the last '/'

Index: kdelibs/kdecore/kdebug.cpp
diff -u kdelibs/kdecore/kdebug.cpp:1.97 kdelibs/kdecore/kdebug.cpp:1.97.2.2
--- kdelibs/kdecore/kdebug.cpp:1.97     Sun Jul 29 14:58:58 2001
+++ kdelibs/kdecore/kdebug.cpp  Fri Dec  6 03:31:52 2002
@@ -276,7 +276,7 @@
          }
        case 3: // syslog
          {
-             syslog( nPriority, data);
+             syslog( nPriority, "%s", data);
          }
        case 4: // nothing
          {
@@ -448,7 +448,8 @@
    char buf[4096];
    va_list arguments;
    va_start( arguments, format );
-    vsprintf( buf, format, arguments );
+    buf[sizeof(buf)-1] = '\0';
+    vsnprintf( buf, sizeof(buf)-1, format, arguments );
    va_end(arguments);
    *this << buf;
    return *this;
Index: kdelibs/kdecore/ktempfile.cpp
diff -u kdelibs/kdecore/ktempfile.cpp:1.19.2.1 kdelibs/kdecore/ktempfile.cpp:1.19.2.2
--- kdelibs/kdecore/ktempfile.cpp:1.19.2.1      Sat Aug 11 07:12:17 2001
+++ kdelibs/kdecore/ktempfile.cpp       Mon Dec  3 01:48:46 2001
@@ -90,6 +90,9 @@
KTempFile::create(const QString &filePrefix, const QString &fileExtension,
                 int mode)
{
+   // make sure the random seed is randomized
+   (void) KApplication::random();
+
   QCString ext = QFile::encodeName(fileExtension);
   QCString nme = QFile::encodeName(filePrefix) + "XXXXXX" + ext;
   if((mFd = mkstemps(nme.data(), ext.length())) < 0)
Index: kdelibs/kdecore/netsupp.cpp
diff -u kdelibs/kdecore/netsupp.cpp:1.21.2.3 kdelibs/kdecore/netsupp.cpp:1.21.2.4
--- kdelibs/kdecore/netsupp.cpp:1.21.2.3        Wed Oct 24 21:43:45 2001
+++ kdelibs/kdecore/netsupp.cpp Fri Dec 13 11:18:08 2002
@@ -926,7 +926,7 @@

      if (servlen && serv != NULL)
       *serv = '\0';
-      if (host == NULL || hostlen < strlen(s._sun->sun_path))
+      if (host != NULL && hostlen > strlen(s._sun->sun_path))
       strcpy(host, s._sun->sun_path);

      return 0;
@@ -1008,7 +1008,7 @@
    {
      sprintf(buf2, "%u.%u.%u.%u", data[0], data[1], data[2], data[3]);

-      if (len >= strlen(buf2))
+      if (len > strlen(buf2))
       {
         strcpy(buf, buf2);
         return buf;
@@ -1077,7 +1077,7 @@
           }
       }

-      if (strlen(buf2) <= len)
+      if (strlen(buf2) < len)
       {
         strcpy(buf, buf2);
         return buf;
Index: kdelibs/kdecore/tests/kmemtest.cpp
diff -u kdelibs/kdecore/tests/kmemtest.cpp:1.1 kdelibs/kdecore/tests/kmemtest.cpp:1.1.6.1
--- kdelibs/kdecore/tests/kmemtest.cpp:1.1      Tue Feb 22 16:06:49 2000
+++ kdelibs/kdecore/tests/kmemtest.cpp  Sat Dec  7 18:48:32 2002
@@ -165,9 +165,9 @@
     char buf[200];

     if (argc >=3)
-        sprintf(buf, "%s &", argv[2]);
+        snprintf(buf, 200, "%s &", argv[2]);
     else
-        sprintf(buf, "%s &", argv[0]);
+        snprintf(buf, 200, "%s &", argv[0]);

     printf("Waiting for memory usage to settle down....\n");
     long prev = showTotalMem();
Index: kdelibs/kdeprint/lpd/make_driver_db_lpd.c
diff -u kdelibs/kdeprint/lpd/make_driver_db_lpd.c:1.1 kdelibs/kdeprint/lpd/make_driver_db_lpd.c:1.1.2.1
--- kdelibs/kdeprint/lpd/make_driver_db_lpd.c:1.1       Mon Apr  2 15:21:07 2001
+++ kdelibs/kdeprint/lpd/make_driver_db_lpd.c   Sat Dec  7 18:48:33 2002
@@ -82,7 +82,7 @@
                       c2 = strchr(c+12,'}');
                       if (c1 && c2)
                       {
-                               char    model[256], manuf[256];
+                               char    model[BUFFER_SIZE], manuf[BUFFER_SIZE];
                               char    *c3;

                               *c2 = 0;
Index: kdelibs/kdeprint/management/kmwlpd.cpp
diff -u kdelibs/kdeprint/management/kmwlpd.cpp:1.11 kdelibs/kdeprint/management/kmwlpd.cpp:1.11.2.1
--- kdelibs/kdeprint/management/kmwlpd.cpp:1.11 Fri Aug  3 21:59:21 2001
+++ kdelibs/kdeprint/management/kmwlpd.cpp      Sat Dec  7 18:48:34 2002
@@ -122,12 +122,15 @@
       }

       char    buf[1024] = {0};
-       int     n;
+       int     n, tot(1);
kdDebug() << "reading" << endl;
       while ((n=::read(sock,res,63)) > 0)
       {
               res[n] = 0;
+               tot += n;
kdDebug() << buf << endl;
+               if (tot >= 1024)
+                       break;
               strncat(buf,res,1023);
       }
       close(sock);
Index: kdelibs/kdeprint/management/smbview.cpp
diff -u kdelibs/kdeprint/management/smbview.cpp:1.3 kdelibs/kdeprint/management/smbview.cpp:1.3.2.1
--- kdelibs/kdeprint/management/smbview.cpp:1.3 Mon Apr  2 21:01:00 2001
+++ kdelibs/kdeprint/management/smbview.cpp     Fri Dec 13 12:23:22 2002
@@ -19,6 +19,9 @@

#include "smbview.h"

+#include <config.h>
+#include <stdlib.h>
+
#include <kprocess.h>
#include <qheader.h>
#include <qapplication.h>
@@ -117,20 +120,36 @@
{
       if (on && item->childCount() == 0)
       {
+               QCString oldpw = getenv("PASSWD");
+               QCString olduser = getenv("USER");
+               QCString pw = m_password.local8Bit();
+               setenv("PASSWD", pw, 1);
+               QCString user = m_login.local8Bit();
+               setenv("USER", user, 1);
               if (item->depth() == 0)
               { // opening group
                       m_current = item;
-                       QString cmd = QString("nmblookup -M %1 -S | grep '<20>' | awk '{print $1}' | xargs -iserv_name smbclient -L serv_name -W %2 %3").arg(item->text(0)).arg(item->text(0)).arg(smbPasswordString(m_login,m_password));
+                       QString cmd = QString("nmblookup -M %1 -S | grep '<20>' | awk '{print $1}' | xargs -iserv_name ").arg(KShellProcess::quote(item->text(0)));
+                       cmd += QString("smbclient -L serv_name -N -W %1").arg(KShellProcess::quote(item->text(0)));
                       m_proc->setExecutable(cmd);
                       startProcess(ServerListing);
               }
               else if (item->depth() == 1)
               { // opening server
                       m_current = item;
-                       QString cmd = QString("smbclient -L %1 -W %2 %3").arg(item->text(0)).arg(item->parent()->text(0)).arg(smbPasswordString(m_login,m_password));
+                       QString cmd = QString("smbclient -L %1 ").arg(KShellProcess::quote(item->text(0)));
+                       cmd += QString("-N -W %1").arg(KShellProcess::quote(item->parent()->text(0)));
                       m_proc->setExecutable(cmd);
                       startProcess(ShareListing);
               }
+               if (oldpw.isNull())
+                  unsetenv("PASSWD");
+               else
+                  setenv("PASSWD", oldpw, 1);
+               if (olduser.isNull())
+                  unsetenv("USER");
+               else
+                  setenv("USER", olduser, 1);
       }
       QListView::setOpen(item,on);
}
Index: kdelibs/kdoctools/meinproc.cpp
diff -u kdelibs/kdoctools/meinproc.cpp:1.20.2.2 kdelibs/kdoctools/meinproc.cpp:1.20.2.3
--- kdelibs/kdoctools/meinproc.cpp:1.20.2.2     Fri Nov  9 08:50:49 2001
+++ kdelibs/kdoctools/meinproc.cpp      Fri Dec  6 18:07:49 2002
@@ -24,6 +24,7 @@
#include <kdebug.h>
#include <qtextcodec.h>
#include <qfileinfo.h>
+#include <kprocess.h>

extern int xmlLoadExtDtdDefaultValue;

@@ -145,7 +146,11 @@
                exe = locate( "exe", "xmllint" );
        }
        if ( !::access( QFile::encodeName( exe ), X_OK ) ) {
-            FILE *xmllint = popen( QString( exe + " --catalogs --valid --noout %1 2>&1" ).arg( file.fileName() ).local8Bit().data(), "r");
+            QString cmd = exe;
+            cmd += " --catalogs --valid --noout ";
+            cmd += KShellProcess::quote(file.fileName());
+            cmd += " 2>&1";
+            FILE *xmllint = popen( QFile::encodeName( cmd ), "r");
            bool noout = true;
            while ( !feof( xmllint ) ) {
                int c;
Index: kdelibs/kdoctools/xslt.cpp
diff -u kdelibs/kdoctools/xslt.cpp:1.41.2.2 kdelibs/kdoctools/xslt.cpp:1.41.2.4
--- kdelibs/kdoctools/xslt.cpp:1.41.2.2 Fri Nov  9 08:50:49 2001
+++ kdelibs/kdoctools/xslt.cpp  Wed Dec 11 14:09:47 2002
@@ -95,7 +95,9 @@
    /* if (contents.left(5) != "<?xml") {
        fprintf(stderr, "xmlizer\n");
        INFO(i18n("XMLize document"));
-        FILE *p = popen(QString::fromLatin1("xmlizer %1").arg(pat).latin1(), "r");
+        QString cmd = "xmlizer ";
+        cmd += KProcess::quote(pat);
+        FILE *p = popen(QFile::encodeName(cmd), "r");
        xmlFile.open(IO_ReadOnly, p);
        char buffer[5001];
        contents.truncate(0);
@@ -403,12 +405,16 @@
        for ( uint i = 0; i < len; i++ ) {
            QCString test = locale->fromUnicode( part.mid( i, 1 ) );
            if ( locale->toUnicode( test ) == part.mid( i, 1 ) ) {
+                if (buffer_len + test.length() + 1 > sizeof(buffer))
+                   break;
                strcpy( buffer + buffer_len, test.data() );
                buffer_len += test.length();
            } else {
                QString res;
                res.sprintf( "&#%d;", part.at( i ).unicode() );
                test = locale->fromUnicode( res );
+                if (buffer_len + test.length() + 1 > sizeof(buffer))
+                   break;
                strcpy( buffer + buffer_len, test.data() );
                buffer_len += test.length();
            }
Index: kdelibs/khtml/html/html_baseimpl.cpp
diff -u kdelibs/khtml/html/html_baseimpl.cpp:1.125.2.2 kdelibs/khtml/html/html_baseimpl.cpp:1.125.2.3
--- kdelibs/khtml/html/html_baseimpl.cpp:1.125.2.2      Fri Nov  2 14:44:05 2001
+++ kdelibs/khtml/html/html_baseimpl.cpp        Fri Nov 30 07:24:07 2001
@@ -272,7 +272,7 @@
    while ((part = part->parentPart()))
        depth++;

-    if (depth > 6 || url.isNull()) {
+    if (depth > 6) {
        style()->setDisplay( NONE );
        return;
    }
@@ -309,6 +309,7 @@
      kdDebug( 6030 ) << "creating frame name: " << name.string() << endl;
    }

+    if (!url.isNull())
    w->part()->requestFrame( renderFrame, url.string(), name.string() );

    HTMLElementImpl::attach();
Index: kdelibs/khtml/html/html_imageimpl.cpp
diff -u kdelibs/khtml/html/html_imageimpl.cpp:1.104.2.1 kdelibs/khtml/html/html_imageimpl.cpp:1.104.2.2
--- kdelibs/khtml/html/html_imageimpl.cpp:1.104.2.1     Thu Oct 18 05:00:07 2001
+++ kdelibs/khtml/html/html_imageimpl.cpp       Tue Jun 18 17:57:28 2002
@@ -462,7 +462,7 @@
        int y1 = coords->at(3)->minWidth(height_);
        region = QRegion(x0,y0,x1-x0,y1-y0);
    }
-    else /*if (shape==Default || shape == Unknown)*/ {
+    else if (shape==Default) {
        //cout << "default/unknown" << endl;
        region = QRegion(0,0,width_,height_);
    }
Index: kdelibs/khtml/html/htmltokenizer.cpp
diff -u kdelibs/khtml/html/htmltokenizer.cpp:1.193.2.6 kdelibs/khtml/html/htmltokenizer.cpp:1.193.2.7
--- kdelibs/khtml/html/htmltokenizer.cpp:1.193.2.6      Tue Nov  6 00:33:38 2001
+++ kdelibs/khtml/html/htmltokenizer.cpp        Mon Nov 26 17:37:25 2001
@@ -281,7 +281,7 @@
    while ( src.length() ) {
        checkScriptBuffer();
        unsigned char ch = src->latin1();
-        if ( !scriptCodeResync && ch == '-' && scriptCodeSize >= 3 && !src.escaped() && QConstString( scriptCode+scriptCodeSize-3, 3 ).string() == "<!-" ) {
+        if ( !scriptCodeResync && !textarea && ch == '-' && scriptCodeSize >= 3 && !src.escaped() && QConstString( scriptCode+scriptCodeSize-3, 3 ).string() == "<!-" ) {
            comment = true;
            parseComment( src );
            continue;
Index: kdelibs/kimgio/eps.cpp
diff -u kdelibs/kimgio/eps.cpp:1.14 kdelibs/kimgio/eps.cpp:1.14.2.1
--- kdelibs/kimgio/eps.cpp:1.14 Mon Jul  9 22:05:21 2001
+++ kdelibs/kimgio/eps.cpp      Fri Dec  6 12:37:43 2002
@@ -24,7 +24,6 @@
{
       int ret = FALSE;
        char buf[BUFLEN+1];
-        char dummy[BUFLEN+1];

       while (imageio->ioDevice()->readLine(buf, BUFLEN) != -1)
        {
@@ -33,7 +32,7 @@
                       // Some EPS files have non-integer values for the bbox
                       // We don't support that currently, but at least we parse it
                       float _x1, _y1, _x2, _y2;
-                       if ( sscanf (buf, "%s %f %f %f %f", dummy,
+                        if ( sscanf (buf, "%*s %f %f %f %f",
                               &_x1, &_y1, &_x2, &_y2) == 5) {
                               *x1=(int)_x1; *y1=(int)_y1; *x2=(int)_x2; *y2=(int)_y2;
                               ret = TRUE;
@@ -152,7 +151,7 @@
  QFile        inFile(tmpFile.name());
  QString szBoxInfo;

-  szBoxInfo.sprintf("%sBoundingBox: 0 0 %d %d\n", "%%",
+  szBoxInfo.sprintf("%%%%BoundingBox: 0 0 %d %d\n",
                    imageio->image().width(),
                    imageio->image().height());

Index: kdelibs/kimgio/netpbm.cpp
diff -u kdelibs/kimgio/netpbm.cpp:1.2 kdelibs/kimgio/netpbm.cpp:1.2.6.1
--- kdelibs/kimgio/netpbm.cpp:1.2       Mon Mar 27 22:49:18 2000
+++ kdelibs/kimgio/netpbm.cpp   Sat Dec  7 16:27:03 2002
@@ -12,30 +12,31 @@
#include <stdio.h>
#include <stdlib.h>
#include <qimage.h>
-
-#define CMDBUFLEN     4096
+#include <qfile.h>
+#include <kprocess.h>
+#include <ktempfile.h>

//////
// the real filter.
//

-void import_graphic (char *filter, QImageIO *image)
+void import_graphic (const char *filter, QImageIO *image)
{
-  char * tmpFileName;
  QImage myimage;

-  char cmdBuf [CMDBUFLEN];
-
-  tmpFileName = tmpnam(NULL);
+  KTempFile tmp;
+  tmp.close();

-  sprintf (cmdBuf, "%s %s > %s", filter, image->fileName(), tmpFileName);
-//  printf (cmdBuf);
-//  fflush (stdout);
+  QString cmd = filter;
+  cmd += " ";
+  cmd += KShellProcess::quote(image->fileName());
+  cmd += " > ";
+  cmd += KShellProcess::quote(tmp.name());

-  system (cmdBuf);
-  myimage.load (tmpFileName);
+  system (QFile::encodeName(cmd));
+  myimage.load (tmp.name());

-  unlink (tmpFileName);
+  tmp.unlink();

  image->setImage (myimage);
  image->setStatus (0);
Index: kdelibs/kinit/lnusertemp.c
diff -u kdelibs/kinit/lnusertemp.c:1.7 kdelibs/kinit/lnusertemp.c:1.7.2.1
--- kdelibs/kinit/lnusertemp.c:1.7      Wed Mar 14 20:22:29 2001
+++ kdelibs/kinit/lnusertemp.c  Sat Dec  7 18:48:35 2002
@@ -109,8 +109,8 @@
     return 1;
  }

-  strcpy(user_tmp_dir, tmp_prefix);
-  strcat(user_tmp_dir, pw_ent->pw_name);
+  strncpy(user_tmp_dir, tmp_prefix, PATH_MAX);
+  strncat(user_tmp_dir, pw_ent->pw_name, PATH_MAX - strlen(tmp_prefix));

  if (!kde_home || !kde_home[0])
  {
@@ -130,9 +130,9 @@
        exit(255);
     }
     kde_home++;
-     strcat(kde_tmp_dir, home_dir);
+     strncpy(kde_tmp_dir, home_dir, PATH_MAX);
  }
-  strcat(kde_tmp_dir, kde_home);
+  strncat(kde_tmp_dir, kde_home, PATH_MAX - strlen(kde_tmp_dir));

  /** Strip trailing '/' **/
  if ( kde_tmp_dir[strlen(kde_tmp_dir)-1] == '/')
@@ -148,7 +148,7 @@
     return 1;
  }

-  strcat(kde_tmp_dir, kde_prefix);
+  strncat(kde_tmp_dir, kde_prefix, PATH_MAX - strlen(kde_tmp_dir));
  if (gethostname(kde_tmp_dir+strlen(kde_tmp_dir), PATH_MAX - strlen(kde_tmp_dir) - 1) != 0)
  {
     perror("Aborting. Could not determine hostname: ");
@@ -168,7 +168,7 @@
     result = create_link(kde_tmp_dir, user_tmp_dir);
     if (result == 0) return 0; /* Success */
     unlink(kde_tmp_dir);
-     strcat(user_tmp_dir, "XXXXXX");
+     strncat(user_tmp_dir, "XXXXXX", PATH_MAX - strlen(user_tmp_dir));
     mktemp(user_tmp_dir);
     return create_link(kde_tmp_dir, user_tmp_dir);
  }
@@ -194,7 +194,7 @@
     result = create_link(kde_tmp_dir, user_tmp_dir);
     if (result == 0) return 0; /* Success */
     unlink(kde_tmp_dir);
-     strcat(user_tmp_dir, "XXXXXX");
+     strncat(user_tmp_dir, "XXXXXX", PATH_MAX - strlen(user_tmp_dir));
     mktemp(user_tmp_dir);
     return create_link(kde_tmp_dir, user_tmp_dir);
     return 1;
@@ -202,7 +202,7 @@
  result = check_tmp_dir(tmp_buf);
  if (result == 0) return 0; /* Success */
  unlink(kde_tmp_dir);
-  strcat(user_tmp_dir, "XXXXXX");
+  strncat(user_tmp_dir, "XXXXXX", PATH_MAX - strlen(user_tmp_dir));
  mktemp(user_tmp_dir);
  return create_link(kde_tmp_dir, user_tmp_dir);
}
Index: kdelibs/kinit/setproctitle.cpp
diff -u kdelibs/kinit/setproctitle.cpp:1.6 kdelibs/kinit/setproctitle.cpp:1.6.4.2
--- kdelibs/kinit/setproctitle.cpp:1.6  Sun Feb  4 01:35:48 2001
+++ kdelibs/kinit/setproctitle.cpp      Sat Dec  7 19:27:51 2002
@@ -35,7 +35,6 @@
# define _PATH_KMEM    "/dev/kmem"
#endif

-#define newstr(s)      strcpy((char*)malloc(strlen(s) + 1), s)
#define SPACELEFT(buf, ptr)    (sizeof buf - ((ptr) - buf))


@@ -143,8 +142,13 @@
       for (i = 0; envp[i] != NULL; i++)
               envpsize += strlen(envp[i]) + 1;
       environ = (char **) malloc(sizeof (char *) * (i + 1));
+    if (environ == NULL)
+        return;
+
       for (i = 0; envp[i] != NULL; i++)
-               environ[i] = newstr(envp[i]);
+    {
+       environ[i] = strdup(envp[i]);
+    }
       environ[i] = NULL;

       /*
Index: kdelibs/kinit/wrapper.c
diff -u kdelibs/kinit/wrapper.c:1.22 kdelibs/kinit/wrapper.c:1.22.2.2
--- kdelibs/kinit/wrapper.c:1.22        Fri Jul 13 13:16:19 2001
+++ kdelibs/kinit/wrapper.c     Fri Dec 13 11:23:21 2002
@@ -38,6 +38,7 @@
#include <unistd.h>
#include <pwd.h>
#include <signal.h>
+#include <limits.h>

extern char **environ;

@@ -53,6 +54,9 @@
      display = ":0";
   }
   result = malloc(strlen(display)+1);
+   if (result == NULL)
+      return NULL;
+
   strcpy(result, display);
   screen = strrchr(result, '.');
   colon = strrchr(result, ':');
@@ -115,12 +119,12 @@
  int s;
  struct sockaddr_un server;
#define MAX_SOCK_FILE 255
-  char sock_file[MAX_SOCK_FILE];
+  char sock_file[MAX_SOCK_FILE + 1];
  const char *home_dir = getenv("HOME");
  const char *kde_home = getenv("KDEHOME");
  char *display;

-  sock_file[0] = 0;
+  sock_file[0] = sock_file[MAX_SOCK_FILE] = 0;

  if (!kde_home || !kde_home[0])
  {
@@ -140,15 +144,15 @@
        exit(255);
     }
     kde_home++;
-     strcat(sock_file, home_dir);
+     strncpy(sock_file, home_dir, MAX_SOCK_FILE);
  }
-  strcat(sock_file, kde_home);
+  strncat(sock_file, kde_home, MAX_SOCK_FILE - strlen(sock_file));

  /** Strip trailing '/' **/
  if ( sock_file[strlen(sock_file)-1] == '/')
     sock_file[strlen(sock_file)-1] = 0;

-  strcat(sock_file, "/socket-");
+  strncat(sock_file, "/socket-", MAX_SOCK_FILE - strlen(sock_file));
  if (gethostname(sock_file+strlen(sock_file), MAX_SOCK_FILE - strlen(sock_file) - 1) != 0)
  {
     perror("Aborting. Could not determine hostname: ");
@@ -157,7 +161,13 @@

  /* append $DISPLAY */
  display = getDisplay();
-  if (strlen(sock_file)+strlen(display)+2 > MAX_SOCK_FILE)
+  if (display == NULL)
+  {
+     fprintf(stderr, "Error: Could not determine display.\n");
+     return -1;
+  }
+
+  if (strlen(sock_file)+strlen(display)+strlen("/kdeinit-")+2 > MAX_SOCK_FILE)
  {
     fprintf(stderr, "Aborting. Socket name will be too long.\n");
     exit(255);
@@ -401,6 +411,11 @@
   write_socket(sock, (char *) &header, sizeof(header));

   buffer = (char *) malloc(size);
+   if (buffer == NULL)
+   {
+        fprintf(stderr, "Error: malloc() failed.");
+        exit(255);
+   }
   p = buffer;

   memcpy(p, &arg_count, sizeof(arg_count));
@@ -472,6 +487,11 @@
   {
      long pid;
      buffer = (char *) malloc(header.arg_length);
+      if (buffer == NULL)
+      {
+          fprintf(stderr, "Error: malloc() failed\n");
+          exit(255);
+      }
      read_socket(sock, buffer, header.arg_length);
      pid = *((long *) buffer);
      if( !kwrapper ) /* kwrapper shouldn't print any output */
Index: kdelibs/kio/Makefile.in
--- kdelibs/kio/Makefile.in
+++ kdelibs/kio/Makefile.in
@@ -338,7 +338,7 @@
kmailservice_LDADD = $(LIB_KDECORE)
kmailservice_LDFLAGS = $(KDE_RPATH) $(all_libraries)

-kmailprotocol_DATA = kmailservice.protocol
+kmailprotocol_DATA = kmailservice.protocol telnet.protocol rlogin.protocol
kmailprotocoldir = $(kde_servicesdir)

update_DATA = kioslave.upd useragent.pl proxytype.pl
@@ -438,7 +438,7 @@

#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
#>+ 4
-KDE_DIST=DESIGN.metadata kcomprfilter.desktop application.desktop kioslave.upd proxytype.pl DESIGN configure.in.in DESIGN.krun kurifilterplugin.desktop lex.l kscan.desktop kio_uiserver.desktop ktypecode.h useragent.pl kmailservice.protocol yacc.y kservicegroupfactory.h design.h magic DESKTOP_ENTRY_STANDARD
+KDE_DIST=DESIGN.metadata kcomprfilter.desktop application.desktop kioslave.upd proxytype.pl DESIGN configure.in.in DESIGN.krun rlogin.protocol kurifilterplugin.desktop lex.l kscan.desktop kio_uiserver.desktop ktypecode.h useragent.pl kmailservice.protocol yacc.y kservicegroupfactory.h design.h telnet.protocol magic DESKTOP_ENTRY_STANDARD

DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)

Index: kdelibs/kio/Makefile.am
diff -u kdelibs/kio/Makefile.am:1.159.2.1 kdelibs/kio/Makefile.am:1.159.2.3
--- kdelibs/kio/Makefile.am:1.159.2.1   Tue Oct  2 19:12:21 2001
+++ kdelibs/kio/Makefile.am     Fri Dec  6 04:53:09 2002
@@ -129,7 +129,7 @@
kmailservice_LDADD = $(LIB_KDECORE)
kmailservice_LDFLAGS = $(KDE_RPATH) $(all_libraries)

-kmailprotocol_DATA = kmailservice.protocol telnet.protocol rlogin.protocol
+kmailprotocol_DATA = kmailservice.protocol
kmailprotocoldir = $(kde_servicesdir)

update_DATA = kioslave.upd useragent.pl proxytype.pl
Index: kdelibs/kio/job.cpp
diff -u kdelibs/kio/job.cpp:1.261.2.6 kdelibs/kio/job.cpp:1.261.2.8
--- kdelibs/kio/job.cpp:1.261.2.6       Fri Oct 19 22:09:57 2001
+++ kdelibs/kio/job.cpp Tue Jan 22 11:39:10 2002
@@ -2588,11 +2588,18 @@
            break;
        case STATE_RENAMING: // We were trying to rename a directory
        {
-            bool err = job->error() != 0;
+            int err = job->error();
            subjobs.remove( job );
            assert ( subjobs.isEmpty() );
            if ( err )
            {
+                // Only try copy+del if the reason for not renaming was "unsupported" (which includes EXDEV)
+                // One case where we really don't want to go to copy+del is renaming 'a' to 'A' on a FAT partition
+                if ( err != KIO::ERR_UNSUPPORTED_ACTION )
+                {
+                    Job::slotResult( job ); // will set the error and emit result(this)
+                    return;
+                }
                kdDebug(7007) << "Couldn't rename, starting listing, for copy and del" << endl;
                startListing( *m_currentStatSrc );
            }
@@ -2863,59 +2870,87 @@
    //kdDebug(7007) << "deleteNextFile" << endl;
    if ( !files.isEmpty() || !symlinks.isEmpty() )
    {
-        // Take first file to delete out of list
-        KURL::List::Iterator it = files.begin();
-        bool isLink = false;
-        if ( it == files.end() ) // No more files
-        {
-            it = symlinks.begin(); // Pick up a symlink to delete
-            isLink = true;
-        }
        SimpleJob *job;
-        // Use shredding ?
-        if ( m_shred && (*it).isLocalFile() && !isLink )
-        {
-            // KShred your KTie
-            KIO_ARGS << int(3) << (*it).path();
-            job = KIO::special(KURL("file:/"), packedArgs, false /*no GUI*/);
-            Scheduler::scheduleJob(job);
-            m_currentURL=(*it);
-            //emit deleting( this, *it );
-            connect( job, SIGNAL( processedSize( KIO::Job*, unsigned long ) ),
-                     this, SLOT( slotProcessedSize( KIO::Job*, unsigned long ) ) );
-        } else
-        {
-            // Normal deletion
-            job = KIO::file_delete( *it, false /*no GUI*/);
-            Scheduler::scheduleJob(job);
-            m_currentURL=(*it);
-            //emit deleting( this, *it );
-        }
-        if ( isLink )
-           symlinks.remove(it);
-        else
-           files.remove(it);
-        addSubjob(job);
-    } else
-    {
-        state = STATE_DELETING_DIRS;
-        deleteNextDir();
+        do {
+            // Take first file to delete out of list
+            KURL::List::Iterator it = files.begin();
+            bool isLink = false;
+            if ( it == files.end() ) // No more files
+            {
+                it = symlinks.begin(); // Pick up a symlink to delete
+                isLink = true;
+            }
+            // Use shredding ?
+            if ( m_shred && (*it).isLocalFile() && !isLink )
+            {
+                // KShred your KTie
+                KIO_ARGS << int(3) << (*it).path();
+                job = KIO::special(KURL("file:/"), packedArgs, false /*no GUI*/);
+                Scheduler::scheduleJob(job);
+                m_currentURL=(*it);
+                connect( job, SIGNAL( processedSize( KIO::Job*, KIO::filesize_t ) ),
+                         this, SLOT( slotProcessedSize( KIO::Job*, KIO::filesize_t ) ) );
+            } else
+            {
+                // Normal deletion
+                // If local file, try do it directly
+                if ( (*it).isLocalFile() && unlink( QFile::encodeName((*it).path()) ) == 0 ) {
+                    job = 0;
+                    m_processedFiles++;
+                    if ( m_processedFiles % 300 == 0 ) { // update progress info every 300 files
+                        m_currentURL = *it;
+                        slotReport();
+                    }
+                } else
+                { // if remote - or if unlink() failed (we'll use the job's error handling in that case)
+                    job = KIO::file_delete( *it, false /*no GUI*/);
+                    Scheduler::scheduleJob(job);
+                    m_currentURL=(*it);
+                }
+            }
+            if ( isLink )
+                symlinks.remove(it);
+            else
+                files.remove(it);
+            if ( job ) {
+                addSubjob(job);
+                return;
+            }
+            // loop only if direct deletion worked (job=0) and there is something else to delete
+        } while (!job && (!files.isEmpty() || !symlinks.isEmpty()));
    }
+    state = STATE_DELETING_DIRS;
+    deleteNextDir();
}

void DeleteJob::deleteNextDir()
{
    if ( !dirs.isEmpty() ) // some dirs to delete ?
    {
-        // Take first dir to delete out of list - last ones first !
-        KURL::List::Iterator it = dirs.fromLast();
-        SimpleJob *job = KIO::rmdir( *it );
-        Scheduler::scheduleJob(job);
-        dirs.remove(it);
-        addSubjob( job );
+        do {
+            // Take first dir to delete out of list - last ones first !
+            KURL::List::Iterator it = dirs.fromLast();
+            // If local dir, try to rmdir it directly
+            if ( (*it).isLocalFile() && ::rmdir( QFile::encodeName((*it).path()) ) == 0 ) {
+
+                m_processedDirs++;
+                if ( m_processedDirs % 100 == 0 ) { // update progress info every 100 dirs
+                    m_currentURL = *it;
+                    slotReport();
+               }
+            } else
+            {
+                SimpleJob *job = KIO::rmdir( *it );
+                Scheduler::scheduleJob(job);
+                dirs.remove(it);
+                addSubjob( job );
+                return;
+            }
+            dirs.remove(it);
+        } while ( !dirs.isEmpty() );
    }
-    else // We have finished deleting
-        startNextJob();
+    // We have finished deleting
+    startNextJob();
}

void DeleteJob::slotProcessedSize( KIO::Job*, unsigned long data_size )
@@ -3089,9 +3124,6 @@
      assert( subjobs.isEmpty() );
      m_processedFiles++;

-      /*emit processedFiles( this, m_processedFiles );
-       if (!m_shred)
-       emitPercent( m_processedFiles, m_totalFilesDirs );*/
      deleteNextFile();
      break;
   case STATE_DELETING_DIRS:
Index: kdelibs/kio/kdirlister.cpp
diff -u kdelibs/kio/kdirlister.cpp:1.64 kdelibs/kio/kdirlister.cpp:1.64.2.1
--- kdelibs/kio/kdirlister.cpp:1.64     Wed Jun  6 22:39:51 2001
+++ kdelibs/kio/kdirlister.cpp  Sun Nov 11 16:50:41 2001
@@ -159,7 +159,8 @@
    return;
  }

-  m_url = _url;
+  if ( m_url.isEmpty() || !_keep ) // Set toplevel URL if not set yet
+    m_url = _url;

  m_bComplete = false;
  d->urlChanged = false;
@@ -261,15 +262,13 @@
  {
    job->showErrorDialog();

-    if ( m_lstDirs.count() > 1 )
-      emit canceled( job->url() );
+    emit canceled( job->url() );
    if ( m_bComplete )
      emit canceled();
  }
  else
  {
-    if ( m_lstDirs.count() > 1 )
-      emit completed( job->url() );
+    emit completed( job->url() );
    if ( m_bComplete )
      emit completed();
  }
@@ -308,7 +307,7 @@

    if ( name == dot )
    {
-      if ( !m_rootFileItem ) // only if we didn't keep the previous dir
+      if ( !m_rootFileItem && url == m_url ) // only if we didn't keep the previous dir
      {
        m_rootFileItem = createFileItem( *it, url, m_bDelayedMimeTypes );
      }
Index: kdelibs/kio/kmimemagic.cpp
diff -u kdelibs/kio/kmimemagic.cpp:1.39 kdelibs/kio/kmimemagic.cpp:1.39.2.1
--- kdelibs/kio/kmimemagic.cpp:1.39     Thu Aug  2 11:21:27 2001
+++ kdelibs/kio/kmimemagic.cpp  Sat Dec  7 18:48:04 2002
@@ -1478,7 +1478,9 @@
                                       char *tmp;
                                       char buf2[BUFSIZ + BUFSIZ + 4];

-                                       strcpy(buf2, fn);
+                                       strncpy(buf2, fn, BUFSIZ);
+                    buf2[BUFSIZ] = 0;
+
                                       if ((tmp = strrchr(buf2, '/')) == NULL) {
                                               tmp = buf; /* in current dir */
                                       } else {
Index: kdelibs/kio/kmimetype.cpp
diff -u kdelibs/kio/kmimetype.cpp:1.134.2.1 kdelibs/kio/kmimetype.cpp:1.134.2.2
--- kdelibs/kio/kmimetype.cpp:1.134.2.1 Thu Nov  8 21:50:39 2001
+++ kdelibs/kio/kmimetype.cpp   Sun Dec  8 01:58:10 2002
@@ -653,7 +653,7 @@
  // at the global file, or at a file not in share/mimelnk...

  KShellProcess p;
-  p << "kfmclient" << "openProperties" << url.path().local8Bit();
+  p << "kfmclient" << "openProperties" << KShellProcess::quote(url.path());
  p.start(KProcess::DontCare);
  return p.getPid();
}
Index: kdelibs/kio/ktar.cpp
diff -u kdelibs/kio/ktar.cpp:1.32 kdelibs/kio/ktar.cpp:1.32.2.1
--- kdelibs/kio/ktar.cpp:1.32   Tue Jun 26 22:22:37 2001
+++ kdelibs/kio/ktar.cpp        Sat Dec  7 18:48:04 2002
@@ -355,15 +355,20 @@
    strcpy( buffer, "././@LongLink" );
    fillBuffer( buffer, "     0", dirName.length()+1, 'L', user.local8Bit(), group.local8Bit() );
    write( buffer, 0x200 );
-    memset( buffer, 0, 0x200 );
-    strcpy( buffer, QFile::encodeName(dirName) );
+    strncpy( buffer, QFile::encodeName(dirName), 0x200 );
+    buffer[0x200] = 0;
+
    // write long name
    write( buffer, 0x200 );
    // not even needed to reclear the buffer, tar doesn't do it
  }
  else
+  {
    // Write name
-    strcpy( buffer, QFile::encodeName(dirName) );
+    strncpy( buffer, QFile::encodeName(dirName), 0x200 );
+    buffer[0x200] = 0;
+  }
+

  fillBuffer( buffer, " 40755", 0, 0x35, user.local8Bit(), group.local8Bit());

@@ -419,15 +424,19 @@
    fillBuffer( buffer, "     0", fileName.length()+1, 'L', user.local8Bit(), group.local8Bit() );
    write( buffer, 0x200 );

-    memset( buffer, 0, 0x200 );
-    strcpy( buffer, QFile::encodeName(fileName) );
+    strncpy( buffer, QFile::encodeName(fileName), 0x200 );
+    buffer[0x200] = 0;
    // write long name
    write( buffer, 0x200 );
    // not even needed to reclear the buffer, tar doesn't do it
  }
  else
+  {
    // Write name
-    strcpy( buffer, QFile::encodeName(fileName) );
+    strncpy( buffer, QFile::encodeName(fileName), 0x200 );
+    buffer[0x200] = 0;
+  }
+

  fillBuffer( buffer, "100644", size, 0x30, user.local8Bit(), group.local8Bit() );

Index: kdelibs/kio/lex.l
diff -u kdelibs/kio/lex.l:1.5 kdelibs/kio/lex.l:1.5.2.1
--- kdelibs/kio/lex.l:1.5       Wed Jun 13 16:16:39 2001
+++ kdelibs/kio/lex.l   Sat Dec  7 18:48:04 2002
@@ -58,9 +58,11 @@
{
  int l = strlen( _name )-1;
  char *p = (char *)malloc( l );
-
-  strncpy( p, _name+1, l-1 );
-  p[l-1] = 0;
+  if (p != NULL)
+  {
+    strncpy( p, _name+1, l-1 );
+    p[l-1] = 0;
+  }

  return p;
}
@@ -68,7 +70,10 @@
char *putSymbol( char *_name )
{
  char *p = (char*)malloc( strlen( _name ) + 1 );
-  strcpy( p, _name );
+  if (p != NULL)
+  {
+      strcpy( p, _name );
+  }
  return p;
}

@@ -78,6 +83,10 @@
  char *p = (char*)malloc( l );
  char *s = _str + 1;
  char *d = p;
+
+  if (p == NULL)
+    return NULL;
+
  while ( s != _str + l - 1 )
  {
     if ( *s != '\\' )
Index: kdelibs/kio/passdlg.cpp
diff -u kdelibs/kio/passdlg.cpp:1.26 kdelibs/kio/passdlg.cpp:1.26.2.1
--- kdelibs/kio/passdlg.cpp:1.26        Sun May 27 01:00:31 2001
+++ kdelibs/kio/passdlg.cpp     Sat Nov 10 18:52:33 2001
@@ -279,8 +279,15 @@
    if ( ret == Accepted )
    {
        user = dlg->username();
+        if ( user.isNull() )
+          user = "";
+
        pass = dlg->password();
-        if ( keep ) { (*keep) = dlg->keepPassword(); }
+        if ( pass.isNull() )
+          pass = "";
+
+        if ( keep )
+          (*keep) = dlg->keepPassword();
    }
    delete dlg;
    return ret;
Index: kdelibs/kio/rlogin.protocol
diff -u kdelibs/kio/rlogin.protocol:1.2 kdelibs/kio/rlogin.protocol:removed
--- kdelibs/kio/rlogin.protocol:1.2     Sun Jan 21 00:01:05 2001
+++ kdelibs/kio/rlogin.protocol Fri Dec 13 17:03:06 2002
@@ -1,11 +0,0 @@
-[Protocol]
-exec=konsole -e rlogin `echo %u | sed -e 's,rlogin:/*,,'`
-protocol=rlogin
-input=none
-output=none
-helper=true
-listing=false
-reading=false
-writing=false
-makedir=false
-deleting=false
Index: kdelibs/kio/telnet.protocol
diff -u kdelibs/kio/telnet.protocol:1.3 kdelibs/kio/telnet.protocol:removed
--- kdelibs/kio/telnet.protocol:1.3     Wed Apr 11 07:37:55 2001
+++ kdelibs/kio/telnet.protocol Fri Dec 13 17:03:07 2002
@@ -1,11 +0,0 @@
-[Protocol]
-exec=konsole -e telnet `echo %u | sed -e 's,telnet:/*,,' | sed -e 's,:\([0-9]*\), \1,'`
-protocol=telnet
-input=none
-output=none
-helper=true
-listing=false
-reading=false
-writing=false
-makedir=false
-deleting=false
Index: kdelibs/kio/ftp/ftp.cc
diff -u kdelibs/kio/ftp/ftp.cc:1.147.2.1 kdelibs/kio/ftp/ftp.cc:1.147.2.2
--- kdelibs/kio/ftp/ftp.cc:1.147.2.1    Thu Sep 27 18:37:20 2001
+++ kdelibs/kio/ftp/ftp.cc      Wed Dec 11 23:03:47 2002
@@ -1677,7 +1677,10 @@
                    }
                    else
                      de.link = QString::null;
-
+
+                    if (strchr(p_name, '/'))
+                       return 0L; // Don't trick us!
+
                    de.access = 0;
                    de.type = S_IFREG;
                    switch ( p_access[0] ) {
Index: kdelibs/kparts/browserextension.cpp
diff -u kdelibs/kparts/browserextension.cpp:1.34 kdelibs/kparts/browserextension.cpp:1.34.2.1
--- kdelibs/kparts/browserextension.cpp:1.34    Wed Jun 20 22:19:00 2001
+++ kdelibs/kparts/browserextension.cpp Fri Nov 29 12:39:09 2002
@@ -541,7 +541,7 @@

BrowserHostExtension *BrowserHostExtension::childObject( QObject *obj )
{
-    if ( !obj )
+    if ( !obj || !obj->children() )
        return 0L;

    // we try to do it on our own, in hope that we are faster than
Index: kdelibs/kssl/kopenssl.cc
diff -u kdelibs/kssl/kopenssl.cc:1.24.2.1 kdelibs/kssl/kopenssl.cc:1.24.2.2
--- kdelibs/kssl/kopenssl.cc:1.24.2.1   Tue Aug 21 18:07:31 2001
+++ kdelibs/kssl/kopenssl.cc    Tue Aug 13 00:23:03 2002
@@ -92,6 +92,7 @@
static int (*K_SSL_get_error) (SSL*, int) = NULL;
static STACK_OF(X509)* (*K_SSL_get_peer_cert_chain) (SSL*) = NULL;
static void (*K_X509_STORE_CTX_set_chain) (X509_STORE_CTX *, STACK_OF(X509)*) = NULL;
+static void (*K_X509_STORE_CTX_set_purpose) (X509_STORE_CTX *, int) = NULL;
static void (*K_sk_free) (STACK*) = NULL;
static int (*K_sk_num) (STACK*) = NULL;
static char* (*K_sk_value) (STACK*, int) = NULL;
@@ -254,6 +255,7 @@
                X509**, STACK_OF(X509)**)) _cryptoLib->symbol("PKCS12_parse");
      K_EVP_PKEY_free = (void (*) (EVP_PKEY *)) _cryptoLib->symbol("EVP_PKEY_free");
      K_X509_STORE_CTX_set_chain = (void (*)(X509_STORE_CTX *, STACK_OF(X509)*)) _cryptoLib->symbol("X509_STORE_CTX_set_chain");
+      K_X509_STORE_CTX_set_purpose = (void (*)(X509_STORE_CTX *, int)) _cryptoLib->symbol("X509_STORE_CTX_set_purpose");
      K_sk_free = (void (*) (STACK *)) _cryptoLib->symbol("sk_free");
      K_sk_num = (int (*) (STACK *)) _cryptoLib->symbol("sk_num");
      K_sk_value = (char* (*) (STACK *, int)) _cryptoLib->symbol("sk_value");
@@ -742,6 +744,10 @@

void KOpenSSLProxy::X509_STORE_CTX_set_chain(X509_STORE_CTX *v, STACK_OF(X509)* x) {
   if (K_X509_STORE_CTX_set_chain) (K_X509_STORE_CTX_set_chain)(v,x);
+}
+
+void KOpenSSLProxy::X509_STORE_CTX_set_purpose(X509_STORE_CTX *v, int purpose) {
+   if (K_X509_STORE_CTX_set_purpose) (K_X509_STORE_CTX_set_purpose)(v,purpose);
}


Index: kdelibs/kssl/kopenssl.h
diff -u kdelibs/kssl/kopenssl.h:1.15 kdelibs/kssl/kopenssl.h:1.15.2.1
--- kdelibs/kssl/kopenssl.h:1.15        Fri Jul 27 11:55:02 2001
+++ kdelibs/kssl/kopenssl.h     Tue Aug 13 00:23:03 2002
@@ -277,6 +277,10 @@
    */
   void X509_STORE_CTX_set_chain(X509_STORE_CTX *v, STACK_OF(X509)* x);

+   /*
+    *   X509_STORE_CTX_set_purpose - set the purpose of the certificate
+    */
+   void X509_STORE_CTX_set_purpose(X509_STORE_CTX *v, int purpose);

   /*
    *   X509_verify_cert - verify the certificate
Index: kdelibs/kssl/ksslcertificate.cc
diff -u kdelibs/kssl/ksslcertificate.cc:1.39.2.6 kdelibs/kssl/ksslcertificate.cc:1.39.2.7
--- kdelibs/kssl/ksslcertificate.cc:1.39.2.6    Thu Oct 25 08:12:11 2001
+++ kdelibs/kssl/ksslcertificate.cc     Tue Aug 13 00:23:03 2002
@@ -262,6 +262,8 @@
    // FIXME: do all the X509_STORE_CTX_set_flags(); here
    //   +----->  Note that this is for 0.9.6 or better ONLY!

+    d->kossl->X509_STORE_CTX_set_purpose(certStoreCTX, X509_PURPOSE_SSL_SERVER);
+
    //kdDebug(7029) << "KSSL verifying.............." << endl;
    certStoreCTX->error = X509_V_OK;
    rc = d->kossl->X509_verify_cert(certStoreCTX);
Index: kdelibs/kssl/ksslpeerinfo.cc
diff -u kdelibs/kssl/ksslpeerinfo.cc:1.12.2.10 kdelibs/kssl/ksslpeerinfo.cc:1.12.2.11
--- kdelibs/kssl/ksslpeerinfo.cc:1.12.2.10      Wed Nov  7 06:47:37 2001
+++ kdelibs/kssl/ksslpeerinfo.cc        Fri Nov 23 19:42:36 2001
@@ -23,7 +23,6 @@
#endif

#include "ksslpeerinfo.h"
-#include <qstring.h>
#include <kdebug.h>

#include <ksockaddr.h>
@@ -74,25 +73,54 @@
  QString cn = certinfo.getValue("CN");

  if (d->proxying) {
-       if (cn.startsWith("*")) {
-               QRegExp cnre(cn.lower(), false, true);
-               if (cnre.match(d->proxyHost.lower()) >= 0) return true;
-       } else {
-               if (cn.lower() == d->proxyHost.lower()) return true;
-       }
-       return false;
+    QStringList domains;
+
+    kdDebug(7029) << "Matching CN=" << cn << " to " << d->proxyHost << endl;
+
+    extractDomains(d->proxyHost, domains);
+    QStringList::Iterator it = domains.begin();
+    for (; it != domains.end(); it++)
+    {
+      int match = cn.findRev(*it, -1, false);
+      kdDebug(7029) << "Match= " << match << ", CN.length= " << cn.length()
+                    << ", host.length= " << (*it).length() << endl;
+
+      if (match > -1 && ((match + (*it).length()) == cn.length()))
+      {
+        kdDebug(7029) << "Found a match ==> " << (*it) << endl;
+        return true;
+      }
+    }
+    return false;
  }


  if (cn.startsWith("*")) {   // stupid wildcard cn
-     QRegExp cnre(cn.lower(), false, true);
     QString host, port;
+     QStringList domains;

-     if (KExtendedSocket::resolve(d->host, host, port, NI_NAMEREQD) != 0)
+     if (KExtendedSocket::resolve(d->host, host, port, NI_NAMEREQD) != 0)
        host = d->host->nodeName();

     kdDebug(7029) << "Matching CN=" << cn << " to " << host << endl;
-     if (cnre.match(host.lower()) >= 0) return true;
+
+     extractDomains( host, domains );
+     QStringList::Iterator it = domains.begin();
+
+     for (; it != domains.end(); it++)
+     {
+        int match = cn.findRev(*it, -1, false);
+        kdDebug(7029) << "Match= " << match << ", CN.length= " << cn.length()
+                      << ", host.length= " << (*it).length() << endl;
+
+        if (match > -1 && ((match + (*it).length()) == cn.length()))
+        {
+          kdDebug(7029) << "Found a match ==> " << (*it) << endl;
+          return true;
+         }
+     }
+
+     return false;
  } else {
     int err = 0;
     QList<KAddressInfo> cns = KExtendedSocket::lookup(cn.latin1(), 0, 0, &err);
@@ -102,17 +130,55 @@
     }
     cns.setAutoDelete(true);

-//     kdDebug(7029) << "The original ones were: " << d->host->nodeName()
-//                   << " and: " << certinfo.getValue("CN").latin1()
-//                   << endl;
+     kdDebug(7029) << "The original ones were: " << d->host->nodeName()
+                   << " and: " << certinfo.getValue("CN").latin1()
+                   << endl;

     for (KAddressInfo *x = cns.first(); x; x = cns.next()) {
        if ((*x).address()->isCoreEqual(d->host)) {
           return true;
        }
     }
+     kdDebug(7029) << "Testing failed!" << endl;
  }

#endif
  return false;
+}
+
+void KSSLPeerInfo::extractDomains(const QString &fqdn, QStringList &domains)
+{
+    domains.clear();
+
+    // If fqdn is an IP address, then only use
+    // the entire IP address to find a match! (DA)
+    if (fqdn[0] >= '0' && fqdn[0] <= '9') {
+       domains.append(fqdn);
+       return;
+    }
+
+    QStringList partList = QStringList::split('.', fqdn, false);
+
+    if (partList.count())
+        partList.remove(partList.begin()); // Remove hostname
+
+    while(partList.count()) {
+       if (partList.count() == 1)
+         break; // We only have a TLD left.
+
+       if (partList.count() == 2) {
+          // If this is a TLD, we should stop. (e.g. co.uk)
+          // We assume this is a TLD if it ends with .xx.yy or .x.yy
+          if (partList[0].length() <= 2 && partList[1].length() == 2)
+             break; // This is a TLD.
+       }
+
+       QString domain = partList.join(".");
+       domains.append(domain);
+       partList.remove(partList.begin());
+    }
+
+    // Add the entire FQDN at the end of the
+    // list for fqdn == CN checks
+    domains.append(fqdn);
}
Index: kdelibs/kssl/ksslpeerinfo.h
diff -u kdelibs/kssl/ksslpeerinfo.h:1.12.2.1 kdelibs/kssl/ksslpeerinfo.h:1.12.2.2
--- kdelibs/kssl/ksslpeerinfo.h:1.12.2.1        Wed Nov  7 06:47:37 2001
+++ kdelibs/kssl/ksslpeerinfo.h Fri Nov 23 19:42:36 2001
@@ -24,7 +24,7 @@
class KSSL;

#include <qglobal.h>
-#include <qstring.h>
+#include <qstringlist.h>
#include <ksslcertificate.h>

class KSSLPeerInfoPrivate;
@@ -38,14 +38,15 @@
  KSSLCertificate& getPeerCertificate();
  bool certMatchesAddress();
  QString getPeerAddress();
-
+
  void setProxying(bool active, QString realHost = QString::null);
-
+
protected:
  KSSLPeerInfo();

  KSSLCertificate m_cert;
  void setPeerAddress(KInetSocketAddress &x);
+  void extractDomains(const QString &fqdn, QStringList &domains);

private:
  KSSLPeerInfoPrivate *d;
Index: kdelibs/libkmid/fmout.cc
diff -u kdelibs/libkmid/fmout.cc:1.19 kdelibs/libkmid/fmout.cc:1.19.6.1
--- kdelibs/libkmid/fmout.cc:1.19       Tue Oct 10 00:09:23 2000
+++ kdelibs/libkmid/fmout.cc    Sat Dec  7 18:48:38 2002
@@ -34,6 +34,7 @@
#include <string.h>
#include <sys/param.h>
#include <stdlib.h>
+#include <limits.h>
#include "midispec.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -126,8 +127,8 @@
void FMOut::loadFMPatches(void)
{
#ifdef HAVE_OSS_SUPPORT
-  char patchesfile[120];
-  char drumsfile[120];
+  char patchesfile[PATH_MAX];
+  char drumsfile[PATH_MAX];
  int size;
  struct sbi_instrument instr;
  char tmp[60];
@@ -140,12 +141,12 @@

  if (opl==3)
  {
-    sprintf(patchesfile,"%s/std.o3",FMPatchesDirectory);
+    snprintf(patchesfile, PATH_MAX, "%s/std.o3",FMPatchesDirectory);
    size=60;
  }
  else
  {
-    sprintf(patchesfile,"%s/std.sb",FMPatchesDirectory);
+    snprintf(patchesfile, PATH_MAX, "%s/std.sb",FMPatchesDirectory);
    size=52;
  }
  fh=fopen(patchesfile,"rb");
@@ -170,11 +171,11 @@

  if (opl==3)
  {
-    sprintf(drumsfile,"%s/drums.o3",FMPatchesDirectory);
+    snprintf(drumsfile, PATH_MAX, "%s/drums.o3",FMPatchesDirectory);
  }
  else
  {
-    sprintf(drumsfile,"%s/drums.sb",FMPatchesDirectory);
+    snprintf(drumsfile, PATH_MAX, "%s/drums.sb",FMPatchesDirectory);
  }

  fh=fopen(drumsfile,"rb");
Index: kdelibs/libkmid/midfile.cc
diff -u kdelibs/libkmid/midfile.cc:1.21 kdelibs/libkmid/midfile.cc:1.21.2.3
--- kdelibs/libkmid/midfile.cc:1.21     Tue Mar 13 17:41:09 2001
+++ kdelibs/libkmid/midfile.cc  Fri Dec  6 15:24:24 2002
@@ -34,6 +34,9 @@
#include "sys/stat.h"
#include <config.h>

+#include <kprocess.h>
+#include <qfile.h>
+
int fsearch(FILE *fh,const char *text,long *ptr);

/* This function gives the metronome tempo, from a tempo data as found in
@@ -51,26 +54,23 @@
int uncompressFile(const char *gzname, char *tmpname)
  // Returns 0 if OK, 1 if error (tmpname not set)
{
-  char *cmd=new char[20+strlen(gzname)];
-  sprintf(cmd, "gzip -dc \"%s\"",gzname);
-  FILE *infile = popen( cmd, "r");
-  if (infile==NULL)
-  {
-    fprintf(stderr,"ERROR : popen failed : %s\n",cmd);
+  QString cmd("gzip -dc " + KShellProcess::quote(gzname));
+  FILE *infile = popen( QFile::encodeName(cmd).data(), "r");
+  if (infile==NULL) {
+    fprintf(stderr,"ERROR : popen failed : %s\n",QFile::encodeName(cmd).data());
+    return 1;
  }
  strcpy(tmpname, "/tmp/KMid.XXXXXXXXXX");
  int fd = mkstemp(tmpname);
  if (fd == -1)
  {
    pclose(infile);
-    delete cmd;
    return 1;
  }
  FILE *outfile= fdopen(fd,"wb");
  if (outfile==NULL)
  {
    pclose(infile);
-    delete cmd;
    return 1;
  }
  int n=getc(infile);
@@ -79,7 +79,6 @@
    pclose(infile);
    fclose(outfile);
    unlink(tmpname);
-    delete cmd;
    return 1;
  }
  fputc(n,outfile);
@@ -97,7 +96,6 @@
  // Is it right for pclose to always fail ?

  fclose(outfile);
-  delete cmd;
  return 0;
}

Index: kdelibs/libkmid/midimapper.cc
diff -u kdelibs/libkmid/midimapper.cc:1.12 kdelibs/libkmid/midimapper.cc:1.12.6.1
--- kdelibs/libkmid/midimapper.cc:1.12  Fri Jul 28 23:45:30 2000
+++ kdelibs/libkmid/midimapper.cc       Sat Dec  7 18:48:39 2002
@@ -184,7 +184,9 @@
MidiMapper::Keymap *MidiMapper::createKeymap(char *name,uchar use_same_note,uchar note)
{
  Keymap *km=new Keymap;
-  strcpy(km->name,name);
+  strncpy(km->name, name, KM_NAME_SIZE);
+  km->name[KM_NAME_SIZE - 1] = 0;
+
  int i;
  if (use_same_note==1)
  {
@@ -263,7 +265,7 @@
  char s[101];
  char v[101];
  char t[101];
-  char name[101];
+  char name[256]; /* Longer than t and 'AllKeysTo' */
  int i=0;
  int j,w;
#ifdef MIDIMAPPERDEBUG
@@ -323,7 +325,9 @@
  removeSpaces(first_line);
  getWord(v,first_line,2);
  Keymap *km=new Keymap;
-  strcpy(km->name,v);
+  strncpy(km->name, v, KM_NAME_SIZE);
+  km->name[KM_NAME_SIZE - 1] = 0;
+
  int i=0;
  while (i<128)
  {
Index: kdelibs/libkmid/midimapper.h
diff -u kdelibs/libkmid/midimapper.h:1.8 kdelibs/libkmid/midimapper.h:1.8.6.1
--- kdelibs/libkmid/midimapper.h:1.8    Fri Jul 28 23:45:30 2000
+++ kdelibs/libkmid/midimapper.h        Sat Dec  7 18:48:41 2002
@@ -27,6 +27,8 @@
#include <stdio.h>
#include <libkmid/dattypes.h>

+#define KM_NAME_SIZE 30
+
/**
 * A Midi Mapper class which defines the way MIDI events are translated
 * (or "mapped") to different ones. This way, when two MIDI devices "talk"
@@ -65,7 +67,7 @@
     */
    struct Keymap
    {
-      char name[30];
+      char name[KM_NAME_SIZE];
      uchar key[128];
      struct Keymap *next;
    };
Index: kdelibs/libkmid/player.cc
diff -u kdelibs/libkmid/player.cc:1.41 kdelibs/libkmid/player.cc:1.41.2.1
--- kdelibs/libkmid/player.cc:1.41      Wed Aug  1 02:05:10 2001
+++ kdelibs/libkmid/player.cc   Sat Dec  7 18:48:42 2002
@@ -366,7 +366,8 @@
                    {
                      lasttexttime=pspev->absmilliseconds;
                      lasttexttype=pspev->type;
-                      strcpy(lasttext,pspev->text);
+                      strncpy(lasttext, pspev->text, 1024);
+                      lasttext[1023] = 0;
#endif
                      pspev->next=new SpecialEvent;
#ifdef PLAYERDEBUG