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]