Allow setxattr to be called with a NULL value, instead of crashing.
This commit is contained in:
parent
7dfb21477f
commit
efbefee25c
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: ops.c,v 1.80 2014/11/04 09:17:31 manu Exp $ */
|
/* $NetBSD: ops.c,v 1.81 2014/11/12 05:08:43 manu Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
|
* Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
|
||||||
@ -3460,6 +3460,7 @@ perfuse_node_setextattr(struct puffs_usermount *pu, puffs_cookie_t opc,
|
|||||||
perfuse_msg_t *pm;
|
perfuse_msg_t *pm;
|
||||||
struct fuse_setxattr_in *fsi;
|
struct fuse_setxattr_in *fsi;
|
||||||
size_t attrnamelen;
|
size_t attrnamelen;
|
||||||
|
size_t datalen;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *np;
|
char *np;
|
||||||
int error;
|
int error;
|
||||||
@ -3472,23 +3473,27 @@ perfuse_node_setextattr(struct puffs_usermount *pu, puffs_cookie_t opc,
|
|||||||
ps = puffs_getspecific(pu);
|
ps = puffs_getspecific(pu);
|
||||||
attrname = perfuse_native_ns(attrns, attrname, fuse_attrname);
|
attrname = perfuse_native_ns(attrns, attrname, fuse_attrname);
|
||||||
attrnamelen = strlen(attrname) + 1;
|
attrnamelen = strlen(attrname) + 1;
|
||||||
len = sizeof(*fsi) + attrnamelen + *resid;
|
|
||||||
|
datalen = (resid != NULL) ? *resid : 0;
|
||||||
|
len = sizeof(*fsi) + attrnamelen + datalen;
|
||||||
|
|
||||||
pm = ps->ps_new_msg(pu, opc, FUSE_SETXATTR, len, pcr);
|
pm = ps->ps_new_msg(pu, opc, FUSE_SETXATTR, len, pcr);
|
||||||
fsi = GET_INPAYLOAD(ps, pm, fuse_setxattr_in);
|
fsi = GET_INPAYLOAD(ps, pm, fuse_setxattr_in);
|
||||||
fsi->size = (unsigned int)*resid;
|
fsi->size = (unsigned int)datalen;
|
||||||
fsi->flags = 0;
|
fsi->flags = 0;
|
||||||
np = (char *)(void *)(fsi + 1);
|
np = (char *)(void *)(fsi + 1);
|
||||||
(void)strlcpy(np, attrname, attrnamelen);
|
(void)strlcpy(np, attrname, attrnamelen);
|
||||||
np += attrnamelen;
|
np += attrnamelen;
|
||||||
(void)memcpy(np, (char *)attr, *resid);
|
if (datalen)
|
||||||
|
(void)memcpy(np, (char *)attr, datalen);
|
||||||
|
|
||||||
if ((error = xchg_msg(pu, opc, pm,
|
if ((error = xchg_msg(pu, opc, pm,
|
||||||
NO_PAYLOAD_REPLY_LEN, wait_reply)) != 0)
|
NO_PAYLOAD_REPLY_LEN, wait_reply)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ps->ps_destroy_msg(pm);
|
ps->ps_destroy_msg(pm);
|
||||||
*resid = 0;
|
if (resid)
|
||||||
|
*resid = 0;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user