*** empty log message ***
authorroot <root>
Sun, 8 Jan 2006 07:55:36 +0000 (07:55 +0000)
committerroot <root>
Sun, 8 Jan 2006 07:55:36 +0000 (07:55 +0000)
Changes
src/command.C
src/main.C
src/rxvt.h
src/rxvttoolkit.C
src/xdefaults.C

diff --git a/Changes b/Changes
index 05ab8da..8c990d3 100644 (file)
--- a/Changes
+++ b/Changes
@@ -10,6 +10,7 @@ WISH: just for fun, do shade and tint with XRender.
 WISH: support tex fonts
 
 TODO: document transient_for, vt and the grab etc. functionality
+TODO: add warning about perl interpreter and setuid/setgid
 
        - perl: implement additional hook: line_update, add_lines.
         - perl: urxvt::line now can set via ->t and ->r.
@@ -18,6 +19,9 @@ TODO: document transient_for, vt and the grab etc. functionality
         - perl: much increased functionality, better overlays, popup support
           and much much more.
         - perl: anyevent support.
+        - free the resource database: this plugs a massive memory hole. as a
+          side effect, it also gets rid of XGetDefault calls.
+        - free one of the cursors, fixes a small memory leaks.
 
 6.3  Wed Jan  4 22:37:10 CET 2006
         - SECURITY FIX: on systems using openpty, permissions were
index e3bf892..7559342 100644 (file)
@@ -989,13 +989,15 @@ rxvt_term::flush ()
                 {
                   l = &ROW (row++);
 
-                  if (!(l->f & LINE_FILTERED))
+                  if (l->f & LINE_FILTERED)
+                    row++;
+                  else
                     {
                       // line not filtered, mark it as filtered
                       l->f |= LINE_FILTERED;
                       while (l->is_longer ())
                         {
-                          l = &ROW (row++);
+                          l = &ROW (++row);
                           l->f |= LINE_FILTERED;
                         }
 
index 522e51a..97cac98 100644 (file)
@@ -276,6 +276,9 @@ rxvt_term::~rxvt_term ()
 #if OFF_FOCUS_FADING
   delete pix_colors_unfocused;
 #endif
+#if USE_XGETDEFAULT
+  XrmDestroyDatabase (xrmdatabase);
+#endif
 
   displays.put (display);
 
@@ -615,6 +618,10 @@ rxvt_init ()
   old_xerror_handler = XSetErrorHandler ((XErrorHandler) rxvt_xerror_handler);
   // TODO: handle this with exceptions and tolerate the memory loss
   XSetIOErrorHandler (rxvt_xioerror_handler);
+
+#ifdef USE_XGETDEFAULT
+  XrmInitialize ();
+#endif
 }
 
 /* ------------------------------------------------------------------------- *
index aca610f..6afae97 100644 (file)
@@ -979,6 +979,9 @@ struct rxvt_term : zero_initialized, rxvt_vars {
 #if ENABLE_PERL
   rxvt_perl_term  perl;
 #endif
+#if USE_XGETDEFAULT
+  XrmDatabase     xrmdatabase;
+#endif
 
   struct mbstate  mbstate;              // current input multibyte state
 
index 7102570..d1c9896 100644 (file)
@@ -229,6 +229,9 @@ bool rxvt_display::init ()
 
 rxvt_display::~rxvt_display ()
 {
+#ifdef POINTER_BLANK
+  XFreeCursor (display, blank_cursor);
+#endif
   x_ev.stop ();
 #ifdef USE_XIM
   xims.clear ();
index 76e57bd..049b9f7 100644 (file)
@@ -406,7 +406,7 @@ static const char optionsstring[] = "options: "
                                     "NoResources"
 #else
 # if defined(USE_XGETDEFAULT)
-                                    "XGetDefaults"
+                                    "XGetDefault"
 # else
                                     ".Xdefaults"
 # endif
@@ -882,6 +882,20 @@ rxvt_term::get_xdefaults (FILE *stream, const char *name)
 # endif                                /* ! USE_XGETDEFAULT */
 #endif                         /* NO_RESOURCES */
 
+#ifdef USE_XGETDEFAULT
+char *get_res (XrmDatabase database, const char *program, const char *option)
+{
+  char resource[512];
+  char *type;
+  XrmValue result;
+
+  snprintf (resource, sizeof (resource), "%s.%s", program, option);
+  XrmGetResource (database, resource, resource, &type, &result);
+
+  return result.addr;
+}
+#endif
+
 /*{{{ read the resources files */
 /*
  * using XGetDefault () or the hand-rolled replacement
@@ -915,13 +929,11 @@ rxvt_term::extract_resources ()
    */
   int entry;
 
-#  ifdef XrmEnumOneLevel
   char *displayResource, *xe;
   XrmName name_prefix[3];
   XrmClass class_prefix[3];
   XrmDatabase database, rdb1;
 
-  XrmInitialize ();
   database = NULL;
 
   // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20
@@ -992,8 +1004,7 @@ rxvt_term::extract_resources ()
         }
     }
 
-  XrmSetDatabase (disp, database);
-#  endif
+  xrmdatabase = database;
 
   /*
    * Query resources for options that affect us
@@ -1007,14 +1018,14 @@ rxvt_term::extract_resources ()
       if (kw == NULL || rs[optList[entry].doff] != NULL)
         continue;              /* previously set */
 
-      p = XGetDefault (disp, rs[Rs_name], kw);
-      p0 = XGetDefault (disp, "!INVALIDPROGRAMMENAMEDONTMATCH!", kw);
+      p = get_res (database, rs[Rs_name], kw);
+      p0 = get_res (database, "!INVALIDPROGRAMMENAMEDONTMATCH!", kw);
       if (p == NULL || (p0 && strcmp (p, p0) == 0))
         {
-          p = XGetDefault (disp, RESCLASS, kw);
+          p = get_res (database, RESCLASS, kw);
 #ifdef RESFALLBACK
           if (p == NULL || (p0 && strcmp (p, p0) == 0))
-            p = XGetDefault (disp, RESFALLBACK, kw);
+            p = get_res (database, RESFALLBACK, kw);
 #endif
         }
 
@@ -1051,7 +1062,7 @@ rxvt_term::extract_resources ()
   class_prefix[1] = XrmStringToName ("Keysym");
   class_prefix[2] = NULLQUARK;
   /* XXX: Need to check sizeof (rxvt_t) == sizeof (XPointer) */
-  XrmEnumerateDatabase (XrmGetDatabase (disp), name_prefix, class_prefix,
+  XrmEnumerateDatabase (database, name_prefix, class_prefix,
                         XrmEnumOneLevel, rxvt_define_key, NULL);
 #   ifdef RESFALLBACK
   name_prefix[0] = XrmStringToName (RESFALLBACK);
@@ -1059,7 +1070,7 @@ rxvt_term::extract_resources ()
   class_prefix[0] = XrmStringToName (RESFALLBACK);
   class_prefix[1] = XrmStringToName ("Keysym");
   /* XXX: Need to check sizeof (rxvt_t) == sizeof (XPointer) */
-  XrmEnumerateDatabase (XrmGetDatabase (disp), name_prefix, class_prefix,
+  XrmEnumerateDatabase (database, name_prefix, class_prefix,
                         XrmEnumOneLevel, rxvt_define_key, NULL);
 #   endif
 #  endif