summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authormarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-10-08 17:12:36 +0000
committermarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-10-08 17:12:36 +0000
commitf0cdcf6f4e5b18f386fcee033b5cc35042bc4289 (patch)
tree2455cc2d7af8bda154f15e7bd77c30f64b5aa073 /ext
parent4b62641c130017e7d871fb3ee0d2c219844a6701 (diff)
* 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 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25267 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/curses/curses.c34
1 files changed, 34 insertions, 0 deletions
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