misc/108117: ncurses sigabrt's in delscreen() because of free() of
already free'd memory
Allan Kintigh
allank at nbs-inc.com
Fri Jan 19 14:00:39 UTC 2007
>Number: 108117
>Category: misc
>Synopsis: ncurses sigabrt's in delscreen() because of free() of already free'd memory
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Jan 19 14:00:38 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator: Allan Kintigh
>Release: 6.1-RELEASE, 6.2-RELEASE
>Organization:
National Bancard Services, Inc
>Environment:
FreeBSD developbsd.nbs 6.1-RELEASE FreeBSD 6.1-RELEASE #0: Sun May 7 04:42:56 UTC 2006 root at opus.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP i386
>Description:
ncurses as distributed on 6.1-RELEASE and 6.2-RELEASE system has a free() of already free'd memory in the delscreen() function causing an error message to be sent to stderr and if running as root causes a sigabrt to be sent to the process.
>How-To-Repeat:
#include <time.h>
#include <curses.h>
/*
* cc -o nc_test -lncurses ncurses.c
*/
int current_getch;
int doloop = 1;
static SCREEN *s;
static WINDOW *screen;
int now_sec, now_min, now_hour, now_day, now_wday, now_month, now_year;
time_t now;
struct tm *now_tm;
void screen_init(void) {
s = newterm("vt100", stdout, stdin);
set_term (s);
noecho();
cbreak();
halfdelay(1);
refresh(); // 1)
screen = newwin(13, 27, 1, 1);
box(screen, ACS_VLINE, ACS_HLINE);
}
static void update_display(void) {
curs_set(0);
mvwprintw(screen,1,1,"-------- HEADER --------");
mvwprintw(screen,3,6,"TIME: %d:%d:%d", now_hour, now_min, now_sec);
mvwprintw(screen,5,6,"DATE: %d-%d-%d", now_day, now_month, now_year);
mvwprintw(screen,7,6,"PRESS q TO END");
mvwprintw(screen,10,1,"-------- FOOTER --------");
wrefresh(screen);
refresh();
}
void screen_end(void) {
delwin(screen);
endwin();
delscreen(s);
}
void maketime(void) {
// Get the current date/time
now = time (NULL);
now_tm = localtime (&now);
now_sec = now_tm->tm_sec;
now_min = now_tm->tm_min;
now_hour = now_tm->tm_hour;
now_day = now_tm->tm_mday;
now_wday = now_tm->tm_wday;
now_month = now_tm->tm_mon + 1;
now_year = now_tm->tm_year + 1900;
}
int main(void) {
screen_init();
while (doloop) {
current_getch = getch();
if (current_getch == 113) {
doloop = 0;
}
maketime();
update_display();
sleep(1);
}
screen_end();
printf("TEST ENDS\n");
return 0;
}
>Fix:
The ncurses port fixes the issue, but the released system code should probably be fixed.
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list