Re: [PATCH] clnt_dg_call: Change the memory allocation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On Mar 6, 2018, at 2:10 PM, Steve Dickson <SteveD@xxxxxxxxxx> wrote:
> 
> 
> 
> On 03/06/2018 01:19 PM, Chuck Lever wrote:
>> 
>> 
>>> On Mar 6, 2018, at 1:03 PM, Steve Dickson <steved@xxxxxxxxxx> wrote:
>>> 
>>> Change the memory allocation from the stack
>>> to the heap by calling calloc() verses alloca
>> 
>>> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1552163
>> 
>> IMO, this should be:
>> 
>> Fixes: 2936f109590e ("clnt_dg_call: Fix a buffer overflow (CVE-2016-4429)")
>> BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1552163
> point.
> 
>> 
>> Can the patch description explain the problem and why
>> this is the correct fix? It looks like 2936f109590e
>> added some free(3) call sites that were perhaps
>> unneeded. 
> Yeah alloca() allocates from the stack and the memory
> is automatically freed when routine returns
> (something that was pointed out to me by IRC people
> when their UDP mounts broke ;-) So this CVE is basically bogus!

> But it was also point out (by the IRC people) that 
> allocating from the heap is probably better than 
> scribbling on stack and I agree.

Yeah, I prefer to avoid alloca too.

As a generic comment, any new code needs to be careful
about bounds checking when writing into cbuf, even if
cbuf is on the heap instead of the stack. I didn't look
carefully at that, but sounds like I will get a second
shot to review ;-)


> I'll try to be more more descriptive in the description.

Cool, thanks.


> Why not just remove them, for instance?
> I assumed outlen can be variable size, but did not 
> look very hard. I'm just trying to clean up some 
> old bz so the less change I do the better... IMHO... 

>> Reviewed-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
> Thanks!
> 
> steved.
> 
>> 
>> 
>>> Signed-off-by: Steve Dickson <steved@xxxxxxxxxx>
>>> ---
>>> src/clnt_dg.c | 6 +++---
>>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>> 
>>> diff --git a/src/clnt_dg.c b/src/clnt_dg.c
>>> index 884a2db..1d55b1e 100644
>>> --- a/src/clnt_dg.c
>>> +++ b/src/clnt_dg.c
>>> @@ -430,7 +430,7 @@ get_reply:
>>> 	  struct sockaddr_in err_addr;
>>> 	  struct sockaddr_in *sin = (struct sockaddr_in *)&cu->cu_raddr;
>>> 	  struct iovec iov;
>>> -	  char *cbuf = (char *) alloca (outlen + 256);
>>> +	  char *cbuf = (char *) mem_alloc(outlen + 256);
>>> 	  int ret;
>>> 
>>> 	  if (cbuf == NULL) 
>>> @@ -462,13 +462,13 @@ get_reply:
>>> 		 cmsg = CMSG_NXTHDR (&msg, cmsg))
>>> 	      if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
>>> 		{
>>> -		  free(cbuf);
>>> +		  mem_free(cbuf, (outlen + 256));
>>> 		  e = (struct sock_extended_err *) CMSG_DATA(cmsg);
>>> 		  cu->cu_error.re_errno = e->ee_errno;
>>> 		  release_fd_lock(cu->cu_fd, mask);
>>> 		  return (cu->cu_error.re_status = RPC_CANTRECV);
>>> 		}
>>> -	  free(cbuf);
>>> +	  mem_free(cbuf, (outlen + 256));
>>> 	}
>>> #endif
>>> 
>>> -- 
>>> 2.14.3
>> 
>> --
>> Chuck Lever
>> 
>> 
>> 

--
Chuck Lever



--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux