reopen 494221
clone 494221 -1
reassign -1 librrd4
retitle -1 librrd4: segfault in rrd_open() on sparc
block 494221 by -1
thanks

I don't have any problem reproducing it on sparc, so reopening. The 
segfault occurs in rrd_open() function in librrd4, as following gdb 
session illustrates (rebuilt rrd with debugging symbols to get it):

Starting program: /usr/bin/rrdtool create zero.rrd DS:mon_25:GAUGE:600:U:U 
RRA:AVERAGE:0:1:1 RRA:LAST:0:1:1 RRA:MAX:0:1:1
[Thread debugging using libthread_db enabled]
[New Thread 0xf751e700 (LWP 29891)]
[Switching to Thread 0xf751e700 (LWP 29891)]

Breakpoint 1, rrd_dontneed (rrd_file=0x28680, rrd=0xfff0f2c8) at rrd_open.c:329
329         ssize_t   _page_size = sysconf(_SC_PAGESIZE);
(gdb) n
336         rra_start = rrd_file->header_len;
(gdb) 
337         dontneed_start = PAGE_START(rra_start) + _page_size;
(gdb) 
338         for (i = 0; i < rrd->stat_head->rra_cnt; ++i) {
(gdb) 
339             active_block =
(gdb) display i
5: i = 0
(gdb) n
343             if (active_block > dontneed_start) {
5: i = 0
(gdb) 
355             dontneed_start = active_block;
5: i = 0
(gdb) 
358             if (rrd->stat_head->pdp_step * rrd->rra_def[i].pdp_cnt -
5: i = 0
(gdb) 
361                 dontneed_start += _page_size;
5: i = 0
(gdb) 
363             rra_start +=
5: i = 0
(gdb) 
338         for (i = 0; i < rrd->stat_head->rra_cnt; ++i) {
5: i = 0
(gdb) 
339             active_block =
5: i = 1
(gdb) 
343             if (active_block > dontneed_start) {
5: i = 1
(gdb) 
355             dontneed_start = active_block;
5: i = 1
(gdb) 
358             if (rrd->stat_head->pdp_step * rrd->rra_def[i].pdp_cnt -
5: i = 1
(gdb) 
361                 dontneed_start += _page_size;
5: i = 1
(gdb) 
363             rra_start +=
5: i = 1
(gdb) 
338         for (i = 0; i < rrd->stat_head->rra_cnt; ++i) {
5: i = 1
(gdb) 
339             active_block =
5: i = 2
(gdb) 
343             if (active_block > dontneed_start) {
5: i = 2
(gdb) 
355             dontneed_start = active_block;
5: i = 2
(gdb) 
358             if (rrd->stat_head->pdp_step * rrd->rra_def[i].pdp_cnt -
5: i = 2
(gdb) 
361                 dontneed_start += _page_size;
5: i = 2
(gdb) 
363             rra_start +=
5: i = 2
(gdb) 
338         for (i = 0; i < rrd->stat_head->rra_cnt; ++i) {
5: i = 2
(gdb) 
368         madvise(rrd_file->file_start + dontneed_start,
5: i = 3
(gdb) list
363             rra_start +=
364                 rrd->rra_def[i].row_cnt * rrd->stat_head->ds_cnt *
365                 sizeof(rrd_value_t);
366         }
367     #ifdef USE_MADVISE
368         madvise(rrd_file->file_start + dontneed_start,
369                 rrd_file->file_len - dontneed_start, MADV_DONTNEED);
370     #endif
371     #ifdef HAVE_POSIX_FADVISE
372         posix_fadvise(rrd_file->fd, dontneed_start,
(gdb) print rrd_file
$14 = (rrd_file_t *) 0x28680
(gdb) print rrd_file->file_start
$15 = 0xf7f48000 "RRD"
(gdb) print dontneed_start
$16 = 8192
(gdb) print rrd_file->file_len
$17 = 972
(gdb) print rrd_file->file_len - dontneed_start
$18 = 4294960076
(gdb) bt
#0  rrd_dontneed (rrd_file=0x28680, rrd=0xfff0f2c8) at rrd_open.c:368
#1  0xf7ef6134 in rrd_create_fn (file_name=0xfff0f9ad "zero.rrd", 
rrd=0xfff0f3c4) at rrd_create.c:827
#2  0xf7ef4fd0 in rrd_create_r (filename=0xfff0f9ad "zero.rrd", pdp_step=300, 
last_up=1220819559, argc=4, argv=0xfff0f8a0) at rrd_create.c:555
#3  0xf7ef356c in rrd_create (argc=6, argv=0xfff0f898) at rrd_create.c:100
#4  0x000133ec in HandleInputLine (argc=7, argv=0xfff0f894, out=0xf7baaaf8) at 
rrd_tool.c:622
#5  0x00012b54 in main (argc=7, argv=0xfff0f894) at rrd_tool.c:494
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
rrd_dontneed (rrd_file=Cannot access memory at address 0x44) at rrd_open.c:372
372         posix_fadvise(rrd_file->fd, dontneed_start,
Disabling display 5 to avoid infinite recursion.
5: i = Cannot access memory at address 0xffffffe8

I guess that the problem here is passing negative second argument to 
madvise() which makes it very unhappy and smashes the stack, but I did 
not grok the code yet to understand what's going on here.

Cheers.
-- 
Jurij Smakov                                           [EMAIL PROTECTED]
Key: http://www.wooyd.org/pgpkey/                      KeyID: C99E03CC



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to