Marc Herbert wrote:
> Chet Ramey a écrit :
>> Marc Herbert wrote:
>>> The following script crashes bash versions 2.05, 3.2.25, 4.0.16,...
>>>
>>>
>>> trap "echo USR1caught" USR1
>>> read -t 1
>>> foo=$( kill -USR1 $$ )
>>> echo 'Yeah! no Segmentation fault!'
>> Thanks for the report.
> 
> Thanks for bash in the first place.
> 
> 
>> Fixed in the next version.
> 
> Chet, is there any workaround for existing versions?

Sure.  There's the usual idiom.  It's unusual to see a script that uses
command substitution for this.  Most existing scripts use simple
subshells to do it, whether (command) or asynchronous commands using `&'.

In general, if you want to do something like set an alarm to go off in
the future, say after 10 seconds, you do something like

{ sleep 10; kill -USR1 $$; } &

and perform a potentially blocking operation.

> I mean, there must be some memory corruption involved in here, so is it 
> possible to dodge it without upgrading? For instance, would simply avoiding 
> the "-t" option of "read" be enough to guarantee no memory corruption? Other? 
> Thanks a lot in advance!

It's a combination of the assignment statement and the trap handling.
Yes, there is memory corruption that occurs, because the trap handler
doesn't unwind-protect a global variable used by the expansion and
execution code.

Chet
-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer

Chet Ramey, ITS, CWRU    c...@case.edu    http://cnswww.cns.cwru.edu/~chet/


Reply via email to