Skip to content

Commit a7e5534

Browse files
authored
Auto merge of #278 - ferivoz:null, r=jdm
Check libc::malloc result for null pointer The malloc call can fail in out of memory conditions, depending on the kernel settings. If it does in fact return NULL, then return an Error instead of dereferencing the NULL pointer.
2 parents fbb4065 + 617acf0 commit a7e5534

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

src/platform/unix/mod.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ impl OsIpcSender {
263263
let cmsg_length = mem::size_of_val(fds);
264264
let (cmsg_buffer, cmsg_space) = if cmsg_length > 0 {
265265
let cmsg_buffer = libc::malloc(CMSG_SPACE(cmsg_length)) as *mut cmsghdr;
266+
if cmsg_buffer == ptr::null_mut() {
267+
return Err(UnixError::last())
268+
}
266269
(*cmsg_buffer).cmsg_len = CMSG_LEN(cmsg_length) as MsgControlLen;
267270
(*cmsg_buffer).cmsg_level = libc::SOL_SOCKET;
268271
(*cmsg_buffer).cmsg_type = SCM_RIGHTS;
@@ -927,7 +930,7 @@ fn recv(fd: c_int, blocking_mode: BlockingMode)
927930
iov_len: main_data_buffer.len(),
928931
},
929932
];
930-
let mut cmsg = UnixCmsg::new(&mut iovec);
933+
let mut cmsg = UnixCmsg::new(&mut iovec)?;
931934

932935
let bytes_read = cmsg.recv(fd, blocking_mode)?;
933936
main_data_buffer.set_len(bytes_read - mem::size_of_val(&total_size));
@@ -1051,13 +1054,16 @@ impl Drop for UnixCmsg {
10511054
}
10521055

10531056
impl UnixCmsg {
1054-
unsafe fn new(iovec: &mut [iovec]) -> UnixCmsg {
1057+
unsafe fn new(iovec: &mut [iovec]) -> Result<UnixCmsg, UnixError> {
10551058
let cmsg_length = CMSG_SPACE(MAX_FDS_IN_CMSG as usize * mem::size_of::<c_int>());
10561059
let cmsg_buffer = libc::malloc(cmsg_length) as *mut cmsghdr;
1057-
UnixCmsg {
1060+
if cmsg_buffer == ptr::null_mut() {
1061+
return Err(UnixError::last())
1062+
}
1063+
Ok(UnixCmsg {
10581064
cmsg_buffer: cmsg_buffer,
10591065
msghdr: new_msghdr(iovec, cmsg_buffer, cmsg_length as MsgControlLen)
1060-
}
1066+
})
10611067
}
10621068

10631069
unsafe fn recv(&mut self, fd: c_int, blocking_mode: BlockingMode)

0 commit comments

Comments
 (0)