From: Masatake YAMATO Date: Mon, 13 Feb 2023 19:03:27 +0000 (+0900) Subject: lsfd: read the UNIX socket path including white spaces correctly X-Git-Tag: v2.39-rc1~75^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=eeaf7677e1471df737aa39779675c48ec55a276c;p=thirdparty%2Futil-linux.git lsfd: read the UNIX socket path including white spaces correctly The original code uses '%s' scanf specifier to read lines in /proc/net/unix. If white space is included in a path, lsfd could read only the first word of the path. This commit fixes this bug. Specifying the maximum length of path is suggested by Karel Zak . Signed-off-by: Masatake YAMATO --- diff --git a/misc-utils/lsfd-sock-xinfo.c b/misc-utils/lsfd-sock-xinfo.c index 749a411026..2316fc90ec 100644 --- a/misc-utils/lsfd-sock-xinfo.c +++ b/misc-utils/lsfd-sock-xinfo.c @@ -347,7 +347,12 @@ static const struct sock_xinfo_class unix_xinfo_class = { .free = NULL, }; -/* #define UNIX_LINE_LEN 54 + 21 + UNIX_LINE_LEN + 1 */ +/* #define UNIX_LINE_LEN 54 + 21 + UNIX_LINE_LEN + 1 + * + * An actual number must be used in this definition + * since UNIX_LINE_LEN is specified as an argument for + * stringify_value(). + */ #define UNIX_LINE_LEN 256 static void load_xinfo_from_proc_unix(ino_t netns_inode) { @@ -370,10 +375,11 @@ static void load_xinfo_from_proc_unix(ino_t netns_inode) unsigned int st; unsigned long inode; struct unix_xinfo *ux; - char path[UNIX_LINE_LEN] = { 0 }; + char path[UNIX_LINE_LEN + 1] = { 0 }; - if (sscanf(line, "%*x: %*x %*x %" SCNx64 " %x %x %lu %s", + if (sscanf(line, "%*x: %*x %*x %" SCNx64 " %x %x %lu %" + stringify_value(UNIX_LINE_LEN) "[^\n]", &flags, &type, &st, &inode, path) < 4) continue; diff --git a/tests/expected/lsfd/mkfds-unix-stream b/tests/expected/lsfd/mkfds-unix-stream index 281467a871..c2e64a780d 100644 --- a/tests/expected/lsfd/mkfds-unix-stream +++ b/tests/expected/lsfd/mkfds-unix-stream @@ -10,6 +10,10 @@ ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0 4 SOCK state=connected connected stream 0 5 SOCK state=connected path=test_mkfds-unix-stream-shutdown connected stream 0 test_mkfds-unix-stream-shutdown (shutdown) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0 + 3 SOCK state=listen path=test_mkfds-unix with spaces stream listen stream 1 test_mkfds-unix with spaces stream + 4 SOCK state=connected connected stream 0 + 5 SOCK state=connected path=test_mkfds-unix with spaces stream connected stream 0 test_mkfds-unix with spaces stream +ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0 3 SOCK state=listen path=test_mkfds-unix-seqpacket type=seqpacket listen seqpacket 1 test_mkfds-unix-seqpacket 4 SOCK state=connected type=seqpacket connected seqpacket 0 5 SOCK state=connected path=test_mkfds-unix-seqpacket type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket @@ -22,3 +26,7 @@ ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0 4 SOCK state=connected type=seqpacket connected seqpacket 0 5 SOCK state=connected path=test_mkfds-unix-seqpacket-shutdown type=seqpacket connected seqpacket 0 test_mkfds-unix-seqpacket-shutdown (shutdown) ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0 + 3 SOCK state=listen path=test_mkfds-unix with spaces seqpacket type=seqpacket listen seqpacket 1 test_mkfds-unix with spaces seqpacket + 4 SOCK state=connected type=seqpacket connected seqpacket 0 + 5 SOCK state=connected path=test_mkfds-unix with spaces seqpacket type=seqpacket connected seqpacket 0 test_mkfds-unix with spaces seqpacket +ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH: 0 diff --git a/tests/ts/lsfd/mkfds-unix-stream b/tests/ts/lsfd/mkfds-unix-stream index 3d7b318904..0bc69aeac6 100755 --- a/tests/ts/lsfd/mkfds-unix-stream +++ b/tests/ts/lsfd/mkfds-unix-stream @@ -76,6 +76,20 @@ EXPR='(((TYPE == "UNIX-STREAM") or (TYPE == "UNIX")) and (FD >= 3) and (FD <= 5) kill -CONT "${PID}" wait "${MKFDS_PID}" fi + + coproc MKFDS { "$TS_HELPER_MKFDS" unix-stream $FDS $FDC $FDA \ + path="test_mkfds-unix with spaces ${t}" \ + type=$t ; } + if read -r -u "${MKFDS[0]}" PID; then + ${TS_CMD_LSFD} -n \ + -o ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH \ + -p "${PID}" -Q "${EXPR}" + echo 'ASSOC,STTYPE,NAME,SOCK.STATE,SOCK.TYPE,SOCK.LISTENING,UNIX.PATH': $? + + kill -CONT "${PID}" + wait "${MKFDS_PID}" + fi + done } > "$TS_OUTPUT" 2>&1