summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--ext/curses/curses.c34
2 files changed, 47 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 3b6c9647c3..8a1d0b322a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Fri Oct 9 02:12:02 2009 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * ext/curses/curses.c: Many functions of module Curses could cause a
+ crash if the ncurses library was not properly initialized.
+ Fix pointed out by Alexander Beisig [ruby-core:22592]
+ Functions fixed: attroff, attron, attrset, bkgd, bkgdset,
+ can_change_color, close_screen, closed, color_content, curs_set,
+ def_prog_mode, delch, deleteln, getmouse, getstr, has_colors,
+ init_color, init_pair, insertln, keyname, mouseinterval, mousemask,
+ pair_content, pair_number, reset_prog_mode, resizeterm, scrl,
+ setscrreg, standend, standout, start_color, timeout, ungetmouse,
+ use_default_colors
+
Fri Oct 9 01:07:34 2009 Yusuke Endoh <mame@tsg.ne.jp>
* compile.c (ADD_TRACE): fire coverage event in ensure clause.
diff --git a/ext/curses/curses.c b/ext/curses/curses.c
index 94da77f826..c8c63de395 100644
--- a/ext/curses/curses.c
+++ b/ext/curses/curses.c
@@ -138,6 +138,7 @@ curses_init_screen(void)
static VALUE
curses_close_screen(void)
{
+ curses_stdscr();
#ifdef HAVE_ISENDWIN
if (!isendwin())
#endif
@@ -164,6 +165,7 @@ curses_finalize(VALUE dummy)
static VALUE
curses_closed(void)
{
+ curses_stdscr();
if (isendwin()) {
return Qtrue;
}
@@ -355,6 +357,7 @@ curses_setpos(VALUE obj, VALUE y, VALUE x)
static VALUE
curses_standout(VALUE obj)
{
+ curses_stdscr();
standout();
return Qnil;
}
@@ -363,6 +366,7 @@ curses_standout(VALUE obj)
static VALUE
curses_standend(VALUE obj)
{
+ curses_stdscr();
standend();
return Qnil;
}
@@ -430,6 +434,7 @@ curses_getstr(VALUE obj)
{
char rtn[1024]; /* This should be big enough.. I hope */
+ curses_stdscr();
rb_read_check(stdin);
#if defined(HAVE_GETNSTR)
getnstr(rtn,1023);
@@ -443,6 +448,7 @@ curses_getstr(VALUE obj)
static VALUE
curses_delch(VALUE obj)
{
+ curses_stdscr();
delch();
return Qnil;
}
@@ -451,6 +457,7 @@ curses_delch(VALUE obj)
static VALUE
curses_deleteln(VALUE obj)
{
+ curses_stdscr();
#if defined(HAVE_DELETELN) || defined(deleteln)
deleteln();
#endif
@@ -461,6 +468,7 @@ curses_deleteln(VALUE obj)
static VALUE
curses_insertln(VALUE obj)
{
+ curses_stdscr();
#if defined(HAVE_INSERTLN) || defined(insertln)
insertln();
#endif
@@ -475,6 +483,7 @@ curses_keyname(VALUE obj, VALUE c)
int cc = curses_char(c);
const char *name;
+ curses_stdscr();
name = keyname(cc);
if (name) {
return rb_str_new_cstr(name);
@@ -510,6 +519,7 @@ curses_curs_set(VALUE obj, VALUE visibility)
{
#ifdef HAVE_CURS_SET
int n;
+ curses_stdscr();
return (n = curs_set(NUM2INT(visibility)) != ERR) ? INT2FIX(n) : Qnil;
#else
return Qnil;
@@ -521,6 +531,7 @@ curses_scrl(VALUE obj, VALUE n)
{
/* may have to raise exception on ERR */
#ifdef HAVE_SCRL
+ curses_stdscr();
return (scrl(NUM2INT(n)) == OK) ? Qtrue : Qfalse;
#else
return Qfalse;
@@ -532,6 +543,7 @@ curses_setscrreg(VALUE obj, VALUE top, VALUE bottom)
{
/* may have to raise exception on ERR */
#ifdef HAVE_SETSCRREG
+ curses_stdscr();
return (setscrreg(NUM2INT(top), NUM2INT(bottom)) == OK) ? Qtrue : Qfalse;
#else
return Qfalse;
@@ -541,6 +553,7 @@ curses_setscrreg(VALUE obj, VALUE top, VALUE bottom)
static VALUE
curses_attroff(VALUE obj, VALUE attrs)
{
+ curses_stdscr();
return window_attroff(rb_stdscr,attrs);
/* return INT2FIX(attroff(NUM2INT(attrs))); */
}
@@ -548,6 +561,7 @@ curses_attroff(VALUE obj, VALUE attrs)
static VALUE
curses_attron(VALUE obj, VALUE attrs)
{
+ curses_stdscr();
return window_attron(rb_stdscr,attrs);
/* return INT2FIX(attroff(NUM2INT(attrs))); */
}
@@ -555,6 +569,7 @@ curses_attron(VALUE obj, VALUE attrs)
static VALUE
curses_attrset(VALUE obj, VALUE attrs)
{
+ curses_stdscr();
return window_attrset(rb_stdscr,attrs);
/* return INT2FIX(attroff(NUM2INT(attrs))); */
}
@@ -563,6 +578,7 @@ static VALUE
curses_bkgdset(VALUE obj, VALUE ch)
{
#ifdef HAVE_BKGDSET
+ curses_stdscr();
bkgdset(NUM2CH(ch));
#endif
return Qnil;
@@ -572,6 +588,7 @@ static VALUE
curses_bkgd(VALUE obj, VALUE ch)
{
#ifdef HAVE_BKGD
+ curses_stdscr();
return (bkgd(NUM2CH(ch)) == OK) ? Qtrue : Qfalse;
#else
return Qfalse;
@@ -582,6 +599,7 @@ curses_bkgd(VALUE obj, VALUE ch)
static VALUE
curses_use_default_colors(VALUE obj)
{
+ curses_stdscr();
use_default_colors();
return Qnil;
}
@@ -635,6 +653,7 @@ static VALUE
curses_resizeterm(VALUE obj, VALUE lin, VALUE col)
{
#if defined(HAVE_RESIZETERM)
+ curses_stdscr();
return (resizeterm(NUM2INT(lin),NUM2INT(col)) == OK) ? Qtrue : Qfalse;
#else
return Qnil;
@@ -646,6 +665,7 @@ static VALUE
curses_start_color(VALUE obj)
{
/* may have to raise exception on ERR */
+ curses_stdscr();
return (start_color() == OK) ? Qtrue : Qfalse;
}
@@ -653,6 +673,7 @@ static VALUE
curses_init_pair(VALUE obj, VALUE pair, VALUE f, VALUE b)
{
/* may have to raise exception on ERR */
+ curses_stdscr();
return (init_pair(NUM2INT(pair),NUM2INT(f),NUM2INT(b)) == OK) ? Qtrue : Qfalse;
}
@@ -660,6 +681,7 @@ static VALUE
curses_init_color(VALUE obj, VALUE color, VALUE r, VALUE g, VALUE b)
{
/* may have to raise exception on ERR */
+ curses_stdscr();
return (init_color(NUM2INT(color),NUM2INT(r),
NUM2INT(g),NUM2INT(b)) == OK) ? Qtrue : Qfalse;
}
@@ -667,12 +689,14 @@ curses_init_color(VALUE obj, VALUE color, VALUE r, VALUE g, VALUE b)
static VALUE
curses_has_colors(VALUE obj)
{
+ curses_stdscr();
return has_colors() ? Qtrue : Qfalse;
}
static VALUE
curses_can_change_color(VALUE obj)
{
+ curses_stdscr();
return can_change_color() ? Qtrue : Qfalse;
}
@@ -691,6 +715,7 @@ curses_color_content(VALUE obj, VALUE color)
{
short r,g,b;
+ curses_stdscr();
color_content(NUM2INT(color),&r,&g,&b);
return rb_ary_new3(3,INT2FIX(r),INT2FIX(g),INT2FIX(b));
}
@@ -711,6 +736,7 @@ curses_pair_content(VALUE obj, VALUE pair)
{
short f,b;
+ curses_stdscr();
pair_content(NUM2INT(pair),&f,&b);
return rb_ary_new3(2,INT2FIX(f),INT2FIX(b));
}
@@ -724,6 +750,7 @@ curses_color_pair(VALUE obj, VALUE attrs)
static VALUE
curses_pair_number(VALUE obj, VALUE attrs)
{
+ curses_stdscr();
return INT2FIX(PAIR_NUMBER(NUM2INT(attrs)));
}
#endif /* USE_COLOR */
@@ -759,6 +786,7 @@ curses_getmouse(VALUE obj)
struct mousedata *mdata;
VALUE val;
+ curses_stdscr();
val = Data_Make_Struct(cMouseEvent,struct mousedata,
0,curses_mousedata_free,mdata);
mdata->mevent = (MEVENT*)xmalloc(sizeof(MEVENT));
@@ -770,6 +798,7 @@ curses_ungetmouse(VALUE obj, VALUE mevent)
{
struct mousedata *mdata;
+ curses_stdscr();
GetMOUSE(mevent,mdata);
return (ungetmouse(mdata->mevent) == OK) ? Qtrue : Qfalse;
}
@@ -777,12 +806,14 @@ curses_ungetmouse(VALUE obj, VALUE mevent)
static VALUE
curses_mouseinterval(VALUE obj, VALUE interval)
{
+ curses_stdscr();
return mouseinterval(NUM2INT(interval)) ? Qtrue : Qfalse;
}
static VALUE
curses_mousemask(VALUE obj, VALUE mask)
{
+ curses_stdscr();
return INT2NUM(mousemask(NUM2UINT(mask),NULL));
}
@@ -806,6 +837,7 @@ DEFINE_MOUSE_GET_MEMBER(curs_mouse_bstate, bstate)
static VALUE
curses_timeout(VALUE obj, VALUE delay)
{
+ curses_stdscr();
timeout(NUM2INT(delay));
return Qnil;
}
@@ -817,6 +849,7 @@ curses_timeout(VALUE obj, VALUE delay)
static VALUE
curses_def_prog_mode(VALUE obj)
{
+ curses_stdscr();
return def_prog_mode() == OK ? Qtrue : Qfalse;
}
#else
@@ -827,6 +860,7 @@ curses_def_prog_mode(VALUE obj)
static VALUE
curses_reset_prog_mode(VALUE obj)
{
+ curses_stdscr();
return reset_prog_mode() == OK ? Qtrue : Qfalse;
}
#else