Allow setxattr to be called with a NULL value, instead of crashing.

This commit is contained in:
manu 2014-11-12 05:08:43 +00:00
parent 7dfb21477f
commit efbefee25c

View File

@ -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.
@ -3460,6 +3460,7 @@ perfuse_node_setextattr(struct puffs_usermount *pu, puffs_cookie_t opc,
perfuse_msg_t *pm;
struct fuse_setxattr_in *fsi;
size_t attrnamelen;
size_t datalen;
size_t len;
char *np;
int error;
@ -3472,23 +3473,27 @@ perfuse_node_setextattr(struct puffs_usermount *pu, puffs_cookie_t opc,
ps = puffs_getspecific(pu);
attrname = perfuse_native_ns(attrns, attrname, fuse_attrname);
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);
fsi = GET_INPAYLOAD(ps, pm, fuse_setxattr_in);
fsi->size = (unsigned int)*resid;
fsi->size = (unsigned int)datalen;
fsi->flags = 0;
np = (char *)(void *)(fsi + 1);
(void)strlcpy(np, attrname, attrnamelen);
np += attrnamelen;
(void)memcpy(np, (char *)attr, *resid);
if (datalen)
(void)memcpy(np, (char *)attr, datalen);
if ((error = xchg_msg(pu, opc, pm,
NO_PAYLOAD_REPLY_LEN, wait_reply)) != 0)
goto out;
ps->ps_destroy_msg(pm);
*resid = 0;
if (resid)
*resid = 0;
error = 0;
out: