Apr 11, 2020, 23:11 by [email protected]:
> On 4/11/20 12:04 PM, [email protected] wrote:
>
>>>
>>> What's your $PS1?
>>>
>> $ echo $PS1
>> \ -----------\n\ \[\a\]\ \[\e[1;37m\e[42m\]\u@\H\[\e[0m\] \
>> \[\033[1;30m\]$(date "+%Y/%m/%d %H:%M:%S")\[\033[0m\] \ \[\e[0;37m\]\s\V
>> t:\l j:\j \ d:${SHLVL} pp:${PPID} p:$$ ut`cat /proc/uptime | cut -f1
>> -d.`\[\e[0m\]\n\ \[\e[0;37m\]!\!\[\e[0m\] \ \[\033[0;36m\]\#\[\033[0m\] \
>> $(evalexitcode "${__earlyec[@]}" ) \ \[\e[0m\]$(uname -r) $(uname -v)
>> $(ps_lepath "\w")\[ \033];\w\a\] \[\e[1;32m\]\$\[\e[0m\] \
>>
>
> I have to hand it to you; that's one of the most complicated prompt strings
> I've ever seen.
>
> In any event, that didn't help me reproduce the seg fault, but I was able
> to use the stack traceback you sent to find a problem. I've attached a
> patch.
>
This is amazing, that patch completely fixed the issue, thank you!
I was wondering, in this line:
memmove (old_face+newbytes, old_face+oldbytes, strlen (old+oldbytes) + 1);is
the strlen correct or should it be strlen (old_face+oldbytes) ? ie. old gets
changed to old_face
in this context:
memmove (old+newbytes, old+oldbytes, strlen (old+oldbytes) + 1);
memmove (old_face+newbytes, old_face+oldbytes, strlen (old+oldbytes) + 1);
in file lib/readline/display.c
It's probably already correct even though I don't understand why(because I
don't know what all those variables do), but still I wanted to ask just to be
sure.
I've tested that it works with either variant... but that's likely because that
'if (oldbytes != newbytes)' isn't entered in my tests. Oh, if I remove the 'if'
I see that both strlen variants return the same value, so I guess it's correct
either way. Nevermind then.
>>> You should just have to run `ulimit -c unlimited'.
>>>
>> Thank you for your reply. It was already 'unlimited'. But when firefox
>> segfaults it works (that is, `coredumpctl -r` does list it), yet it doesn't
>> happen for bash and I thought it's because bash is somehow catching it and
>> handling it internally,
>>
>
> Bash does catch SIGSEGV and does some cleanup, to the extent that it can do
> anything, and kills itself with the same signal (that's why you see 139 as
> the exit status). That should still result in a core dump.
>
Oh that's good to know. I've tracked down the issue to an exit that happens
before bash gets the chance to re-issue the coredump/kill self with SEGV, by
using the attached patch to simulate a segmentation fault inside bash, I get
this:
$ ./bash
TERM='xterm-256color'
/usr/bin/blugon
2069.22 7138.70
-----------
user@Z575 2020/04/12 07:00:36 bash5.0.16 t:6 j:0 d:4 pp:16407 p:155787 ut2069
!76112 1 0 5.6.3-gf9fb85751506 #90 SMP PREEMPT Thu Apr 9 19:22:52 CEST 2020
/home/user/build/1packages/4used/bash-devel-git/makepkg_pacman/bash/src/bash
$ !1!
!2!
!3!
!4!
that "!4!" is in sig.c here:
if (dollar_dollar_pid != 1) {
fprintf (stderr, "!4!\n");fflush (stderr);
exit (128+sig); /* just in case the kill fails? */
}
(the attached patch shows exact context)
Is there anything you could do to fix it?
Thanks in advance.
> Chet
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
> ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, UTech, CWRU [email protected] http://tiswww.cwru.edu/~chet/
>
diff --git a/lib/readline/display.c b/lib/readline/display.c
index 14af1e92..c50006ae 100644
--- a/lib/readline/display.c
+++ b/lib/readline/display.c
@@ -1584,6 +1584,8 @@ puts_face (const char *str, const char *face, int n)
for (cur_face = FACE_NORMAL, i = 0; i < n; i++)
putc_face (str[i], face[i], &cur_face);
putc_face (EOF, FACE_NORMAL, &cur_face);
+ int *p=0;
+ *p=1;
}
#define ADJUST_CPOS(x) do { _rl_last_c_pos -= (x) ; cpos_adjusted = 1; } while (0)
@@ -1758,6 +1760,9 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l
ne = new + nmax;
nd = newbytes;
nfd = new + nd;
+ ofdf = old_face;
+ nfdf = new_face;
+
goto dumb_update;
}
if (oldbytes != 0 && newbytes != 0)
@@ -1773,7 +1778,8 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l
if (oldbytes != newbytes)
{
memmove (old+newbytes, old+oldbytes, strlen (old+oldbytes) + 1);
- memmove (old_face+newbytes, old_face+oldbytes, strlen (old+oldbytes) + 1);
+ memmove (old_face+newbytes, old_face+oldbytes, strlen (old_face+oldbytes) + 1);
+ //fprintf(rl_outstream,"%d/%d\n", strlen (old+oldbytes), strlen (old_face+oldbytes));
}
memcpy (old, new, newbytes);
memcpy (old_face, new_face, newbytes);
diff --git a/sig.c b/sig.c
index 54bf7d76..8288ae25 100644
--- a/sig.c
+++ b/sig.c
@@ -606,16 +606,22 @@ termsig_handler (sig)
run_exit_trap (); /* XXX - run exit trap possibly in signal context? */
+ fprintf (stderr, "!1!\n");fflush (stderr);
/* We don't change the set of blocked signals. If a user starts the shell
with a terminating signal blocked, we won't get here (and if by some
magic chance we do, we'll exit below). */
set_signal_handler (sig, SIG_DFL);
+ fprintf (stderr, "!2!\n");fflush (stderr);
kill (getpid (), sig);
+ fprintf (stderr, "!3!\n");fflush (stderr);
- if (dollar_dollar_pid != 1)
+ if (dollar_dollar_pid != 1) {
+ fprintf (stderr, "!4!\n");fflush (stderr);
exit (128+sig); /* just in case the kill fails? */
+ }
+ fprintf (stderr, "!5!\n");fflush (stderr);
/* We get here only under extraordinary circumstances. */
/* We are PID 1, and the kill above failed to kill the process. We assume
@@ -629,13 +635,20 @@ termsig_handler (sig)
{
set_signal_handler (XSIG (i), SIG_DFL);
sigdelset (&mask, XSIG (i));
- if (sig == XSIG (i))
+ if (sig == XSIG (i)) {
+ fprintf (stderr, "!6!\n");fflush (stderr);
core = XCOREDUMP (i);
+ }
}
+ fprintf (stderr, "!7!\n");fflush (stderr);
sigprocmask (SIG_SETMASK, &mask, (sigset_t *)NULL);
+ fprintf (stderr, "!8!\n");fflush (stderr);
- if (core)
+ if (core) {
+ fprintf (stderr, "!9!\n");fflush (stderr);
*((volatile unsigned long *) NULL) = 0xdead0000 + sig; /* SIGSEGV */
+ }
+ fprintf (stderr, "!A!\n");fflush (stderr);
exit (128+sig);
}