Opened 14 years ago
Last modified 13 years ago
#15018 closed
LimitedStream.readline deals parameter not correct — at Initial Version
Reported by: | xjdrew | Owned by: | nobody |
---|---|---|---|
Component: | Core (Other) | Version: | dev |
Severity: | Keywords: | blocker, regression | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I read the code at (http://code.djangoproject.com/browser/django/trunk/django/core/handlers/wsgi.py), LimitedStream.readline function maybe go wrong when the situation meet criteria below:
<1> '\n' not in self.buffer
<2> and size is not None
<3> and len(self.buffer) > len(self.buffer)
it will go to ln102, and leads the parameter of LimitedStream._read_limited is negative, and it will be bypassed to ln82.
I don't read the implementation of self.stream.read, so i'm not sure if it will cause damage.
Please tell me if I misunderstand the code, thanks.
below is the code:
98 def readline(self, size=None): 99 while '\n' not in self.buffer or \ 100 (size is not None and len(self.buffer) < size): 101 if size: 102 chunk = self._read_limited(size - len(self.buffer)) 103 else: 104 chunk = self._read_limited() 105 if not chunk: 106 break 107 self.buffer += chunk 108 sio = StringIO(self.buffer) 109 if size: 110 line = sio.readline(size) 111 else: 112 line = sio.readline() 113 self.buffer = sio.read() 114 return line
77 def _read_limited(self, size=None): 78 if size is None or size > self.remaining: 79 size = self.remaining 80 if size == 0: 81 return '' 82 result = self.stream.read(size) 83 self.remaining -= len(result) 84 return result
best regards,
Drew