Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: emacs-24.3: test request
On Sun, Sep 08, 2013 at 14:36:41 +0400, Valery Ushakov wrote:
> Date: Sun, 8 Sep 2013 14:36:41 +0400
> From: Valery Ushakov <uwe%stderr.spb.ru@localhost>
> To: Robert Swindells <rjs%fdy2.co.uk@localhost>, wiz%NetBSD.org@localhost,
> pkgsrc-users%NetBSD.org@localhost, current-users%NetBSD.org@localhost
> Subject: Re: emacs-24.3: test request
> Mail-Followup-To: Robert Swindells <rjs%fdy2.co.uk@localhost>,
> wiz%NetBSD.org@localhost,
> pkgsrc-users%NetBSD.org@localhost, current-users%NetBSD.org@localhost
>
> On Sun, Sep 08, 2013 at 14:23:47 +0400, Valery Ushakov wrote:
>
> > With the following breakpoints on assignemnts to/from environ:
> >
> > break callproc.c:496
> > break callproc.c:643
> > break callproc.c:1314
> > break editfns.c:1912
> > break editfns.c:1940
> > break editfns.c:1941
> > break editfns.c:2119
> > break editfns.c:2177
> > break process.c:1734
> > break process.c:1879
> >
> >
> >
> > Starting program:
> > /usr/pkgsrc/editors/emacs24/work/emacs-24.3/src/emacs-24.3.1
> > /usr/pkgsrc/doc/guide/files/options.xml
> > Gtk-Message: Failed to load module "canberra-gtk-module"
> > [Switching to LWP 1]
> >
> > Breakpoint 4, Fencode_time (nargs=9, args=0x7f7fffff74e8) at editfns.c:1912
> > 1912 char **oldenv = environ, **newenv;
> > (gdb) p environ
> > $1 = (char **) 0x11f3400
> > (gdb) watch *(char **)0x11f3400
> > Watchpoint 11: *(char **)0x11f3400
> > (gdb) n
> >
> > Breakpoint 8, set_time_zone_rule (tzstring=0x7f7fffff7330 "XXX-0:00:00")
> > at editfns.c:2177
> > 2177 environ = newenv;
> > (gdb)
> > 2220 }
> > (gdb) p environ
> > $3 = (char **) 0x15c9800
> > (gdb) n
> > Fencode_time (nargs=9, args=0x7f7fffff74e8) at editfns.c:1937
> > 1937 value = mktime (&tm);
> > (gdb)
> > Watchpoint 11: *(char **)0x11f3400
> >
> > Old value = 0x7f7ffffffd2d "PILOTRATE=115200"
> > New value = 0x1476400 ""
> > _free_internal_nolock (ptr=0x11f3400) at gmalloc.c:1224
> > 1224 prev->prev = &_fraghead[type];
> > (gdb) p environ
> > $4 = (char **) 0x15c9800
> > (gdb) bt
> > #0 _free_internal_nolock (ptr=0x11f3400) at gmalloc.c:1224
> > #1 0x0000000000664ecf in _free_internal (ptr=0x11f3400) at gmalloc.c:1241
> > #2 0x0000000000664f1e in free (ptr=0x11f3400) at gmalloc.c:1255
> > #3 0x00007f7fec4b2beb in ?? () from /usr/lib/libc.so.12
> > #4 0x00007f7fec4b2dc7 in __getenvslot () from /usr/lib/libc.so.12
> > #5 0x00007f7fec4b2f42 in __findenvvar () from /usr/lib/libc.so.12
> > #6 0x00007f7fec4b29e0 in getenv () from /usr/lib/libc.so.12
> > #7 0x00007f7fec4ab594 in ?? () from /usr/lib/libc.so.12
> > #8 0x00007f7fec4ab85f in __localtime_r50 () from /usr/lib/libc.so.12
> > #9 0x0000000000679a16 in ranged_convert (
> > convert=0x4114a0 <__localtime_r50@plt>, t=0x7f7fffff7240,
> > tp=0x7f7fffff7200) at mktime.c:310
> > #10 0x0000000000679e2f in mktime_internal (tp=0x7f7fffff73a0,
> > convert=0x4114a0 <__localtime_r50@plt>, offset=0xc06250) at mktime.c:478
> > #11 0x000000000067a15b in rpl_mktime (tp=0x7f7fffff73a0) at mktime.c:591
> > #12 0x00000000005b89c7 in Fencode_time (nargs=9, args=0x7f7fffff74e8)
> > at editfns.c:1937
> > [...]
> >
> >
> > So it looks like libc is confused by changed environ (see
> > stdlib/_env.c in libc).
>
> Ah, it's __scrubenv() that clobbers it:
>
> ssize_t
> __getenvslot(const char *name, size_t l_name, bool allocate)
> {
> size_t new_size, num_entries, required_size;
> char **new_environ;
>
> /* Does the environ need scrubbing? */
> if (environ != allocated_environ && allocated_environ != NULL)
> __scrubenv();
This is from
----------------------------
revision 1.4
date: 2010-11-16 20:23:10 +0300; author: tron; state: Exp; lines: +60 -13;
Implement mark & sweep garbage collection as suggested by Enami Tsugutomo
on "current-users" mailing list. Garbage collection is performed if:
1.) We previously allocated memory for the environment array which
is no longer used because the application overwrote "environ".
2.) We find a non-NULL pointer in the allocated environment array after
the end of the environment. This happens if the applications attempts
to clear the environment with something like "environ[0] = NULL;".
and I think it has to be reverted, since you can't do g/c if you don't
know all roots.
-uwe
Home |
Main Index |
Thread Index |
Old Index