On Sat, Oct 27, 2007 at 11:01:12AM +0200, Ahmed S. Darwish wrote: > The problem here (As discussed in private mails) is that the for loop > assumes that the beginning of given user-space buffer is the beginning > of a rule. This leads to situations where the rule becomes "ecret 20", > or "cret 20" instead of "Secret 20". Big input buffers/files leads > smack to recieve a rule like "Secret 20" in fragmented chunks like: > > write("<lots of rules before ours>\nSec", ..) > write("r", 1, ..) > write("et 20\n<remaing rules after ours>", ..) > > Parsing a rule in such tough conditions in _kernel space_ is very > hard. I began to feel that it will be much easier if we do the parsing > in a userspace utility and let smack accept only small buffers (80 char).
For crying out louf, all it takes is a finite state machine... BTW, folks, your parser *and* input language suck. Really. Silently allowing noise is Dumb(tm). Please, write the grammar down and _follow_ _it_. AFAICS, trimming the crap ("we have a number, skip everything until '/', whatever noise we have there doesn't matter") leads to something like text: (whitespace line? \n)* whitespace: [ \t]* line: label whitespace number whitespace (/ whitespace set whitespace)? set: number (whitespace , whitespace number)* label: [!-.0-~]{1,23} number: [0-9]+ and even that might be too liberal. For fsck sake, all you need is to keep a struct that would contain * state * (partial) number * list of smack_known, with the first element being the partial one. * number of characters already seen in label (label itself stored in the list head ->smk_known) and that's it - just have a switch by ->state to handle the next character. Allocate that struct in ->open(), modify in ->write(), apply the entire thing at once in ->release(). Come on, people, this is ridiculous - why bother reinventing the wheels for the stuff that belongs to exercises halfway through any self-respecting introductory textbook? Scary parser, my arse... - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/