[Pkg-tcltk-devel] Bug#746161: tcl8.5: segfault when rand() is used after closing a db file
Dave U. Random
anonymous at anonymitaet-im-inter.net
Sun Apr 27 12:00:25 UTC 2014
Package: tcl8.5
Version: 8.5.11-2
Severity: normal
Dear Maintainer,
In attempt to implement concurrent access to a db file, there is a
circumstance where a call to rand() triggers a segmentation fault. A
minimal code example is below.
Note that this example probably demonstrates a bad implementation
approach. Regardless, a call to rand() should never cause a
segmentation fault. Also note that this sample code is very similar
to a separate bug recently reported against the libsqlite3-tcl
package. But it differs in that the other bug does not involve rand()
and is not a segfault.
====8<----------------------------------------
#!/usr/bin/tclsh8.5
package require sqlite3
set script_basename [lindex [file split [info script]] end]
regsub -all -- {[[:punct:]]} $script_basename {_} script_id
set db_filename [exec mktemp --tmpdir=/tmp --suffix=.db ${script_id}_XXX]
proc init_db {} {
global db_filename
sqlite3 my_db $db_filename
my_db timeout 3000
}
init_db
my_db eval {create table if not exists my_tbl (bank text not null primary key,
party_supported text,
bailed_out text,
supports_cispa text)}
my_db eval {insert into my_tbl (bank) values ('bank of america')}
my_db eval {insert into my_tbl (bank) values ('chase')}
my_db eval {insert into my_tbl (bank) values ('citibank')}
my_db eval {insert into my_tbl (bank) values ('pnc')}
my_db eval {insert into my_tbl (bank) values ('suntrust')}
my_db eval {select bank from my_tbl where party_supported is null} {
my_db eval {update my_tbl set party_supported = 'republican' where bank = $bank}
my_db eval {update my_tbl set bailed_out = 'true' where bank = $bank}
my_db eval {update my_tbl set supports_cispa = 'true' where bank = $bank}
# Closing the db is perhaps a bad idea at this point given that we
# are inside of a query operation. Regardless, it should not
# create opportunity for a segmentation fault.
my_db close; #give other db users a chance to gain access
# The following use of rand() somehow to contributes to the
# segmentation fault. If /after/ is not called (or it is supplied
# an integer literal instead), then the segmentation fault does
# not occur. Instead we later get an erroneous error about a db
# lock.
after [expr int(rand()*10000) + 10000]; #make the db available for a random amount of time
init_db; #take back the db
}
====8<----------------------------------------
-- System Information:
Debian Release: 7.4
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Kernel: Linux 3.2.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages tcl8.5 depends on:
ii libc6 2.13-38+deb7u1
tcl8.5 recommends no packages.
Versions of packages tcl8.5 suggests:
pn tcl-tclreadline <none>
-- no debconf information
More information about the Pkg-tcltk-devel
mailing list