diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-01-30 15:11:54 +0100 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-01-30 15:11:54 +0100 |
commit | 54f64b811c5d21826211e3f43f5711b11412a87b (patch) | |
tree | 68ff363047be5cfb583570759d3cbe73acdcbdcc /overlapped.c | |
parent | 301221b3fe2bd407cd0dca2a0f497cdb73db63a1 (diff) | |
download | trollius-54f64b811c5d21826211e3f43f5711b11412a87b.tar.gz |
overlapped.c: Fix usage of the union
* read_buffer can only be used for TYPE_READ and TYPE_ACCEPT types
* write_buffer can only be used for TYPE_WRITE type
Diffstat (limited to 'overlapped.c')
-rw-r--r-- | overlapped.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/overlapped.c b/overlapped.c index 625c76e..6842efb 100644 --- a/overlapped.c +++ b/overlapped.c @@ -45,9 +45,9 @@ typedef struct { /* Type of operation */ DWORD type; union { - /* Buffer used for reading (optional) */ + /* Buffer used for reading: TYPE_READ and TYPE_ACCEPT */ PyObject *read_buffer; - /* Buffer used for writing (optional) */ + /* Buffer used for writing: TYPE_WRITE */ Py_buffer write_buffer; }; } OverlappedObject; @@ -568,13 +568,15 @@ Overlapped_dealloc(OverlappedObject *self) if (self->overlapped.hEvent != NULL) CloseHandle(self->overlapped.hEvent); - if (self->write_buffer.obj) - PyBuffer_Release(&self->write_buffer); - switch (self->type) { - case TYPE_READ: - case TYPE_ACCEPT: - Py_CLEAR(self->read_buffer); + case TYPE_READ: + case TYPE_ACCEPT: + Py_CLEAR(self->read_buffer); + break; + case TYPE_WRITE: + if (self->write_buffer.obj) + PyBuffer_Release(&self->write_buffer); + break; } PyObject_Del(self); SetLastError(olderr); @@ -648,7 +650,7 @@ Overlapped_getresult(OverlappedObject *self, PyObject *args) case ERROR_MORE_DATA: break; case ERROR_BROKEN_PIPE: - if (self->read_buffer != NULL) + if ((self->type == TYPE_READ || self->type == TYPE_ACCEPT) && self->read_buffer != NULL) break; /* fall through */ default: |