From: Luo Yong Date: 2006-11-13T01:02:35+09:00 Subject: Re: Controlling readline On 11/12/06, Paul Lutus wrote: > Luo Yong wrote: > > > On 11/12/06, Paul Lutus wrote: > >> Luo Yong wrote: > >> > >> > Hi all > >> > > >> > Is there anyway to control the maxium length of the IO.readline can > >> > read? > >> > >> Not really, not from the command line. You can throw away all the length > >> you don't want once it has been entered. It is way better to expect more > >> characters than you get than to get more than you expect (long sad story > >> about C/C++ "gets" snipped here). > >> > >> Maybe you should describe the problem, rather than asking about this way > >> of solving it. > >> > >> -- > >> Paul Lutus > >> http://www.arachnoid.com > >> > >> > > > > I'm writing an RPC program.I use readline to read the command.I'm > > afraid that my program can be attacked by others if I can't limit the > > maxium length the readline can read.So I'm finding a way to control > > it. > > As written, "readline" won't read more than it can safely store, which is > what you are after. Your concern arose from such things as "gets", > mentioned in my last post, that wrote beyond its allocated buffer because > it didn't know its length. > > Why don't you read a character at a time, then stop reading characters after > you have what you want? Like this: > > ----------------------------------- > > #!/usr/bin/ruby -w > > max = 16 > > while true > > print "Type something:" > STDOUT.flush > > input = STDIN.sysread(max) > > puts "\nYou entered (in chunks of #{max} chars) #{input}." > > end > > ----------------------------------- > > This routine reads the input in chunks of "max" characters, and continues to > cycle through similarly sized chunks indefinitely. Linefeeds are not > special to it, although that would be easy to add. This gives you a limit > on input size, but you then have to sort out for yourself what a line is, > and where one ends and another begins. > > -- > Paul Lutus > http://www.arachnoid.com > > This may be the best way. Thanks a lot.