zfs ioctls: use fget_write / fget_read instead of getf wrapper for fget

This allows to ensure that we do not write to a file that was opened
for reading only or vice versa.

Also, use the correct capability in in zfs_ioc_send_new().

Differential Revision:	https://reviews.freebsd.org/D2382
Reviewed by:	delphij
MFC after:	17 days
Sponsored by:	ClusterHQ
This commit is contained in:
Andriy Gapon 2015-05-11 10:07:31 +00:00
parent f71b16e05e
commit defce67748

View File

@ -4196,7 +4196,11 @@ zfs_ioc_recv(zfs_cmd_t *zc)
return (error);
fd = zc->zc_cookie;
fp = getf(fd, cap_rights_init(&rights, CAP_PREAD));
#ifdef illumos
fp = getf(fd);
#else
fget_read(curthread, fd, cap_rights_init(&rights, CAP_PREAD), &fp);
#endif
if (fp == NULL) {
nvlist_free(props);
return (SET_ERROR(EBADF));
@ -4442,8 +4446,12 @@ zfs_ioc_send(zfs_cmd_t *zc)
file_t *fp;
cap_rights_t rights;
fp = getf(zc->zc_cookie,
cap_rights_init(&rights, CAP_WRITE));
#ifdef illumos
fp = getf(zc->zc_cookie);
#else
fget_write(curthread, zc->zc_cookie,
cap_rights_init(&rights, CAP_WRITE), &fp);
#endif
if (fp == NULL)
return (SET_ERROR(EBADF));
@ -5039,7 +5047,12 @@ zfs_ioc_diff(zfs_cmd_t *zc)
offset_t off;
int error;
fp = getf(zc->zc_cookie, cap_rights_init(&rights, CAP_WRITE));
#ifdef illumos
fp = getf(zc->zc_cookie);
#else
fget_write(curthread, zc->zc_cookie,
cap_rights_init(&rights, CAP_WRITE), &fp);
#endif
if (fp == NULL)
return (SET_ERROR(EBADF));
@ -5404,6 +5417,7 @@ static int
zfs_ioc_send_new(const char *snapname, nvlist_t *innvl, nvlist_t *outnvl)
{
cap_rights_t rights;
file_t *fp;
int error;
offset_t off;
char *fromname = NULL;
@ -5420,7 +5434,11 @@ zfs_ioc_send_new(const char *snapname, nvlist_t *innvl, nvlist_t *outnvl)
largeblockok = nvlist_exists(innvl, "largeblockok");
embedok = nvlist_exists(innvl, "embedok");
file_t *fp = getf(fd, cap_rights_init(&rights, CAP_READ));
#ifdef illumos
file_t *fp = getf(fd);
#else
fget_write(curthread, fd, cap_rights_init(&rights, CAP_WRITE), &fp);
#endif
if (fp == NULL)
return (SET_ERROR(EBADF));