From c7235992dc0c2367eea9fa9f44a037a2b7b99d34 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Sat, 24 Jan 2015 19:51:39 +0000 Subject: [PATCH] printfd: quote pathnames Change printfd() behaviour in show_fd_path mode to quote pathnames the same way printpathn() does. * util.c (printfd): Print non-socket paths using print_quoted_string. * tests/scm_rights-fd.test: Test it. * tests/scm_rights.c: Update. --- tests/scm_rights-fd.test | 30 ++++++++++++++++++++++-------- tests/scm_rights.c | 26 ++++++++++++-------------- util.c | 11 ++++++----- 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/tests/scm_rights-fd.test b/tests/scm_rights-fd.test index c4d94509..1974e0d5 100755 --- a/tests/scm_rights-fd.test +++ b/tests/scm_rights-fd.test @@ -1,6 +1,6 @@ #!/bin/sh -# Check how SCM_RIGHTS control messages are decoded in -y mode. +# Check how SCM_RIGHTS and SCM_CREDENTIALS control messages are decoded in -y mode. . "${srcdir=.}/init.sh" @@ -9,21 +9,35 @@ framework_skip_ '/proc/self/fd/ is not available' check_prog grep +check_prog mkdir +check_prog rm +check_prog seq +check_prog touch -rm -f $LOG.* +rm -rf -- "$LOG".* -./scm_rights || +dir="$LOG.dir" +mkdir -- "$dir" || + framework_skip_ 'failed to create a directory' + +file="$dir/$(for i in $(seq 1 127); do echo A; done; echo Z)" + +touch -- "$file" || + framework_skip_ 'failed to create a file' + +./scm_rights /dev/zero || fail_ 'scm_rights failed' -args="-tt -ff -y -xx -enetwork -o $LOG ./scm_rights" -$STRACE $args || +args="-tt -ff -y -x -enetwork ./scm_rights /dev/zero" +$STRACE -o "$LOG" $args "$file" || fail_ "$STRACE $args failed" -"$srcdir"/../strace-log-merge $LOG > $LOG || { +"$srcdir"/../strace-log-merge "$LOG" > "$LOG" || { cat $LOG fail_ 'strace-log-merge failed' } -rm -f $LOG.* + +rm -rf -- "$LOG".* grep_log() { @@ -38,7 +52,7 @@ grep_log() n='[1-9][0-9]*' msg='\{msg_name\(0\)=NULL, msg_iov\(1\)=\[\{"\\x00\\x00\\x00\\x00[^"]*", '"$n"'\}\], msg_controllen='"$n" -rights='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, \[3, 4\]\}' +rights='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, \[3, 4, 5]*/(A\\n){127}Z>\]\}' creds='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_CREDENTIALS, \{pid='"$n"', uid=[0-9]+, gid=[0-9]+\}\}' grep_log sendmsg '\(1, '"$msg"', \['"$rights"'\], msg_flags=0\}, 0\) += '"$n" grep_log recvmsg '\(0, '"$msg"', \['"$creds"', '"$rights"'\], msg_flags=0\}, 0\) += '"$n" diff --git a/tests/scm_rights.c b/tests/scm_rights.c index fa6e8f04..0f25e017 100644 --- a/tests/scm_rights.c +++ b/tests/scm_rights.c @@ -7,17 +7,17 @@ #include #include -int main(void) +int main(int ac, const char **av) { - int fd; + int i; int data = 0; struct iovec iov = { .iov_base = &data, .iov_len = sizeof(iov) }; - while ((fd = open("/dev/null", O_RDWR)) < 3) - assert(fd >= 0); + while ((i = open("/dev/null", O_RDWR)) < 3) + assert(i >= 0); (void) close(3); int sv[2]; @@ -33,21 +33,19 @@ int main(void) assert(dup2(sv[1], 1) == 1); assert(close(sv[1]) == 0); - int fds[2]; + int fds[ac]; assert((fds[0] = open("/dev/null", O_RDWR)) == 3); - assert((fds[1] = open("/dev/zero", O_RDONLY)) == 4); + for (i = 1; i < ac; ++i) + assert((fds[i] = open(av[i], O_RDONLY)) == i + 3); union { struct cmsghdr cmsg; char buf[CMSG_LEN(sizeof(fds))]; - } control = { - .cmsg = { - .cmsg_level = SOL_SOCKET, - .cmsg_type = SCM_RIGHTS, - .cmsg_len = CMSG_LEN(sizeof(fds)) - } - }; + } control; + control.cmsg.cmsg_level = SOL_SOCKET; + control.cmsg.cmsg_type = SCM_RIGHTS; + control.cmsg.cmsg_len = CMSG_LEN(sizeof(fds)); memcpy(CMSG_DATA(&control.cmsg), fds, sizeof(fds)); struct msghdr mh = { @@ -68,7 +66,7 @@ int main(void) assert(dup2(sv[0], 0) == 0); assert(close(sv[0]) == 0); - struct cmsghdr control[4]; + struct cmsghdr control[4 + ac * sizeof(int) / sizeof(struct cmsghdr)]; struct msghdr mh = { .msg_iov = &iov, diff --git a/util.c b/util.c index 00ee5a02..ccf687ff 100644 --- a/util.c +++ b/util.c @@ -490,28 +490,29 @@ printfd(struct tcb *tcp, int fd) if (show_fd_path && getfdpath(tcp, fd, path, sizeof(path)) >= 0) { static const char socket_prefix[] = "socket:["; const size_t socket_prefix_len = sizeof(socket_prefix) - 1; - size_t path_len; + const size_t path_len = strlen(path); + tprintf("%d<", fd); if (show_fd_path > 1 && strncmp(path, socket_prefix, socket_prefix_len) == 0 && - path[(path_len = strlen(path)) - 1] == ']') { + path[path_len - 1] == ']') { unsigned long inodenr; #define PROTO_NAME_LEN 32 char proto_buf[PROTO_NAME_LEN]; const char *proto = getfdproto(tcp, fd, proto_buf, PROTO_NAME_LEN); inodenr = strtoul(path + socket_prefix_len, NULL, 10); - tprintf("%d<", fd); if (!print_sockaddr_by_inode(inodenr, proto)) { if (proto) tprintf("%s:[%lu]", proto, inodenr); else tprints(path); } - tprints(">"); } else { - tprintf("%d<%s>", fd, path); + print_quoted_string(path, path_len, + QUOTE_OMIT_LEADING_TRAILING_QUOTES); } + tprints(">"); } else tprintf("%d", fd); } -- 2.40.0