*** empty log message ***
authorroot <root>
Mon, 13 Dec 2004 06:44:18 +0000 (06:44 +0000)
committerroot <root>
Mon, 13 Dec 2004 06:44:18 +0000 (06:44 +0000)
Changes
src/misc.C
src/screen.C
src/version.h

diff --git a/Changes b/Changes
index 5a6f2f8..c276756 100644 (file)
--- a/Changes
+++ b/Changes
@@ -11,6 +11,8 @@ FEAT: double-click: more intelligent (urls etc.)
 FEAT: OnTheSpot editing.
 FEAT: tabbed windows (hey, just use screen...)
 
+4.5  Mon Dec 13 07:47:16 CET 2004
+       - fix an extremely nasty bug in utf8-conversion. upgrade is advised.
         - completely re-wrote selection pasting. This should fix garbled
           incomplete characters at 32k boundaries and too-short INCR
           selections, and more. Increases memory requirements considerably
index a56e4de..e93dba7 100644 (file)
@@ -108,17 +108,19 @@ rxvt_utf8towcs (const char *str, int len)
 
   unsigned char *s = (unsigned char *)str;
 
-  while (len--)
+  while (len)
     {
       if (s[0] < 0x80)
-        *p++ = *s++;
+        {
+          *p++ = *s++; len--;
+        }
       else if (len > 0 
                && s[0] >= 0xc2 && s[0] <= 0xdf 
                && (s[1] & 0xc0) == 0x80)
         {
           *p++ = ((s[0] & 0x1f) << 6)
                |  (s[1] & 0x3f);
-          s += 2;
+          s += 2; len -= 2;
         }
       else if (len > 1 
                && (   (s[0] == 0xe0                 && s[1] >= 0xa0 && s[1] <= 0xbf)
@@ -131,7 +133,7 @@ rxvt_utf8towcs (const char *str, int len)
           *p++ = ((s[0] & 0x0f) << 12)
                | ((s[1] & 0x3f) <<  6)
                |  (s[2] & 0x3f);
-          s += 3;
+          s += 3; len -= 3;
         }
       else if (len > 2
                && (   (s[0] == 0xf0                 && s[1] >= 0x90 && s[1] <= 0xbf)
@@ -145,12 +147,12 @@ rxvt_utf8towcs (const char *str, int len)
                | ((s[1] & 0x3f) << 12) 
                | ((s[2] & 0x3f) <<  6) 
                |  (s[3] & 0x3f);
-          s += 4;
+          s += 4; len -= 4;
         }
       else
         {
           *p++ = 0xfffd;
-          s++;
+          s++; len--;
         }
     }
 
index e0d7dbc..5836898 100644 (file)
@@ -2716,7 +2716,7 @@ rxvt_term::selection_paste (Window win, Atom prop, bool delete_prop)
   XTextProperty ct;
 
   if (XGetWindowProperty (display->display, win, prop,
-                          0, (long)(PROP_SIZE / 4),
+                          0, PROP_SIZE / 4,
                           delete_prop, AnyPropertyType,
                           &ct.encoding, &ct.format,
                           &ct.nitems, &bytes_after,
@@ -2733,25 +2733,22 @@ rxvt_term::selection_paste (Window win, Atom prop, bool delete_prop)
     {
       // fetch and append remaining data
       XTextProperty ct2;
-      unsigned long bytes_after2;
 
       if (XGetWindowProperty (display->display, win, prop,
-                              ct.nitems / 4, (long) (bytes_after + 3) / 4,
+                              ct.nitems / 4, (bytes_after + 3) / 4,
                               delete_prop, AnyPropertyType,
                               &ct2.encoding, &ct2.format,
-                              &ct2.nitems, &bytes_after2,
+                              &ct2.nitems, &bytes_after,
                               &ct2.value) != Success)
         goto bailout;
 
       // realloc should be compatible to XFree, here, and elsewhere, too
-      ct.value = (unsigned char *)realloc (ct.value, ct.nitems + bytes_after);
-      memcpy (ct.value + ct.nitems, ct2.value, ct2.nitems);
+      ct.value = (unsigned char *)realloc (ct.value, ct.nitems + ct2.nitems + 1);
+      memcpy (ct.value + ct.nitems, ct2.value, ct2.nitems + 1);
       ct.nitems += ct2.nitems;
 
       XFree (ct2.value);
     }
-  else if (delete_prop)
-    XDeleteProperty (display->display, win, prop);
 
   if (ct.value == 0)
     goto bailout;
index 650d7a2..8a12d8c 100644 (file)
@@ -1,5 +1,5 @@
-#define VERSION "4.4"
-#define VSTRING "40400"
-#define DATE   "2004-12-12"
-#define LSMDATE        "12DEC04"
-#define LIBVERSION "4:4:0"
+#define VERSION "4.5"
+#define VSTRING "40500"
+#define DATE   "2004-12-13"
+#define LSMDATE        "13DEC04"
+#define LIBVERSION "4:5:0"