pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pkg/34798 (x11/mlterm: Dangerous file descriptor leaks)



The following reply was made to PR pkg/34798; it has been noted by GNATS.

From: Christian Biere <christianbiere%gmx.de@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: pkg/34798 (x11/mlterm: Dangerous file descriptor leaks)
Date: Mon, 18 Dec 2006 17:38:15 +0100

 --9amGYk9869ThD9tj
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 
 The attached file updates mlterm to 2.9.3 and provides updated patches for the
 file descriptor leak issue and a potential off-by-one in an unrelated macro.
 These patches have been extracted from mlterm's CVS repository.
 
 The patch also removes the configure argument "--with-type-engines=xft" from
 the Makefile. The default is "xcore" which works fine for me in contrast to
 Xft.
 
 -- 
 Christian
 
 --9amGYk9869ThD9tj
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="mlterm.udif"
 
 Index: Makefile
 ===================================================================
 RCS file: /cvsroot/pkgsrc/x11/mlterm/Makefile,v
 retrieving revision 1.46
 diff -u -r1.46 Makefile
 --- Makefile   12 Nov 2006 15:13:56 -0000      1.46
 +++ Makefile   18 Dec 2006 16:19:02 -0000
 @@ -1,7 +1,6 @@
  # $NetBSD: Makefile,v 1.46 2006/11/12 15:13:56 hira Exp $
  
 -DISTNAME=     mlterm-2.9.2
 -PKGREVISION=  4
 +DISTNAME=     mlterm-2.9.3
  CATEGORIES=   x11
  MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=mlterm/}
  
 @@ -27,7 +26,6 @@
  .include "../../mk/bsd.prefs.mk"
  
  CONFIGURE_ARGS+=      --with-imagelib=gdk-pixbuf
 -CONFIGURE_ARGS+=      --with-type-engines=xft
  CONFIGURE_ARGS+=      --without-libiconv-prefix
  CONFIGURE_ARGS+=      --without-libintl-prefix
  CONFIGURE_ARGS+=      --sysconfdir=${PKG_SYSCONFBASE:Q}
 Index: distinfo
 ===================================================================
 RCS file: /cvsroot/pkgsrc/x11/mlterm/distinfo,v
 retrieving revision 1.16
 diff -u -r1.16 distinfo
 --- distinfo   11 Jun 2005 15:00:04 -0000      1.16
 +++ distinfo   18 Dec 2006 16:09:50 -0000
 @@ -1,9 +1,18 @@
  $NetBSD: distinfo,v 1.16 2005/06/11 15:00:04 hira Exp $
  
 -SHA1 (mlterm-2.9.2.tar.gz) = d71f07bb38553a7cae927f15b8d0a20a165eebe7
 -RMD160 (mlterm-2.9.2.tar.gz) = c83693c353f266333dc85588d8c1366925cca79c
 -Size (mlterm-2.9.2.tar.gz) = 1980109 bytes
 -SHA1 (patch-ad) = eaaded295f050591e6a30286163f832aae93fa3a
 +SHA1 (mlterm-2.9.3.tar.gz) = 65ba5a7bd83accf7f621f84b84debb35c8f215ef
 +RMD160 (mlterm-2.9.3.tar.gz) = 27f4381a8b8b68b07e53bbeb422581beb7527b48
 +Size (mlterm-2.9.3.tar.gz) = 1984977 bytes
 +SHA1 (patch-ad) = 4f6ef642002baa13bc4b7578cda0e45888fed27f
  SHA1 (patch-ae) = fde46b06d0dfb2c296c91a69e9e1f8ff11d68766
  SHA1 (patch-af) = b9947c2a817093b71e3e91312bac173d5106c306
  SHA1 (patch-ag) = 7f2ff30719dd9baecda31627b45f9516225ec602
 +SHA1 (patch-ah) = 93b0ad1445faec91d29f3a01b69d9ac0f4ddfe90
 +SHA1 (patch-ai) = 7de76af14e77dc540e2d0692682102fd078686ff
 +SHA1 (patch-aj) = ff103698ff544fa22fa660268dccb51b8b9e8bda
 +SHA1 (patch-ak) = 3b06cfc41ed12be11ea81d097f0592bb6b977e29
 +SHA1 (patch-al) = 6b87b81e403a3fac9794c666c1e0260a3d5b5bd4
 +SHA1 (patch-am) = 83684bfa15e5596abddef92cf994bb92b9f21990
 +SHA1 (patch-an) = 156b8ebf5c7fdf68c39df7076849a05a90eb7e5a
 +SHA1 (patch-ao) = 680ac866197202e09c25d93b20a7e3b700f38370
 Index: patches/patch-ad
 ===================================================================
 RCS file: /cvsroot/pkgsrc/x11/mlterm/patches/patch-ad,v
 retrieving revision 1.1
 diff -u -r1.1 patch-ad
 --- patches/patch-ad   6 Mar 2005 17:50:49 -0000       1.1
 +++ patches/patch-ad   18 Dec 2006 16:09:50 -0000
 @@ -1,7 +1,7 @@
 -$NetBSD: patch-ad,v 1.1 2005/03/06 17:50:49 hira Exp $
 +$NetBSD$
  
 ---- kiklib/src/kik_pty_streams.c.orig 2004-10-23 06:59:39.000000000 +0900
 -+++ kiklib/src/kik_pty_streams.c      2005-03-05 23:07:02.000000000 +0900
 +--- kiklib/src/kik_pty_streams.c.orig 2005-11-21 15:24:03.000000000 +0100
 ++++ kiklib/src/kik_pty_streams.c      2006-12-16 00:04:11.000000000 +0100
  @@ -9,6 +9,7 @@
   /* When _XOPEN_SOURCE is defined,
    * u_int/u_long/... may not be defined without _BSD_SOURCE */
 @@ -20,7 +20,15 @@
   
   #include  "kik_str.h"                /* strdup */
   #include  "kik_debug.h"
 -@@ -99,13 +103,30 @@
 +@@ -75,6 +79,7 @@
 +              kik_msg_printf( "Unable to open a master pseudo-terminal 
device.\n") ;
 +              return  -1;
 +      }
 ++     kik_file_set_cloexec( *master) ;
 +      /*
 +       * The behaviour of the grantpt() function is unspecified
 +       * if the application has installed a signal handler to catch SIGCHLD 
signals.
 +@@ -104,13 +109,30 @@
                return  -1;
        }
   
 @@ -53,7 +61,7 @@
        /*
         * cygwin doesn't have isastream.
         */
 -@@ -204,78 +225,13 @@
 +@@ -209,79 +231,16 @@
                }
        }
   
 @@ -136,5 +144,8 @@
  +             kik_warn_printf( KIK_DEBUG_TAG " tcsetattr() failed.\n") ;
  +     #endif
        }
 ++     
 ++     kik_file_set_cloexec( *slave) ;
   
        return  pid ;
 + }
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-ah   2006-12-16 00:41:32.000000000 +0100
 @@ -0,0 +1,39 @@
 +$NetBSD$
 +
 +safer DIGIT_STR_LEN().
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/kiklib/src/kik_util.h?r1=1.4&r2=1.5&view=patch
 +
 +--- kiklib/src/kik_util.h.orig        2002/02/02 09:20:27     1.4
 ++++ kiklib/src/kik_util.h     2006/10/13 16:13:42     1.5
 +@@ -10,19 +10,20 @@
 + 
 + #define  K_MIN(n1,n2)  ((n1) > (n2) ? (n2) : (n1))
 + 
 +-/*
 +- * char  : 0 - 256 (3)
 +- * int16 : 0 - 65536 (5)
 +- * int32 : 0 - 4294967296 (10)
 +- * int64 : 0 - 18446744073709551616 (20)
 ++/* TYPE: MIN(signed) -- MAX(unsigned) (number of bytes needed)
 ++ * char  : -128 -- 256 (4)
 ++ * int16 : -32768 -- 65536 (6)
 ++ * int32 : -2147483648 -- 4294967296 (11)
 ++ * int64 : -9223372036854775808 -- 18446744073709551616 (20)
 +  * 
 +- * 40 is evenly selected in other cases just to be sure.
 ++ * Since log10(2^8) = 2.4..., (sizeof(n)*3) is large enough
 ++ * for all n >= 2.
 +  */
 + #define  DIGIT_STR_LEN(n)  \
 +-     ((sizeof(n) == 1) ? 3 : \
 +-     (sizeof(n) == 2) ? 5 : \
 +-     (sizeof(n) == 4) ? 10 : \
 +-     (sizeof(n) == 8) ? 20 : 40)
 ++     ((sizeof(n) == 1) ? 4 : \
 ++     (sizeof(n) == 2) ? 6 : \
 ++     (sizeof(n) == 4) ? 11 : \
 ++     (sizeof(n) == 8) ? 20 : (sizeof(n)*3))
 + 
 + 
 + #endif
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-ai   2006-12-16 01:25:22.000000000 +0100
 @@ -0,0 +1,60 @@
 +$NetBSD$
 +
 +plugged fd leaks.
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/kiklib/src/kik_file.c?r1=1.5&r2=1.6&view=patch
 +
 +--- kiklib/src/kik_file.c.orig        2003-01-12 13:34:31.000000000 +0100
 ++++ kiklib/src/kik_file.c     2006-12-16 01:22:10.000000000 +0100
 +@@ -2,6 +2,7 @@
 +  *   $Id: kik_file.c,v 1.5 2003/01/12 12:34:31 arakiken Exp $
 +  */
 + 
 ++#include  <fcntl.h>          /* fcntl() */
 + #include  "kik_file.h"
 + 
 + #include  "kik_config.h"
 +@@ -200,3 +201,43 @@
 + }
 + 
 + #endif
 ++
 ++int
 ++kik_file_set_cloexec(
 ++     int fd
 ++     )
 ++{
 ++     int  old_flags ;
 ++     
 ++     old_flags = fcntl( fd, F_GETFD) ;
 ++     if( old_flags == -1)
 ++     {
 ++             return  0 ;
 ++     }
 ++     
 ++     if( !(old_flags & FD_CLOEXEC)
 ++      && (fcntl( fd, F_SETFD, old_flags|FD_CLOEXEC) == -1) )
 ++     {
 ++             return  0 ;
 ++     }
 ++     return  1 ;
 ++}
 ++
 ++kik_file_unset_cloexec(
 ++     int fd
 ++     )
 ++{
 ++     int  old_flags ;
 ++
 ++     old_flags = fcntl( fd, F_GETFD) ;
 ++        if( old_flags == -1)
 ++        {
 ++             return  0 ;
 ++     }
 ++     if( (old_flags & FD_CLOEXEC)
 ++      && (fcntl( fd, F_SETFD, old_flags & (~FD_CLOEXEC)) == -1) )
 ++        {
 ++             return  0 ;
 ++     }
 ++     return  1 ;
 ++}
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-aj   2006-12-16 00:41:39.000000000 +0100
 @@ -0,0 +1,17 @@
 +$NetBSD$
 +
 +plugged fd leaks.
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/kiklib/src/kik_file.h?r1=1.5&r2=1.6&view=patch
 +
 +--- kiklib/src/kik_file.h.orig        2003/01/12 12:34:31     1.5
 ++++ kiklib/src/kik_file.h     2006/10/19 14:41:51     1.6
 +@@ -33,5 +33,8 @@
 + 
 + int  kik_file_unlock( int  fd) ;
 + 
 ++int  kik_file_set_cloexec( int  fd) ;
 ++
 ++int  kik_file_unset_cloexec( int  fd) ;
 + 
 + #endif
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-ak   2006-12-16 00:41:47.000000000 +0100
 @@ -0,0 +1,40 @@
 +$NetBSD$
 +
 +plugged fd leaks.
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/kiklib/src/kik_pty_bsd.c?r1=1.9&r2=1.10&view=patch
 +
 +--- kiklib/src/kik_pty_bsd.c.orig     2003/03/08 03:19:29     1.9
 ++++ kiklib/src/kik_pty_bsd.c  2006/10/19 14:41:51     1.10
 +@@ -118,6 +118,7 @@
 +                      }
 +                      else
 +                      {
 ++                             kik_file_set_cloexec( *master) ;
 +                              /*
 +                               * we succeeded to open pty master.
 +                               * opening pty slave in succession. 
 +@@ -136,6 +137,7 @@
 +                                      }
 +                                      else
 +                                      {
 ++                                             kik_file_set_cloexec( *slave) ;
 +                                              return  1 ;
 +                                      }
 +                              }
 +@@ -195,7 +197,6 @@
 +      /*
 +       * parent process
 +       */
 +-
 +      /*
 +       * delaying.
 +       */
 +@@ -301,5 +302,7 @@
 +      #endif
 +      }
 +      
 ++     kik_file_set_cloexec( *slave) ; 
 ++     
 +      return  pid ;
 + }
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-al   2006-12-16 00:41:52.000000000 +0100
 @@ -0,0 +1,52 @@
 +$NetBSD$
 +
 +plugged fd leaks.
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/xwindow/x_xim.c?r1=1.9&r2=1.11&view=patch
 +
 +--- xwindow/x_xim.c.orig      2005/02/10 15:15:08     1.9
 ++++ xwindow/x_xim.c   2006/10/23 13:09:36     1.11
 +@@ -5,6 +5,8 @@
 + 
 + #include  "x_xim.h"
 + 
 + #include  <stdio.h>          /* sprintf */
 + #include  <string.h>         /* strcmp/memset */
 ++#include  <unistd.h>         /* dup/close */
 ++#include  <kiklib/kik_file.h>        /* kik_set_file_cloexec */
 + #include  <kiklib/kik_debug.h>
 +@@ -121,6 +123,7 @@
 +      char *  xmod ;
 +      char *  cur_locale ;
 +      int  result ;
 ++     int  next_fd ; /* to deal with brain-dead XIM implemantations */
 + 
 +      /* 4 is the length of "@im=" */
 +      if( ( xmod = alloca( 4 + strlen( xim->name) + 1)) == NULL)
 +@@ -154,6 +157,12 @@
 + 
 +      result = 0 ;
 + 
 ++     next_fd = dup( 0) ;
 ++     if( next_fd != -1)
 ++     {
 ++             /* remember the lowest unused fd */
 ++             close( next_fd) ;
 ++     }       
 +      if( XSetLocaleModifiers(xmod) && ( xim->im = XOpenIM( display , NULL , 
NULL , NULL)))
 +      {
 +              if( ( xim->encoding = ml_get_char_encoding( kik_get_codeset())) 
== ML_UNKNOWN_ENCODING ||
 +@@ -172,7 +181,12 @@
 +                      result = 1 ;
 +              }
 +      }
 +-     
 ++     if( next_fd > 0)
 ++     {
 ++             /* if XOpenIM() internally opens a fd,
 ++              * we should close it on exec() */
 ++             kik_file_set_cloexec( next_fd) ;
 ++     }
 +      if( cur_locale)
 +      {
 +              /* restoring */
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-am   2006-12-16 00:41:59.000000000 +0100
 @@ -0,0 +1,56 @@
 +$NetBSD$
 +
 +plugged fd leaks.
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/mlterm/ml_config_menu.c?r1=1.6&r2=1.7&view=patch
 +
 +--- mlterm/ml_config_menu.c.orig      2003/09/16 03:18:31     1.6
 ++++ mlterm/ml_config_menu.c   2006/10/19 14:41:51     1.7
 +@@ -33,6 +33,7 @@
 +      if( config_menu->pid == pid)
 +      {
 +              config_menu->pid = 0 ;
 ++             close( config_menu->fd) ;
 +              config_menu->fd = -1 ;
 +      }
 + }
 +@@ -83,6 +84,12 @@
 +              return  0 ;
 +      }
 + 
 ++     if( !kik_file_unset_cloexec( pty_fd))
 ++     {
 ++             /* configulators require an inherited pty. */
 ++             return  0 ;
 ++     }
 ++
 +      if( pipe( fds) == -1)
 +      {
 +              return  0 ;
 +@@ -131,8 +138,14 @@
 + 
 +              close( fds[1]) ;
 + 
 +-             if( dup2( fds[0] , STDIN_FILENO) == -1 || dup2( pty_fd , 
STDOUT_FILENO) == -1 ||
 +-                     execv( cmd_path , args) == -1)
 ++             /* for configulators,
 ++              * STDIN => to read replys from mlterm
 ++              * STDOUT => to write the "master" side of pty
 ++              * STDERR => is retained to be the mlterm's STDERR
 ++              */
 ++             if( dup2( fds[0] , STDIN_FILENO) == -1
 ++              || dup2( pty_fd , STDOUT_FILENO) == -1
 ++              || execv( cmd_path , args) == -1)
 +              {
 +                      /* failed */
 + 
 +@@ -148,6 +161,9 @@
 + 
 +      config_menu->fd = fds[1] ;
 +      config_menu->pid = pid ;
 ++     
 ++     kik_file_set_cloexec( pty_fd) ;
 ++     kik_file_set_cloexec( config_menu->fd) ;
 + 
 +      return  1 ;
 + }
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-an   2006-12-16 00:42:10.000000000 +0100
 @@ -0,0 +1,26 @@
 +$NetBSD$
 +
 +plugged fd leaks.
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/xwindow/x_display.c?r1=1.4&r2=1.5&view=patch
 +
 +--- xwindow/x_display.c.orig  2003/12/09 11:56:13     1.4
 ++++ xwindow/x_display.c       2006/10/19 14:41:51     1.5
 +@@ -7,6 +7,7 @@
 + #include  <kiklib/kik_debug.h>
 + #include  <kiklib/kik_mem.h>
 + #include  <kiklib/kik_str.h> /* strdup */
 ++#include  <kiklib/kik_file.h>        /* kik_file_set_cloexec */
 + 
 + #include  "x_xim.h"
 + #include  "x_picture.h"
 +@@ -39,6 +40,9 @@
 +              goto  error1 ;
 +      }
 + 
 ++     /* set close-on-exec flag on the socket connected to X. */
 ++     kik_file_set_cloexec( XConnectionNumber( disp->display));
 ++
 +      if( ( disp->name = strdup( name)) == NULL)
 +      {
 +              goto  error2 ;
 --- /dev/null  2006-12-18 17:14:33.000000000 +0100
 +++ patches/patch-ao   2006-12-16 00:42:17.000000000 +0100
 @@ -0,0 +1,35 @@
 +$NetBSD$
 +
 +plugged fd leaks.
 +
 
+http://mlterm.cvs.sourceforge.net/mlterm/mlterm/xwindow/x_term_manager.c?r1=1.93&r2=1.95&view=patch
 +
 +--- xwindow/x_term_manager.c.orig     2006/09/30 16:09:44     1.93
 ++++ xwindow/x_term_manager.c  2006/11/20 11:22:34     1.95
 +@@ -872,7 +872,8 @@
 +      {
 +              return  -1 ;
 +      }
 +-
 ++     kik_file_set_cloexec( sock_fd);
 ++     
 +      while( bind( sock_fd , (struct sockaddr *) &servaddr , sizeof( 
servaddr)) < 0)
 +      {
 +              if( errno == EADDRINUSE)
 +@@ -993,7 +994,7 @@
 +       * If this flag off, this fd remained open until the child process 
forked in
 +       * open_screen_intern()(ml_term_open_pty()) close it.
 +       */
 +-     fcntl( fd , F_SETFD , 1) ;
 ++     kik_file_set_cloexec( fd) ;
 + 
 +      if( ( fp = fdopen( fd , "r+")) == NULL)
 +      {
 +@@ -1855,6 +1856,7 @@
 +              {
 +                      additional_fds[i].fd = fd ;
 +                      additional_fds[i].handler = handler ;
 ++                     kik_file_set_cloexec( fd);
 + 
 +                      return  0 ;
 +              }
 
 --9amGYk9869ThD9tj--
 



Home | Main Index | Thread Index | Old Index