On 04/04/2012 04:17 AM, Thomas Graf wrote: > getsockopt(..., SCTP_EVENTS, ...) performs a length check and returns > an error if the user provides less bytes than the size of struct > sctp_event_subscribe. > > Struct sctp_event_subscribe needs to be extended by an u8 for every > new event or notification type that is added. > > This obviously makes getsockopt fail for binaries that are compiled > against an older versions of <net/sctp/user.h> which do not contain > all event types. > > This patch changes getsockopt behaviour to no longer return an error > if not enough bytes are being provided by the user. Instead, it > returns as much of sctp_event_subscribe as fits into the provided buffer. > > This leads to the new behavior that users see what they have been aware > of at compile time. > > The setsockopt(..., SCTP_EVENTS, ...) API is already behaving like this. > > Signed-off-by: Thomas Graf <tgraf@xxxxxxx> Acked-by: Vlad Yasevich <vladislav.yasevich@xxxxxx> -vlad > --- > net/sctp/socket.c | 5 +++-- > 1 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/net/sctp/socket.c b/net/sctp/socket.c > index 06b42b7..92ba71d 100644 > --- a/net/sctp/socket.c > +++ b/net/sctp/socket.c > @@ -4133,9 +4133,10 @@ static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, > static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, > int __user *optlen) > { > - if (len < sizeof(struct sctp_event_subscribe)) > + if (len <= 0) > return -EINVAL; > - len = sizeof(struct sctp_event_subscribe); > + if (len > sizeof(struct sctp_event_subscribe)) > + len = sizeof(struct sctp_event_subscribe); > if (put_user(len, optlen)) > return -EFAULT; > if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) > -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html