Skip to content

Commit

Permalink
Merge pull request #1 from brson/rustup
Browse files Browse the repository at this point in the history
Several fixes
  • Loading branch information
sfackler committed May 10, 2016
2 parents 47720ee + 1d25903 commit d16f794
Showing 1 changed file with 36 additions and 24 deletions.
60 changes: 36 additions & 24 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -597,36 +597,42 @@ impl<S: Read + Write> Read for SslStream<S>
{
fn read(&mut self, dst: &mut [u8]) -> std::io::Result<usize>
{
let mut dst_vec: Vec<u8> = Vec::new();
let mut data_left = dst.len();

let mut buffers = [
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() }
];
let mut message = SecBufferDesc { ulVersion: SECBUFFER_VERSION, cBuffers: 4, pBuffers: &mut buffers[0] as *mut SecBuffer};

// If we have some data in the buffer already, fetch as much as we might need
// If we have some data in the buffer already just return it.
if self.read_buf.len() > 0 {
let mut dst_vec: Vec<u8> = Vec::new();
let iterator_len;
let available_len;
{
available_len = self.read_buf.len();
let iterator = self.read_buf.iter().take(dst.len());
iterator_len = iterator.len();
dst_vec.extend(iterator);
data_left -= iterator_len;
}
// Make sure we do not read the same data multiple times
if iterator_len < available_len {
self.read_buf = self.read_buf[iterator_len..].to_vec();
} else {
self.read_buf.clear();
}

for (d, s) in dst.iter_mut().zip(dst_vec.iter()) {
*d = *s;
}
return Ok(dst_vec.len());
}

let mut dst_vec: Vec<u8> = Vec::new();
let mut data_left = dst.len();

let mut buffers = [
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() }
];
let mut message = SecBufferDesc { ulVersion: SECBUFFER_VERSION, cBuffers: 5, pBuffers: &mut buffers[0] as *mut SecBuffer};

//TODO: maybe handle that as separate reads/more efficiently?

let mut status;
Expand All @@ -646,17 +652,17 @@ impl<S: Read + Write> Read for SslStream<S>
buf.extend(&self.read_buf_raw[..]); //is a .clone() necessary here?
debug!("[EXTRA] read {}", self.read_buf_raw.len());
self.read_buf_raw.clear();
}

let mut i_read_buf = vec![0 as u8; 8192];
let bytes = self.stream.read(&mut i_read_buf).unwrap(); //Error Handling TODO
if bytes > 0 {
buf.extend(&i_read_buf[..bytes]);
}
} else {
let mut i_read_buf = vec![0 as u8; 8192];
let bytes = self.stream.read(&mut i_read_buf).unwrap(); //Error Handling TODO
if bytes > 0 {
buf.extend(&i_read_buf[..bytes]);
}

if bytes + buf.len() == 0 {
//TODO: store unused buf data on break (read_buf_raw)
break;
if bytes + buf.len() == 0 {
//TODO: store unused buf data on break (read_buf_raw)
break;
}
}

buffers[0].pvBuffer = buf.as_mut_ptr() as *mut c_void;
Expand All @@ -666,13 +672,17 @@ impl<S: Read + Write> Read for SslStream<S>
buffers[1].BufferType = SECBUFFER_EMPTY;
buffers[2].BufferType = SECBUFFER_EMPTY;
buffers[3].BufferType = SECBUFFER_EMPTY;
buffers[4].BufferType = SECBUFFER_EMPTY;
unsafe {
status = DecryptMessage(ctxt as *mut SecHandle, &mut message as *mut SecBufferDesc, 0, ptr::null_mut());
debug!("decrypt status: {} -> {}", buf.len(), status);

// Store extra data (not decrypted yet = raw), if available
if status == SEC_E_INCOMPLETE_MESSAGE {
continue;
} else if status != SEC_E_OK {
return Err(IoError::new(std::io::ErrorKind::Other,
format!("DecryptMessage failed with status {}", status)));
}
buf.clear();

Expand Down Expand Up @@ -738,9 +748,10 @@ impl<S: Read + Write> Write for SslStream<S>
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() },
SecBuffer { BufferType: SECBUFFER_EMPTY, cbBuffer: 0, pvBuffer: ptr::null_mut() }
];
let mut message = SecBufferDesc { ulVersion: SECBUFFER_VERSION, cBuffers: 4, pBuffers: &mut buffers[0] as *mut SecBuffer };
let mut message = SecBufferDesc { ulVersion: SECBUFFER_VERSION, cBuffers: 5, pBuffers: &mut buffers[0] as *mut SecBuffer };

if self.stream_sizes.cbHeader == 0 {
return Err(IoError::new(std::io::ErrorKind::Other, "SSLStream doesn't seem initialized. Maybe you forgot to call .init?"));
Expand All @@ -766,6 +777,7 @@ impl<S: Read + Write> Write for SslStream<S>
buffers[2].BufferType = SECBUFFER_STREAM_TRAILER;

buffers[3].BufferType = SECBUFFER_EMPTY;
buffers[4].BufferType = SECBUFFER_EMPTY;

let ctxt = get_mut_handle!(self, ctxt);

Expand Down

0 comments on commit d16f794

Please sign in to comment.