emacs-pretest-bug
[Top][All Lists]
Advanced

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

Re: Reentrant call to malloc/free


From: YAMAMOTO Mitsuharu
Subject: Re: Reentrant call to malloc/free
Date: Sat, 08 Jul 2006 14:53:38 +0900
User-agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.6 (Marutamachi) APEL/10.6 Emacs/22.0.50 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)

>>>>> On Thu, 06 Jul 2006 09:53:57 +0900, YAMAMOTO Mitsuharu <address@hidden> 
>>>>> said:

> I've once posted a (not complete) list of Darwin library functions
> that may call malloc-related functions but are not protected by
> BLOCK_INPUT:

>    localtime, gmtime, ctime, opendir, getc, getaddrinfo, fwrite,
> mkstemp fclose, closedir, freeaddrinfo, mktime (not used as of
> 2004-09)

> (http://lists.gnu.org/archive/html/emacs-devel/2004-09/msg00074.html)

> I cannot detect `getgrgid' as such a function, but I guess this is
> due to the difference in name service backends (NIS, LDAP, ...).

Sorry, I could.  So it has nothing to do with the type of backends.
Also, I found that getpwuid/getpwnam/getgrgid in both glibc and
FreeBSD libc called malloc-related functions.  So I think it's
reasonable to put BLOCK_INPUTs around them.  Objections?

                                     YAMAMOTO Mitsuharu
                                address@hidden

Index: src/Makefile.in
===================================================================
RCS file: /cvsroot/emacs/emacs/src/Makefile.in,v
retrieving revision 1.327
diff -c -p -r1.327 Makefile.in
*** src/Makefile.in     18 May 2006 17:05:36 -0000      1.327
--- src/Makefile.in     8 Jul 2006 05:30:06 -0000
*************** pre-crt0.o: pre-crt0.c
*** 1108,1114 ****
  ecrt0.o: ecrt0.c $(config_h)
        CRT0_COMPILE ${srcdir}/ecrt0.c
  dired.o: dired.c commands.h buffer.h $(config_h) charset.h coding.h regex.h \
!    systime.h
  dispnew.o: dispnew.c  systty.h systime.h commands.h process.h frame.h \
     window.h buffer.h dispextern.h termchar.h termopts.h termhooks.h cm.h \
     disptab.h indent.h intervals.h \
--- 1108,1114 ----
  ecrt0.o: ecrt0.c $(config_h)
        CRT0_COMPILE ${srcdir}/ecrt0.c
  dired.o: dired.c commands.h buffer.h $(config_h) charset.h coding.h regex.h \
!    systime.h blockinput.h
  dispnew.o: dispnew.c  systty.h systime.h commands.h process.h frame.h \
     window.h buffer.h dispextern.h termchar.h termopts.h termhooks.h cm.h \
     disptab.h indent.h intervals.h \
*************** doprnt.o: doprnt.c charset.h $(config_h)
*** 1119,1130 ****
  dosfns.o: buffer.h termchar.h termhooks.h frame.h blockinput.h window.h \
     msdos.h dosfns.h dispextern.h charset.h coding.h $(config_h)
  editfns.o: editfns.c window.h buffer.h systime.h $(INTERVAL_SRC) charset.h \
!    coding.h dispextern.h frame.h $(config_h)
  emacs.o: emacs.c commands.h systty.h syssignal.h blockinput.h process.h \
     termhooks.h buffer.h atimer.h systime.h $(INTERVAL_SRC) $(config_h) \
     window.h dispextern.h keyboard.h keymap.h
  fileio.o: fileio.c window.h buffer.h systime.h $(INTERVAL_SRC) charset.h \
!    coding.h msdos.h dispextern.h $(config_h)
  filelock.o: filelock.c buffer.h charset.h coding.h systime.h epaths.h 
$(config_h)
  filemode.o: filemode.c  $(config_h)
  frame.o: frame.c xterm.h window.h frame.h termhooks.h commands.h keyboard.h \
--- 1119,1130 ----
  dosfns.o: buffer.h termchar.h termhooks.h frame.h blockinput.h window.h \
     msdos.h dosfns.h dispextern.h charset.h coding.h $(config_h)
  editfns.o: editfns.c window.h buffer.h systime.h $(INTERVAL_SRC) charset.h \
!    coding.h dispextern.h frame.h blockinput.h $(config_h)
  emacs.o: emacs.c commands.h systty.h syssignal.h blockinput.h process.h \
     termhooks.h buffer.h atimer.h systime.h $(INTERVAL_SRC) $(config_h) \
     window.h dispextern.h keyboard.h keymap.h
  fileio.o: fileio.c window.h buffer.h systime.h $(INTERVAL_SRC) charset.h \
!    coding.h msdos.h dispextern.h blockinput.h $(config_h)
  filelock.o: filelock.c buffer.h charset.h coding.h systime.h epaths.h 
$(config_h)
  filemode.o: filemode.c  $(config_h)
  frame.o: frame.c xterm.h window.h frame.h termhooks.h commands.h keyboard.h \
Index: src/dired.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/dired.c,v
retrieving revision 1.123
diff -c -p -r1.123 dired.c
*** src/dired.c 24 Jun 2006 07:24:42 -0000      1.123
--- src/dired.c 8 Jul 2006 05:30:06 -0000
*************** extern struct direct *readdir ();
*** 99,104 ****
--- 99,105 ----
  #include "charset.h"
  #include "coding.h"
  #include "regex.h"
+ #include "blockinput.h"
  
  /* Returns a search buffer, with a fastmap allocated and ready to go.  */
  extern struct re_pattern_buffer *compile_pattern ();
*************** Elements of the attribute list are:
*** 951,960 ****
--- 952,963 ----
      }
    else
      {
+       BLOCK_INPUT;
        pw = (struct passwd *) getpwuid (s.st_uid);
        values[2] = (pw ? build_string (pw->pw_name) : make_number (s.st_uid));
        gr = (struct group *) getgrgid (s.st_gid);
        values[3] = (gr ? build_string (gr->gr_name) : make_number (s.st_gid));
+       UNBLOCK_INPUT;
      }
    values[4] = make_time (s.st_atime);
    values[5] = make_time (s.st_mtime);
Index: src/editfns.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/editfns.c,v
retrieving revision 1.416
diff -c -p -r1.416 editfns.c
*** src/editfns.c       28 Jun 2006 00:00:57 -0000      1.416
--- src/editfns.c       8 Jul 2006 05:30:06 -0000
*************** Boston, MA 02110-1301, USA.  */
*** 56,61 ****
--- 56,62 ----
  #include "coding.h"
  #include "frame.h"
  #include "window.h"
+ #include "blockinput.h"
  
  #ifdef STDC_HEADERS
  #include <float.h>
*************** with that uid, or nil if there is no suc
*** 1302,1308 ****
--- 1303,1311 ----
      return Vuser_login_name;
  
    CHECK_NUMBER (uid);
+   BLOCK_INPUT;
    pw = (struct passwd *) getpwuid (XINT (uid));
+   UNBLOCK_INPUT;
    return (pw ? build_string (pw->pw_name) : Qnil);
  }
  
*************** name, or nil if there is no such user.  
*** 1356,1364 ****
    if (NILP (uid))
      return Vuser_full_name;
    else if (NUMBERP (uid))
!     pw = (struct passwd *) getpwuid ((uid_t) XFLOATINT (uid));
    else if (STRINGP (uid))
!     pw = (struct passwd *) getpwnam (SDATA (uid));
    else
      error ("Invalid UID specification");
  
--- 1359,1375 ----
    if (NILP (uid))
      return Vuser_full_name;
    else if (NUMBERP (uid))
!     {
!       BLOCK_INPUT;
!       pw = (struct passwd *) getpwuid ((uid_t) XFLOATINT (uid));
!       UNBLOCK_INPUT;
!     }
    else if (STRINGP (uid))
!     {
!       BLOCK_INPUT;
!       pw = (struct passwd *) getpwnam (SDATA (uid));
!       UNBLOCK_INPUT;
!     }
    else
      error ("Invalid UID specification");
  
Index: src/fileio.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/fileio.c,v
retrieving revision 1.567
diff -c -p -r1.567 fileio.c
*** src/fileio.c        23 Jun 2006 10:19:11 -0000      1.567
--- src/fileio.c        8 Jul 2006 05:30:07 -0000
*************** extern int errno;
*** 77,82 ****
--- 77,83 ----
  #include "charset.h"
  #include "coding.h"
  #include "window.h"
+ #include "blockinput.h"
  
  #ifdef WINDOWSNT
  #define NOMINMAX 1
*************** See also the function `substitute-in-fil
*** 1386,1392 ****
--- 1387,1395 ----
          bcopy ((char *) nm, o, p - nm);
          o [p - nm] = 0;
  
+         BLOCK_INPUT;
          pw = (struct passwd *) getpwnam (o + 1);
+         UNBLOCK_INPUT;
          if (pw)
            {
              newdir = (unsigned char *) pw -> pw_dir;
*************** See also the function `substitute-in-fil
*** 1917,1923 ****
--- 1920,1928 ----
        o[len] = 0;
  
        /* Look up the user name. */
+       BLOCK_INPUT;
        pw = (struct passwd *) getpwnam (o + 1);
+       UNBLOCK_INPUT;
        if (!pw)
          error ("\"%s\" isn't a registered user", o + 1);
  
*************** search_embedded_absfilename (nm, endp)
*** 2111,2117 ****
              /* If we have ~user and `user' exists, discard
                 everything up to ~.  But if `user' does not exist, leave
                 ~user alone, it might be a literal file name.  */
!             if ((pw = getpwnam (o + 1)))
                return p;
              else
                xfree (pw);
--- 2116,2125 ----
              /* If we have ~user and `user' exists, discard
                 everything up to ~.  But if `user' does not exist, leave
                 ~user alone, it might be a literal file name.  */
!             BLOCK_INPUT;
!             pw = getpwnam (o + 1);
!             UNBLOCK_INPUT;
!             if (pw)
                return p;
              else
                xfree (pw);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]