Skip to content

Commit 00e856d

Browse files
author
Samuel Ortiz
committed
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>
1 parent 5eef666 commit 00e856d

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

net/nfc/llcp/sock.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,12 @@ static int nfc_llcp_setsockopt(struct socket *sock, int level, int optname,
299299
static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname,
300300
char __user *optval, int __user *optlen)
301301
{
302+
struct nfc_llcp_local *local;
302303
struct sock *sk = sock->sk;
303304
struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
304305
int len, err = 0;
306+
u16 miux;
307+
u8 rw;
305308

306309
pr_debug("%p optname %d\n", sk, optname);
307310

@@ -311,20 +314,27 @@ static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname,
311314
if (get_user(len, optlen))
312315
return -EFAULT;
313316

317+
local = llcp_sock->local;
318+
if (!local)
319+
return -ENODEV;
320+
314321
len = min_t(u32, len, sizeof(u32));
315322

316323
lock_sock(sk);
317324

318325
switch (optname) {
319326
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))
321329
err = -EFAULT;
322330

323331
break;
324332

325333
case NFC_LLCP_MIUX:
326-
if (put_user(be16_to_cpu(llcp_sock->miux),
327-
(u32 __user *) optval))
334+
miux = be16_to_cpu(llcp_sock->miux) > LLCP_MAX_MIUX ?
335+
be16_to_cpu(local->miux) : be16_to_cpu(llcp_sock->miux);
336+
337+
if (put_user(miux, (u32 __user *) optval))
328338
err = -EFAULT;
329339

330340
break;

0 commit comments

Comments
 (0)