diff options
Diffstat (limited to 'fs/nfsd/nfsctl.c')
-rw-r--r-- | fs/nfsd/nfsctl.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 6d0847562d87..7e906c5b7671 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/nfsd/xdr.h> | 37 | #include <linux/nfsd/xdr.h> |
38 | #include <linux/nfsd/syscall.h> | 38 | #include <linux/nfsd/syscall.h> |
39 | #include <linux/lockd/lockd.h> | 39 | #include <linux/lockd/lockd.h> |
40 | #include <linux/sunrpc/clnt.h> | ||
40 | 41 | ||
41 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> |
42 | #include <net/ipv6.h> | 43 | #include <net/ipv6.h> |
@@ -490,22 +491,18 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size) | |||
490 | * | 491 | * |
491 | * Input: | 492 | * Input: |
492 | * buf: '\n'-terminated C string containing a | 493 | * buf: '\n'-terminated C string containing a |
493 | * presentation format IPv4 address | 494 | * presentation format IP address |
494 | * size: length of C string in @buf | 495 | * size: length of C string in @buf |
495 | * Output: | 496 | * Output: |
496 | * On success: returns zero if all specified locks were released; | 497 | * On success: returns zero if all specified locks were released; |
497 | * returns one if one or more locks were not released | 498 | * returns one if one or more locks were not released |
498 | * On error: return code is negative errno value | 499 | * On error: return code is negative errno value |
499 | * | ||
500 | * Note: Only AF_INET client addresses are passed in | ||
501 | */ | 500 | */ |
502 | static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size) | 501 | static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size) |
503 | { | 502 | { |
504 | struct sockaddr_in sin = { | 503 | struct sockaddr_storage address; |
505 | .sin_family = AF_INET, | 504 | struct sockaddr *sap = (struct sockaddr *)&address; |
506 | }; | 505 | size_t salen = sizeof(address); |
507 | int b1, b2, b3, b4; | ||
508 | char c; | ||
509 | char *fo_path; | 506 | char *fo_path; |
510 | 507 | ||
511 | /* sanity check */ | 508 | /* sanity check */ |
@@ -519,14 +516,10 @@ static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size) | |||
519 | if (qword_get(&buf, fo_path, size) < 0) | 516 | if (qword_get(&buf, fo_path, size) < 0) |
520 | return -EINVAL; | 517 | return -EINVAL; |
521 | 518 | ||
522 | /* get ipv4 address */ | 519 | if (rpc_pton(fo_path, size, sap, salen) == 0) |
523 | if (sscanf(fo_path, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) != 4) | ||
524 | return -EINVAL; | ||
525 | if (b1 > 255 || b2 > 255 || b3 > 255 || b4 > 255) | ||
526 | return -EINVAL; | 520 | return -EINVAL; |
527 | sin.sin_addr.s_addr = htonl((b1 << 24) | (b2 << 16) | (b3 << 8) | b4); | ||
528 | 521 | ||
529 | return nlmsvc_unlock_all_by_ip((struct sockaddr *)&sin); | 522 | return nlmsvc_unlock_all_by_ip(sap); |
530 | } | 523 | } |
531 | 524 | ||
532 | /** | 525 | /** |