Fix: Dereference of null pointer in FOptiAttr

This commit is contained in:
Markus Gans 2016-07-24 01:08:22 +02:00
parent 4cccc6527b
commit add402c5ac
1 changed files with 69 additions and 45 deletions

View File

@ -77,16 +77,23 @@ inline bool FOptiAttr::hasColor (char_data*& attr)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::colorChange (char_data*& term, char_data*& next) inline bool FOptiAttr::colorChange (char_data*& term, char_data*& next)
{ {
return bool ( fake_reverse if ( term && next )
|| term->fg_color != next->fg_color {
|| term->bg_color != next->bg_color ); return bool ( fake_reverse
|| term->fg_color != next->fg_color
|| term->bg_color != next->bg_color );
}
return false;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FOptiAttr::resetColor (char_data*& attr) inline void FOptiAttr::resetColor (char_data*& attr)
{ {
attr->fg_color = Default; if ( attr )
attr->bg_color = Default; {
attr->fg_color = Default;
attr->bg_color = Default;
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -195,7 +202,7 @@ void FOptiAttr::change_color (char_data*& term, char_data*& next)
short fg = next->fg_color; short fg = next->fg_color;
short bg = next->bg_color; short bg = next->bg_color;
if ( monochron ) if ( monochron || ! term || ! next )
return; return;
if ( fg == Default || bg == Default ) if ( fg == Default || bg == Default )
@ -306,6 +313,9 @@ void FOptiAttr::change_color (char_data*& term, char_data*& next)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::hasAttribute (char_data*& attr) inline bool FOptiAttr::hasAttribute (char_data*& attr)
{ {
if ( ! attr )
return false;
return attr->bold == true return attr->bold == true
|| attr->dim == true || attr->dim == true
|| attr->italic == true || attr->italic == true
@ -324,19 +334,22 @@ inline bool FOptiAttr::hasAttribute (char_data*& attr)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FOptiAttr::resetAttribute (char_data*& attr) inline void FOptiAttr::resetAttribute (char_data*& attr)
{ {
attr->bold = \ if ( attr )
attr->dim = \ {
attr->italic = \ attr->bold = \
attr->underline = \ attr->dim = \
attr->blink = \ attr->italic = \
attr->reverse = \ attr->underline = \
attr->standout = \ attr->blink = \
attr->invisible = \ attr->reverse = \
attr->protect = \ attr->standout = \
attr->crossed_out = \ attr->invisible = \
attr->dbl_underline = \ attr->protect = \
attr->alt_charset = \ attr->crossed_out = \
attr->pc_charset = false; attr->dbl_underline = \
attr->alt_charset = \
attr->pc_charset = false;
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -378,6 +391,9 @@ bool FOptiAttr::caused_reset_attributes (char*& cap, uChar test)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FOptiAttr::detectSwitchOn (char_data*& term, char_data*& next) inline void FOptiAttr::detectSwitchOn (char_data*& term, char_data*& next)
{ {
if ( ! term || ! next )
return;
on.bold = ! term->bold && next->bold; on.bold = ! term->bold && next->bold;
on.dim = ! term->dim && next->dim; on.dim = ! term->dim && next->dim;
on.italic = ! term->italic && next->italic; on.italic = ! term->italic && next->italic;
@ -396,6 +412,9 @@ inline void FOptiAttr::detectSwitchOn (char_data*& term, char_data*& next)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FOptiAttr::detectSwitchOff (char_data*& term, char_data*& next) inline void FOptiAttr::detectSwitchOff (char_data*& term, char_data*& next)
{ {
if ( ! term || ! next )
return;
off.bold = term->bold && ! next->bold; off.bold = term->bold && ! next->bold;
off.dim = term->dim && ! next->dim; off.dim = term->dim && ! next->dim;
off.italic = term->italic && ! next->italic; off.italic = term->italic && ! next->italic;
@ -481,7 +500,7 @@ inline bool FOptiAttr::unsetTermBold (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermDim (char_data*& term) inline bool FOptiAttr::setTermDim (char_data*& term)
{ {
if ( append_sequence(F_enter_dim_mode.cap) ) if ( term && append_sequence(F_enter_dim_mode.cap) )
return (term->dim = true); return (term->dim = true);
else else
return false; return false;
@ -491,7 +510,7 @@ inline bool FOptiAttr::setTermDim (char_data*& term)
inline bool FOptiAttr::unsetTermDim (char_data*& term) inline bool FOptiAttr::unsetTermDim (char_data*& term)
{ {
// Back to normal intensity (turns off bold + dim) // Back to normal intensity (turns off bold + dim)
if ( append_sequence(F_exit_dim_mode.cap) ) if ( term && append_sequence(F_exit_dim_mode.cap) )
{ {
if ( F_exit_dim_mode.caused_reset ) if ( F_exit_dim_mode.caused_reset )
reset(term); reset(term);
@ -510,7 +529,7 @@ inline bool FOptiAttr::unsetTermDim (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermItalic (char_data*& term) inline bool FOptiAttr::setTermItalic (char_data*& term)
{ {
if ( append_sequence(F_enter_italics_mode.cap) ) if ( term && append_sequence(F_enter_italics_mode.cap) )
return (term->italic = true); return (term->italic = true);
else else
return false; return false;
@ -519,7 +538,7 @@ inline bool FOptiAttr::setTermItalic (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermItalic (char_data*& term) inline bool FOptiAttr::unsetTermItalic (char_data*& term)
{ {
if ( append_sequence(F_exit_italics_mode.cap) ) if ( term && append_sequence(F_exit_italics_mode.cap) )
{ {
if ( F_exit_italics_mode.caused_reset ) if ( F_exit_italics_mode.caused_reset )
reset(term); reset(term);
@ -545,7 +564,7 @@ inline bool FOptiAttr::setTermUnderline (char_data*& term)
inline bool FOptiAttr::unsetTermUnderline (char_data*& term) inline bool FOptiAttr::unsetTermUnderline (char_data*& term)
{ {
// Turns off every underlining // Turns off every underlining
if ( append_sequence(F_exit_underline_mode.cap) ) if ( term && append_sequence(F_exit_underline_mode.cap) )
{ {
if ( F_exit_underline_mode.caused_reset ) if ( F_exit_underline_mode.caused_reset )
reset(term); reset(term);
@ -564,7 +583,7 @@ inline bool FOptiAttr::unsetTermUnderline (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermBlink (char_data*& term) inline bool FOptiAttr::setTermBlink (char_data*& term)
{ {
if ( append_sequence(F_enter_blink_mode.cap) ) if ( term && append_sequence(F_enter_blink_mode.cap) )
return (term->blink = true); return (term->blink = true);
else else
return false; return false;
@ -573,7 +592,7 @@ inline bool FOptiAttr::setTermBlink (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermBlink (char_data*& term) inline bool FOptiAttr::unsetTermBlink (char_data*& term)
{ {
if ( append_sequence(F_exit_blink_mode.cap) ) if ( term && append_sequence(F_exit_blink_mode.cap) )
{ {
if ( F_exit_blink_mode.caused_reset ) if ( F_exit_blink_mode.caused_reset )
reset(term); reset(term);
@ -589,7 +608,7 @@ inline bool FOptiAttr::unsetTermBlink (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermReverse (char_data*& term) inline bool FOptiAttr::setTermReverse (char_data*& term)
{ {
if ( append_sequence(F_enter_reverse_mode.cap) ) if ( term && append_sequence(F_enter_reverse_mode.cap) )
return (term->reverse = true); return (term->reverse = true);
else else
return false; return false;
@ -598,7 +617,7 @@ inline bool FOptiAttr::setTermReverse (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermReverse (char_data*& term) inline bool FOptiAttr::unsetTermReverse (char_data*& term)
{ {
if ( append_sequence(F_exit_reverse_mode.cap) ) if ( term && append_sequence(F_exit_reverse_mode.cap) )
{ {
if ( F_exit_reverse_mode.caused_reset ) if ( F_exit_reverse_mode.caused_reset )
reset(term); reset(term);
@ -614,7 +633,7 @@ inline bool FOptiAttr::unsetTermReverse (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermStandout (char_data*& term) inline bool FOptiAttr::setTermStandout (char_data*& term)
{ {
if ( append_sequence(F_enter_standout_mode.cap) ) if ( term && append_sequence(F_enter_standout_mode.cap) )
return (term->standout = true); return (term->standout = true);
else else
return false; return false;
@ -623,7 +642,7 @@ inline bool FOptiAttr::setTermStandout (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermStandout (char_data*& term) inline bool FOptiAttr::unsetTermStandout (char_data*& term)
{ {
if ( append_sequence(F_exit_standout_mode.cap) ) if ( term && append_sequence(F_exit_standout_mode.cap) )
{ {
if ( F_exit_standout_mode.caused_reset ) if ( F_exit_standout_mode.caused_reset )
reset(term); reset(term);
@ -639,7 +658,7 @@ inline bool FOptiAttr::unsetTermStandout (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermInvisible (char_data*& term) inline bool FOptiAttr::setTermInvisible (char_data*& term)
{ {
if ( append_sequence(F_enter_secure_mode.cap) ) if ( term && append_sequence(F_enter_secure_mode.cap) )
return (term->invisible = true); return (term->invisible = true);
else else
return false; return false;
@ -648,7 +667,7 @@ inline bool FOptiAttr::setTermInvisible (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermInvisible (char_data*& term) inline bool FOptiAttr::unsetTermInvisible (char_data*& term)
{ {
if ( append_sequence(F_exit_secure_mode.cap) ) if ( term && append_sequence(F_exit_secure_mode.cap) )
{ {
if ( F_exit_secure_mode.caused_reset ) if ( F_exit_secure_mode.caused_reset )
reset(term); reset(term);
@ -664,7 +683,7 @@ inline bool FOptiAttr::unsetTermInvisible (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermProtected (char_data*& term) inline bool FOptiAttr::setTermProtected (char_data*& term)
{ {
if ( append_sequence(F_enter_protected_mode.cap) ) if ( term && append_sequence(F_enter_protected_mode.cap) )
return (term->protect = true); return (term->protect = true);
else else
return false; return false;
@ -673,7 +692,7 @@ inline bool FOptiAttr::setTermProtected (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermProtected (char_data*& term) inline bool FOptiAttr::unsetTermProtected (char_data*& term)
{ {
if ( append_sequence(F_exit_protected_mode.cap) ) if ( term && append_sequence(F_exit_protected_mode.cap) )
{ {
if ( F_exit_protected_mode.caused_reset ) if ( F_exit_protected_mode.caused_reset )
reset(term); reset(term);
@ -689,7 +708,7 @@ inline bool FOptiAttr::unsetTermProtected (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermCrossedOut (char_data*& term) inline bool FOptiAttr::setTermCrossedOut (char_data*& term)
{ {
if ( append_sequence(F_enter_crossed_out_mode.cap) ) if ( term && append_sequence(F_enter_crossed_out_mode.cap) )
return (term->crossed_out = true); return (term->crossed_out = true);
else else
return false; return false;
@ -698,7 +717,7 @@ inline bool FOptiAttr::setTermCrossedOut (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermCrossedOut (char_data*& term) inline bool FOptiAttr::unsetTermCrossedOut (char_data*& term)
{ {
if ( append_sequence(F_exit_crossed_out_mode.cap) ) if ( term && append_sequence(F_exit_crossed_out_mode.cap) )
{ {
if ( F_exit_crossed_out_mode.caused_reset ) if ( F_exit_crossed_out_mode.caused_reset )
reset(term); reset(term);
@ -714,7 +733,7 @@ inline bool FOptiAttr::unsetTermCrossedOut (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermDoubleUnderline (char_data*& term) inline bool FOptiAttr::setTermDoubleUnderline (char_data*& term)
{ {
if ( append_sequence(F_enter_dbl_underline_mode.cap) ) if ( term && append_sequence(F_enter_dbl_underline_mode.cap) )
return (term->dbl_underline = true); return (term->dbl_underline = true);
else else
return false; return false;
@ -724,7 +743,7 @@ inline bool FOptiAttr::setTermDoubleUnderline (char_data*& term)
inline bool FOptiAttr::unsetTermDoubleUnderline (char_data*& term) inline bool FOptiAttr::unsetTermDoubleUnderline (char_data*& term)
{ {
// Turns off every underlining // Turns off every underlining
if ( append_sequence(F_exit_dbl_underline_mode.cap) ) if ( term && append_sequence(F_exit_dbl_underline_mode.cap) )
{ {
if ( F_exit_dbl_underline_mode.caused_reset ) if ( F_exit_dbl_underline_mode.caused_reset )
reset(term); reset(term);
@ -746,7 +765,7 @@ bool FOptiAttr::setTermAttributes ( char_data*& term
, bool p4, bool p5, bool p6 , bool p4, bool p5, bool p6
, bool p7, bool p8, bool p9 ) , bool p7, bool p8, bool p9 )
{ {
if ( F_set_attributes.cap ) if ( term && F_set_attributes.cap )
{ {
char* sgr = tparm ( F_set_attributes.cap char* sgr = tparm ( F_set_attributes.cap
, p1, p2, p3, p4, p5, p6, p7, p8, p9 ); , p1, p2, p3, p4, p5, p6, p7, p8, p9 );
@ -777,7 +796,7 @@ bool FOptiAttr::setTermAttributes ( char_data*& term
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermAttributes (char_data*& term) inline bool FOptiAttr::unsetTermAttributes (char_data*& term)
{ {
if ( replace_sequence(F_exit_attribute_mode.cap) ) if ( term && replace_sequence(F_exit_attribute_mode.cap) )
{ {
reset(term); reset(term);
return true; return true;
@ -789,7 +808,7 @@ inline bool FOptiAttr::unsetTermAttributes (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermAltCharset (char_data*& term) inline bool FOptiAttr::setTermAltCharset (char_data*& term)
{ {
if ( append_sequence(F_enter_alt_charset_mode.cap) ) if ( term && append_sequence(F_enter_alt_charset_mode.cap) )
{ {
term->alt_charset = true; term->alt_charset = true;
return true; return true;
@ -801,7 +820,7 @@ inline bool FOptiAttr::setTermAltCharset (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermAltCharset (char_data*& term) inline bool FOptiAttr::unsetTermAltCharset (char_data*& term)
{ {
if ( append_sequence(F_exit_alt_charset_mode.cap) ) if ( term && append_sequence(F_exit_alt_charset_mode.cap) )
{ {
term->alt_charset = false; term->alt_charset = false;
return true; return true;
@ -813,7 +832,7 @@ inline bool FOptiAttr::unsetTermAltCharset (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::setTermPCcharset (char_data*& term) inline bool FOptiAttr::setTermPCcharset (char_data*& term)
{ {
if ( append_sequence(F_enter_pc_charset_mode.cap) ) if ( term && append_sequence(F_enter_pc_charset_mode.cap) )
{ {
term->pc_charset = true; term->pc_charset = true;
return true; return true;
@ -825,7 +844,7 @@ inline bool FOptiAttr::setTermPCcharset (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FOptiAttr::unsetTermPCcharset (char_data*& term) inline bool FOptiAttr::unsetTermPCcharset (char_data*& term)
{ {
if ( append_sequence(F_exit_pc_charset_mode.cap) ) if ( term && append_sequence(F_exit_pc_charset_mode.cap) )
{ {
term->pc_charset = false; term->pc_charset = false;
return true; return true;
@ -837,6 +856,9 @@ inline bool FOptiAttr::unsetTermPCcharset (char_data*& term)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FOptiAttr::setTermDefaultColor (char_data*& term) bool FOptiAttr::setTermDefaultColor (char_data*& term)
{ {
if ( ! term )
return false;
if ( append_sequence(F_orig_pair.cap) ) if ( append_sequence(F_orig_pair.cap) )
{ {
term->fg_color = Default; term->fg_color = Default;
@ -1298,8 +1320,10 @@ char* FOptiAttr::change_attribute (char_data*& term, char_data*& next)
fake_reverse = false; fake_reverse = false;
attr_buf[0] = '\0'; attr_buf[0] = '\0';
prevent_no_color_video_attributes (next); if ( ! term || ! next )
return attr_buf;
prevent_no_color_video_attributes (next);
detectSwitchOn (term, next); detectSwitchOn (term, next);
detectSwitchOff (term, next); detectSwitchOff (term, next);