diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2013-03-20 11:36:13 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2013-04-11 10:28:57 -0400 |
commit | 00e856db49bbaf0ec315bf81a3c4fc02e4d0beea (patch) | |
tree | 85ae9930d70bb465429b36225c3df5e64117fc66 /net/nfc | |
parent | 5eef6669759f8e291ab0347894876b532c242324 (diff) |
NFC: llcp: Fall back to local values when getting socket options
If a socket option has not been set by the user, fall back to the LLCP
local ones.
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc')
-rw-r--r-- | net/nfc/llcp/sock.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/net/nfc/llcp/sock.c b/net/nfc/llcp/sock.c index 873c837e5c97..f3027c21c442 100644 --- a/net/nfc/llcp/sock.c +++ b/net/nfc/llcp/sock.c | |||
@@ -299,9 +299,12 @@ static int nfc_llcp_setsockopt(struct socket *sock, int level, int optname, | |||
299 | static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, | 299 | static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, |
300 | char __user *optval, int __user *optlen) | 300 | char __user *optval, int __user *optlen) |
301 | { | 301 | { |
302 | struct nfc_llcp_local *local; | ||
302 | struct sock *sk = sock->sk; | 303 | struct sock *sk = sock->sk; |
303 | struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk); | 304 | struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk); |
304 | int len, err = 0; | 305 | int len, err = 0; |
306 | u16 miux; | ||
307 | u8 rw; | ||
305 | 308 | ||
306 | pr_debug("%p optname %d\n", sk, optname); | 309 | pr_debug("%p optname %d\n", sk, optname); |
307 | 310 | ||
@@ -311,20 +314,27 @@ static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, | |||
311 | if (get_user(len, optlen)) | 314 | if (get_user(len, optlen)) |
312 | return -EFAULT; | 315 | return -EFAULT; |
313 | 316 | ||
317 | local = llcp_sock->local; | ||
318 | if (!local) | ||
319 | return -ENODEV; | ||
320 | |||
314 | len = min_t(u32, len, sizeof(u32)); | 321 | len = min_t(u32, len, sizeof(u32)); |
315 | 322 | ||
316 | lock_sock(sk); | 323 | lock_sock(sk); |
317 | 324 | ||
318 | switch (optname) { | 325 | switch (optname) { |
319 | case NFC_LLCP_RW: | 326 | case NFC_LLCP_RW: |
320 | if (put_user(llcp_sock->rw, (u32 __user *) optval)) | 327 | rw = llcp_sock->rw > LLCP_MAX_RW ? local->rw : llcp_sock->rw; |
328 | if (put_user(rw, (u32 __user *) optval)) | ||
321 | err = -EFAULT; | 329 | err = -EFAULT; |
322 | 330 | ||
323 | break; | 331 | break; |
324 | 332 | ||
325 | case NFC_LLCP_MIUX: | 333 | case NFC_LLCP_MIUX: |
326 | if (put_user(be16_to_cpu(llcp_sock->miux), | 334 | miux = be16_to_cpu(llcp_sock->miux) > LLCP_MAX_MIUX ? |
327 | (u32 __user *) optval)) | 335 | be16_to_cpu(local->miux) : be16_to_cpu(llcp_sock->miux); |
336 | |||
337 | if (put_user(miux, (u32 __user *) optval)) | ||
328 | err = -EFAULT; | 338 | err = -EFAULT; |
329 | 339 | ||
330 | break; | 340 | break; |