From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Elliston To: "Frank Ch. Eigler" Cc: sid@sources.redhat.com Subject: Re: [RFA] cfgroot usability improvement Date: Tue, 22 May 2001 01:46:00 -0000 Message-id: <15114.10058.255993.290176@scooby.apac.redhat.com> References: <15112.38243.488724.630625@scooby.apac.redhat.com> <20010521092822.B2848@redhat.com> X-SW-Source: 2001-q2/msg00018.html >>>>> "Frank" == Frank Ch Eigler writes: Frank> Good idea, except: [...] Frank> cfgroot can't take it upon itself to *exit* the process. Frank> Think of another way to abort the parsing process. Ah yes, of course. How about this, then? Tested, no regressions. Ben 2001-05-22 Ben Elliston * compConfig.cxx (cfgroot_component::num_invalid_chars): New. (cfgroot_component::configure): Initialise it. (cfgroot_component::max_invalid_chars): New enumerator. (cfgroot_component::emit_invalid_char_error): New method. (cfgroot_component::consume_token): Factor out common error handling code into cfgroot_component::emit_invalid_char_error. (cfgroot_component::parse): Stop parsing if too many invalid character codes are encountered and emit an error message. Index: compConfig.cxx =================================================================== RCS file: /cvs/cvsfiles/devo/sid/component/cfgroot/compConfig.cxx,v retrieving revision 1.78 diff -u -c -r1.78 compConfig.cxx *** compConfig.cxx 2001/05/22 03:55:41 1.78 --- compConfig.cxx 2001/05/22 08:45:04 *************** *** 1,7 **** // compConfig.cxx - The cfgroot component: configuration parsing, root // of component creation and management. -*- C++ -*- ! // Copyright (C) 1999-2001 Red Hat. // This file is part of SID and is licensed under the GPL. // See the file COPYING.SID for conditions for redistribution. --- 1,7 ---- // compConfig.cxx - The cfgroot component: configuration parsing, root // of component creation and management. -*- C++ -*- ! // Copyright (C) 1999, 2000, 2001 Red Hat. // This file is part of SID and is licensed under the GPL. // See the file COPYING.SID for conditions for redistribution. *************** *** 107,112 **** --- 107,113 ---- unsigned line_num; bool parse(istream&); string current_token; + int num_invalid_chars; void consume_token(istream&); string next_token(istream&); bool parse_command(istream&); *************** *** 153,162 **** --- 154,169 ---- bool autoprint_p; bool persistent_p; + // max number of invalid chars which may be in a config file + enum { max_invalid_chars = 12 }; + // a general purpose method for emitting error messages // FIXME: i18n void emit_error(const string& msg); + // emit an error for invalid character codes found in the input + void emit_invalid_char_error (const char ch); + // track component name -> component object pointer typedef map component_map_t; component_map_t component_map; *************** *** 185,190 **** --- 192,207 ---- } void + cfgroot_component::emit_invalid_char_error (const char ch) + { + if (++num_invalid_chars < max_invalid_chars) + emit_error(string("invalid character [") + + make_numeric_attribute(host_int_2((unsigned char) ch), + ios::hex|ios::showbase) + + string("] ignored.")); + } + + void cfgroot_component::consume_token(istream& input) // lexer { string buf; *************** *** 254,265 **** do { if (!isprint(ch)) ! { ! emit_error(string("invalid character [") + ! make_numeric_attribute(host_int_2((unsigned char) ch), ! ios::hex|ios::showbase) + ! string("] ignored.")); ! } else buf += ch; --- 271,277 ---- do { if (!isprint(ch)) ! emit_invalid_char_error (ch); else buf += ch; *************** *** 272,282 **** break; // end of token } else // control code ! { ! emit_error(string("invalid character [") + ! make_numeric_attribute(host_int_2((unsigned char) ch), ! ios::hex|ios::showbase) + ! string("] ignored.")); continue; } } --- 284,291 ---- break; // end of token } else // control code ! { ! emit_invalid_char_error (ch); continue; } } *************** *** 461,466 **** --- 470,482 ---- { bool this_ok = this->parse_command(cfile); cumulative_ok = cumulative_ok && this_ok; + + if (num_invalid_chars >= max_invalid_chars) + { + emit_error ("too many invalid characters--possibly a binary file?"); + cumulative_ok = false; + break; + } } return cumulative_ok; } *************** *** 483,488 **** --- 499,505 ---- this->config_file_history += this->config_file; unsigned last_line_num = this->line_num; this->line_num = 1; + num_invalid_chars = 0; ifstream cfile(find_sid_data_file(this->config_file).c_str()); if(! cfile.good())