From: Ben Elliston <bje@redhat.com>
To: "Frank Ch. Eigler" <fche@redhat.com>
Cc: sid@sources.redhat.com
Subject: Re: [RFA] cfgroot usability improvement
Date: Tue, 22 May 2001 01:46:00 -0000 [thread overview]
Message-ID: <15114.10058.255993.290176@scooby.apac.redhat.com> (raw)
In-Reply-To: <20010521092822.B2848@redhat.com>
>>>>> "Frank" == Frank Ch Eigler <fche@redhat.com> 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 <bje@redhat.com>
* 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<string,component*> 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())
prev parent reply other threads:[~2001-05-22 1:46 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-05-20 21:12 Ben Elliston
2001-05-21 6:28 ` Frank Ch. Eigler
2001-05-22 1:46 ` Ben Elliston [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=15114.10058.255993.290176@scooby.apac.redhat.com \
--to=bje@redhat.com \
--cc=fche@redhat.com \
--cc=sid@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).