Source-Changes-D archive

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

Re: CVS commit: src/sys/kern



Christos Zoulas <christos%netbsd.org@localhost> writes:

> Log Message:
> pass valsize for getsockopt like we do for setsockopt

Looks like that uncovered something:

Crash version 8.99.9, image version 8.99.9.
System panicked: kernel diagnostic assertion "sopt->sopt_size == len" failed: file "/usr/src/sys/kern/uipc_socket.c", line 2112
Backtrace from time of crash is available.
crash> bt
_KERNEL_OPT_NARCNET() at 0
?() at ffffe401180808c0
vpanic() at vpanic+0x149
ch_voltag_convert_in() at ch_voltag_convert_in
sockopt_set() at sockopt_set+0x80
sogetopt() at sogetopt+0x18c
sys_getsockopt() at sys_getsockopt+0xb0
syscall() at syscall+0x1d8
--- syscall (number 118) ---

Looking at that KASSERT(), it seems to me that it makes it possible for
a user to crash the system merely by calling getsockopt() with a buffer
that is of the wrong size for the requested data.  That can't be good.

Wouldn't it be better to check that sopt->sopt_size >= len, and return
an error if not?  I think you should be allowed to getsockopt() into a
buffer that's larger than the data you're fetching, but get an error if
you allocate insufficient space.  The manual page says:

   For getsockopt(), optlen is a value-result parameter, initially
   containing the size of the buffer pointed to by optval, and modified
   on return to indicate the actual size of the value returned.

-tih
-- 
Most people who graduate with CS degrees don't understand the significance
of Lisp.  Lisp is the most important idea in computer science.  --Alan Kay


Home | Main Index | Thread Index | Old Index