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