Opened 13 years ago

Closed 13 years ago

Last modified 13 years ago

#15018 closed (fixed)

LimitedStream.readline deals parameter not correct — at Version 1

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 (last modified by Russell Keith-Magee)

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

Change History (1)

comment:1 by Russell Keith-Magee, 13 years ago

Description: modified (diff)
Resolution: worksforme
Status: newclosed

Your point 3 doesn't make any sense, and I can't work out what it might be a typo for.

If you want to prove there is a problem here, write a formal test case. There are existing tests for LimitedStream covering a wide range of potential use cases; if you can encode your use case as a test that fails, please provide that test and reopen.

Note: See TracTickets for help on using tickets.
Back to Top