X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=xattr.c;h=e7f550bfff1766ae93453ebf13b4499c98b16114;hb=3fb78d7305cd5b38bbed2d91b328c3181207b4e9;hp=fd34fc58cf56dccbe083f3a063b560a44c11455e;hpb=7a9ec1273cc66005f74b89ae13516db4d7f0a8dd;p=strace diff --git a/xattr.c b/xattr.c index fd34fc58..e7f550bf 100644 --- a/xattr.c +++ b/xattr.c @@ -1,3 +1,32 @@ +/* + * Copyright (c) 2002-2005 Roland McGrath + * Copyright (c) 2004 Ulrich Drepper + * Copyright (c) 2005-2016 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #include "defs.h" #ifdef HAVE_SYS_XATTR_H @@ -6,75 +35,45 @@ #include "xlat/xattrflags.h" +#ifndef XATTR_SIZE_MAX +# define XATTR_SIZE_MAX 65536 +#endif + static void -print_xattr_val(struct tcb *tcp, int failed, - unsigned long arg, - unsigned long insize, - unsigned long size) +print_xattr_val(struct tcb *const tcp, + const kernel_ulong_t addr, + const kernel_ulong_t insize, + const kernel_ulong_t size) { - char *buf; - unsigned int len; - - if (insize == 0) - goto failed; - - len = size; - if (size != (unsigned long) len) - goto failed; - - if (!len) { - tprintf(", \"\", %ld", insize); - return; - } - - buf = malloc(len); - if (!buf) - goto failed; - - if (umoven(tcp, arg, len, buf) < 0) { - free(buf); - goto failed; - } - - /* Don't print terminating NUL if there is one. */ - if (buf[len - 1] == '\0') - --len; - tprints(", "); - print_quoted_string(buf, len, 0); - tprintf(", %ld", insize); - - free(buf); - return; -failed: - tprintf(", 0x%lx, %ld", arg, insize); + if (size > XATTR_SIZE_MAX) + printaddr(addr); + else + printstr_ex(tcp, addr, size, QUOTE_OMIT_TRAILING_0); + tprintf(", %" PRI_klu, insize); } SYS_FUNC(setxattr) { - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); - tprints(", "); - printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); - } - return 0; + printpath(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1]); + print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); + tprints(", "); + printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); + return RVAL_DECODED; } SYS_FUNC(fsetxattr) { - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - print_xattr_val(tcp, 0, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); - tprints(", "); - printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); - } - return 0; + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1]); + print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[3]); + tprints(", "); + printflags(xattrflags, tcp->u_arg[4], "XATTR_???"); + return RVAL_DECODED; } SYS_FUNC(getxattr) @@ -82,10 +81,9 @@ SYS_FUNC(getxattr) if (entering(tcp)) { printpath(tcp, tcp->u_arg[0]); tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); + printstr(tcp, tcp->u_arg[1]); } else { - print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], - tcp->u_rval); + print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval); } return 0; } @@ -95,26 +93,23 @@ SYS_FUNC(fgetxattr) if (entering(tcp)) { printfd(tcp, tcp->u_arg[0]); tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); + printstr(tcp, tcp->u_arg[1]); } else { - print_xattr_val(tcp, syserror(tcp), tcp->u_arg[2], tcp->u_arg[3], - tcp->u_rval); + print_xattr_val(tcp, tcp->u_arg[2], tcp->u_arg[3], tcp->u_rval); } return 0; } static void -print_xattr_list(struct tcb *tcp, unsigned long addr, unsigned long size) +print_xattr_list(struct tcb *const tcp, const kernel_ulong_t addr, + const kernel_ulong_t size) { - if (syserror(tcp)) { - tprintf("%#lx", addr); + if (!size || syserror(tcp)) { + printaddr(addr); } else { - unsigned long len = - (size < (unsigned long) tcp->u_rval) ? - size : (unsigned long) tcp->u_rval; - printstr(tcp, addr, len); + printstrn(tcp, addr, tcp->u_rval); } - tprintf(", %lu", size); + tprintf(", %" PRI_klu, size); } SYS_FUNC(listxattr) @@ -141,20 +136,16 @@ SYS_FUNC(flistxattr) SYS_FUNC(removexattr) { - if (entering(tcp)) { - printpath(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - } - return 0; + printpath(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1]); + return RVAL_DECODED; } SYS_FUNC(fremovexattr) { - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printstr(tcp, tcp->u_arg[1], -1); - } - return 0; + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printstr(tcp, tcp->u_arg[1]); + return RVAL_DECODED; }