diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/.github/workflows/build.yml /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/.github/workflows/build.yml --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/.github/workflows/build.yml 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/.github/workflows/build.yml 2026-09-15 11:47:54.000000000 +0000 @@ -1,7 +1,5 @@ -name: tnfsd Build +on: [push] -on: - push: - workflow_dispatch: +name: tnfsd Build jobs: @@ -10,5 +8,5 @@ steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v4 - name: Install xa shell: powershell @@ -18,7 +16,6 @@ - name: Build tnfsd shell: cmd - working-directory: src - run: make OS=Windows_NT DEBUG=yes USAGELOG=yes - - uses: actions/upload-artifact@v4 + run: cd /d D:\a\tnfsd\tnfsd\src && make OS=Windows_NT DEBUG=yes USAGELOG=yes + - uses: actions/upload-artifact@master with: name: tnfsd_win-x64 @@ -29,85 +26,41 @@ steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v4 - name: Install dependencies run: sudo apt-get update && sudo apt-get install -y xa65 - - name: Test chroot build configuration - run: python3 tests/test_make_chroot.py - name: Build tnfsd - working-directory: src - run: make OS=LINUX DEBUG=yes USAGELOG=yes + run: cd /home/runner/work/tnfsd/tnfsd/src && make OS=LINUX DEBUG=yes USAGELOG=yes - name: Test queued UDP datagrams run: python3 tests/test_udp_burst.py bin/tnfsd - - name: Test directory handle leak - run: python3 tests/test_dir_handle_leak.py bin/tnfsd - - name: Test handle bounds - run: python3 tests/test_handle_bounds.py bin/tnfsd - - name: Test malformed requests - run: python3 tests/test_malformed_requests.py bin/tnfsd - - name: Test root confinement - run: python3 tests/test_confinement.py bin/tnfsd - - name: Test read-only mode - run: python3 tests/test_readonly.py bin/tnfsd - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@master with: name: tnfsd_linux-x64 path: bin/tnfsd - build-macos: + build-macos-arm64: runs-on: macos-latest - strategy: - matrix: - include: - - arch: arm64 - archflag: arm64 - - arch: x64 - archflag: x86_64 steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v4 - name: Install dependencies run: brew install xa - name: Build tnfsd - working-directory: src - run: make OS=BSD DEBUG=yes USAGELOG=yes CC="clang -arch ${{ matrix.archflag }}" - - name: Verify architecture - run: | - file bin/tnfsd - lipo -archs bin/tnfsd | grep -qw "${{ matrix.archflag }}" - - uses: actions/upload-artifact@v4 + run: cd /Users/runner/work/tnfsd/tnfsd/src && make OS=BSD DEBUG=yes USAGELOG=yes + - uses: actions/upload-artifact@master with: - name: tnfsd_macos-${{ matrix.arch }} + name: tnfsd_macos-arm64 path: bin/tnfsd - release: - if: startsWith(github.ref, 'refs/tags/v') - needs: [build-windows, build-ubuntu, build-macos] - runs-on: ubuntu-latest - permissions: - contents: write - env: - GH_TOKEN: ${{ github.token }} - GH_REPO: ${{ github.repository }} + build-macos-x64: + runs-on: macos-13 steps: - - name: Download build artifacts - uses: actions/download-artifact@v5 + - name: Checkout + uses: actions/checkout@v4 + - name: Install dependencies + run: brew install xa + - name: Build tnfsd + run: cd /Users/runner/work/tnfsd/tnfsd/src && make OS=BSD DEBUG=yes USAGELOG=yes + - uses: actions/upload-artifact@master with: - path: artifacts - - name: Package release zips - run: | - set -euo pipefail - mkdir -p dist - for dir in artifacts/tnfsd_*/; do - platform="$(basename "$dir")" - platform="${platform#tnfsd_}" - chmod 755 "$dir"* - (cd "$dir" && zip -X -j "$GITHUB_WORKSPACE/dist/tnfsd-${GITHUB_REF_NAME}_${platform}.zip" ./*) - done - ls -l dist - - name: Publish to release - run: | - set -euo pipefail - tag="$GITHUB_REF_NAME" - gh release view "$tag" >/dev/null 2>&1 \ - || gh release create "$tag" --title "tnfsd $tag" --generate-notes - gh release upload "$tag" dist/*.zip --clobber + name: tnfsd_macos-x64 + path: bin/tnfsd diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/BUILD.md /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/BUILD.md --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/BUILD.md 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/BUILD.md 2026-09-15 11:47:54.000000000 +0000 @@ -13,10 +13,6 @@ If using Windows with cygwin, it's probable you'll need to use make `OS=LINUX` instead since Cygwin looks more like Linux than Windows. -You might have to build with `ENABLE_CHROOT=no`, though, since I'm not -sure chrooting is supported under Cygwin: - -``` -make OS=LINUX ENABLE_CHROOT=no -``` +You might have to remove the `-DENABLE_CHROOT` from the Makefile, though +since I'm not sure chrooting is supported under Cygwin. To make a debug version, use `make OS=osname DEBUG=yes`. This will add @@ -25,2 +21,3 @@ To output basic usage log on stdout, use `make OS=osname USAGELOG=yes`. + diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/Makefile /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/Makefile --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/Makefile 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/Makefile 2026-09-15 11:47:54.000000000 +0000 @@ -55,5 +55,5 @@ endif -CFLAGS=$(FLAGS) $(CHROOTFLAGS) $(EXFLAGS) $(LOGFLAGS) -DNEED_ERRTABLE +CFLAGS=$(FLAGS) $(EXFLAGS) $(LOGFLAGS) -DNEED_ERRTABLE OBJS=main.o datagram.o event_common.o log.o session.o endian.o directory.o errortable.o tnfs_file.o chroot.o fileinfo.o stats.o auth.o traverse.o match.o tnfsd.o atari.o $(EXOBJS) @@ -93,2 +93,3 @@ clean: $(RM) -f $(OBJS) atari_bootsector.bin atari_bootsector.h bin/$(EXEC) + diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/chroot.c /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/chroot.c --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/chroot.c 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/chroot.c 2026-09-15 11:47:54.000000000 +0000 @@ -62,20 +62,4 @@ } - /* A cwd left outside the new root is itself a way back out, so move - * into the jail before dropping privileges. */ - if(chdir("/") == -1) - { - perror("chdir"); - exit(-1); - } - - /* setgid() does not touch the supplementary groups, so root's would - * survive the switch. Clear them while we still can. */ - if(setgroups(0, NULL) == -1) - { - perror("setgroups"); - exit(-1); - } - /* drop the group privileges first */ if(setgid(grp->gr_gid) == -1) diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/config.h /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/config.h --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/config.h 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/config.h 2026-09-15 11:47:54.000000000 +0000 @@ -49,6 +49,4 @@ #define TCP_KA_COUNT 60 /* the maximum number of keepalive probes TCP should send before dropping the connection */ #define TCP_SEND_TIMEOUT 30 /* max seconds a send() to a client may stall */ -#define TCP_ACCEPT_RESOURCE_BACKOFF_MS 100 /* Windows only: pause before retrying accept() - after socket-handle exhaustion */ #define SESSION_SWEEP_INTERVAL 10 /* how often the main loop reaps timed-out sessions */ #define ACCEPT_WARN_INTERVAL 10 /* minimum seconds between accept() failure warnings */ diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/datagram.c /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/datagram.c --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/datagram.c 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/datagram.c 2026-09-15 11:47:54.000000000 +0000 @@ -434,18 +434,4 @@ #endif -/* Winsock reports through WSAGetLastError(), so errno is never set and - * strerror() would describe an error nothing raised. */ -static const char *tcp_accept_strerror(int err) -{ -#ifdef WIN32 - static char buf[32]; - - snprintf(buf, sizeof(buf), "WSA error %d", err); - return buf; -#else - return strerror(err); -#endif -} - /* Under fd exhaustion this fires on every pass of the loop, so rate-limit it. */ static void tcp_accept_warn(int err) @@ -463,7 +449,7 @@ if (suppressed > 0) LOG("unable to accept TCP connection: %s (%lu more suppressed)\n", - tcp_accept_strerror(err), suppressed); + strerror(err), suppressed); else - LOG("unable to accept TCP connection: %s\n", tcp_accept_strerror(err)); + LOG("unable to accept TCP connection: %s\n", strerror(err)); last_warn = now; @@ -505,19 +491,7 @@ acc_fd = accept(tcplistenfd, (struct sockaddr *)&cliaddr, &cli_len); - /* accept() yields INVALID_SOCKET on Windows, which truncates to -1 here. - * Don't compare against INVALID_SOCKET directly: it is unsigned and wider - * than int on 64-bit, so the comparison would never be true. */ if (acc_fd < 0) { -#ifdef WIN32 - int accept_error = WSAGetLastError(); - - tcp_accept_warn(accept_error); - - /* No reserve-descriptor trick here, so simply stop spinning on a - * listener that stays readable while the process is out of handles. */ - if (accept_error == WSAEMFILE || accept_error == WSAENOBUFS) - Sleep(TCP_ACCEPT_RESOURCE_BACKOFF_MS); -#else +#ifndef WIN32 switch (errno) { @@ -540,7 +514,6 @@ break; } - - tcp_accept_warn(errno); #endif + tcp_accept_warn(errno); return; } diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/directory.c /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/directory.c --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/directory.c 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/directory.c 2026-09-15 11:47:54.000000000 +0000 @@ -182,14 +182,8 @@ return -1; - /* realroot is what validate_path() compares every listing against. If - * it cannot be resolved it stays indeterminate and every confinement - * check runs against garbage, so refuse to start instead. tnfsd.c - * already reports a -1 here as "Invalid root directory". */ #ifdef WIN32 - if (GetFullPathNameA(rootdir, MAX_ROOT, realroot, NULL) == 0) - return -1; + GetFullPathNameA(rootdir, MAX_ROOT, realroot, NULL); #else - if (realpath(rootdir, realroot) == NULL) - return -1; + realpath(rootdir, realroot); #endif @@ -295,13 +289,8 @@ char valpath[MAX_FILEPATH]; - /* On failure valpath is left indeterminate, so the strstr() below would - * run over uninitialized stack and could match by accident. Treat an - * unresolvable path as outside the root. */ #ifdef WIN32 - if (GetFullPathNameA(path, MAX_FILEPATH, valpath, NULL) == 0) - return 0; + GetFullPathNameA(path, MAX_FILEPATH, valpath, NULL); #else - if (realpath(path, valpath) == NULL) - return 0; + realpath(path, valpath); #endif @@ -782,8 +771,4 @@ hdr->status = TNFS_EOF; tnfs_send(s, hdr, NULL, 0); - /* Without this the EOF reply is followed by a second, built reply - * for the same request: two datagrams for one seqno, which desyncs - * the client and overwrites the retransmit buffer. */ - return; } @@ -979,8 +964,5 @@ fileinfo_t finf; snprintf(temp_statpath, sizeof(temp_statpath), "%s%c%s", dirh->path, FILEINFO_PATHSEPARATOR, entry->d_name); - /* temp_statpath is twice the size of statpath, so a long enough - * dir + entry name leaves strncpy's copy unterminated and the - * stat() below reads off the end of the buffer. */ - strlcpy(statpath, temp_statpath, sizeof(statpath)); + strncpy(statpath, temp_statpath, sizeof(statpath)); if (get_fileinfo(statpath, &finf) == 0) { @@ -1337,21 +1319,17 @@ /* deallocate ext iterator */ struct tnfs_opendir_ext *handle = (struct tnfs_opendir_ext*) dhandle->handle; - /* A slot can be reclaimed before opendir succeeded, leaving no iterator. */ - if (handle != NULL) + for(int i = 0; i < handle->total; ++i) { - for(int i = 0; i < handle->total; ++i) - { - free(handle->namelist[i]); - } - if(handle->namelist) free(handle->namelist); - if(handle->wildcard) free(handle->wildcard); - if(handle->ignore_patterns) - { - for (int i = 0; i < handle->ignore_count; ++i) - free(handle->ignore_patterns[i]); - free(handle->ignore_patterns); - } - free(handle); + free(handle->namelist[i]); } + if(handle->namelist) free(handle->namelist); + if(handle->wildcard) free(handle->wildcard); + if(handle->ignore_patterns) + { + for (int i = 0; i < handle->ignore_count; ++i) + free(handle->ignore_patterns[i]); + free(handle->ignore_patterns); + } + free(handle); #else if (dhandle->handle != NULL) @@ -1370,5 +1348,4 @@ dhandle->current_entry = dhandle->entry_list = NULL; dhandle->entry_count = 0; - dhandle->open = false; dhandle->loaded = false; } @@ -1480,3 +1457,3 @@ return -1; -} +} \ No newline at end of file diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/session.c /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/session.c --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/session.c 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/session.c 2026-09-15 11:47:54.000000000 +0000 @@ -32,8 +32,4 @@ #include #include -#include -#ifdef WIN32 -#include -#endif #include "session.h" @@ -55,14 +51,7 @@ slist[i] = NULL; - /* tnfs_newsid() draws session IDs from this PRNG, and sessions are - * authenticated by client IP alone. Outside BSD the seed was never set, - * so rand() replayed one sequence and every restart handed out the same - * first SID (0x4567), making it trivially guessable. */ #ifdef BSD + /* initialize prng */ srandomdev(); -#elif defined(WIN32) - srand((unsigned)(time(NULL) ^ _getpid())); -#else - srand((unsigned)(time(NULL) ^ getpid())); #endif } diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/tnfs_file.c /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/tnfs_file.c --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/src/tnfs_file.c 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/src/tnfs_file.c 2026-09-15 11:47:54.000000000 +0000 @@ -65,26 +65,7 @@ unsigned char *bufptr; - /* The deprecated layout is flags(1) + mode(1) + filename, so the - * smallest legal datagram carries two header bytes and a filename of - * at least its NUL terminator. Below that the memcpy() length - * (bufsz - 2) goes negative and converts to a huge size_t, and the - * daemon dies on a four-byte packet. */ - if (bufsz < 3) - { - hdr->status = TNFS_EINVAL; - tnfs_send(s, hdr, NULL, 0); - return; - } - // new format datagram is slightly larger than the deprecated one. unsigned char *newbuf = (unsigned char *)malloc(bufsz + 2); - if (newbuf == NULL) - { - hdr->status = TNFS_ENOMEM; - tnfs_send(s, hdr, NULL, 0); - return; - } - // translate deprecated file flags and mode *newbuf = *buf; @@ -111,8 +92,5 @@ unsigned char reply[2]; - /* flags(2) + mode(2) + a filename of at least its NUL terminator. - * The old bound of 3 let mode read past the received bytes and handed - * tnfs_valid_filename() a negative length. */ - if (bufsz < 5 || + if (bufsz < 3 || tnfs_valid_filename(s, fnbuf, (char *)buf + 4, bufsz - 4) < 0) { @@ -246,14 +224,4 @@ writesz = tnfs16uint(buf + 1); - /* The client's declared size is not evidence that it sent that many - * bytes. buf points into the 532-byte receive buffer, so an unclamped - * claim of up to 65535 makes write() copy tens of kilobytes of stack -- - * return addresses and heap pointers included -- into a file the client - * can then read back. Write only what actually arrived and report that - * count; a short write is a legal WRITEBLOCK reply. */ - if (writesz > bufsz - 3) - writesz = bufsz - 3; - if (writesz > MAX_IOSZ) - writesz = MAX_IOSZ; writesz = write(fd, buf + 3, (size_t)writesz); if (writesz > 0) Only in /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/tests: test_confinement.py diff -U2 -r /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/tests/test_dir_handle_leak.py /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/tests/test_dir_handle_leak.py --- /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/tests/test_dir_handle_leak.py 2026-09-15 16:39:09.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/tnfsd/srpm-unpacked/tnfsd-26.0915.1.tar.gz-extract/tnfsd-26.0915.1/tests/test_dir_handle_leak.py 2026-09-15 11:47:54.000000000 +0000 @@ -1,4 +1,4 @@ #!/usr/bin/env python3 -"""Regression test: OPENDIR must not leak directory descriptors. +"""Regression test: OPENDIR/CLOSEDIR must not leak directory descriptors. tnfs_closedir() used to clear the handle's 'open' flag without calling @@ -6,8 +6,4 @@ never sets. Each OPENDIR therefore leaked one fd for the life of the process, reaching the default 1024 soft limit in roughly a day of normal browsing. - -Two halves: repeated OPENDIR/CLOSEDIR must not grow the descriptor count, and -UMOUNT must release handles the client never closed. Session teardown used to -sweep only 'loaded' slots, so it walked straight past a plain OPENDIR handle. """ @@ -23,8 +19,6 @@ ANY_ADDRESS = "0.0.0.0" CYCLES = 300 -MAX_DHND_PER_CONN = 8 # config.h TNFS_MOUNT = 0x00 -TNFS_UMOUNT = 0x01 TNFS_OPENDIR = 0x10 TNFS_CLOSEDIR = 0x12 @@ -83,14 +77,4 @@ -def wait_for_fd_count(pid, expected, timeout=1.0): - """Teardown happens after the reply is sent, so give it a moment to settle.""" - deadline = time.monotonic() + timeout - count = open_fd_count(pid) - while count != expected and time.monotonic() < deadline: - time.sleep(0.01) - count = open_fd_count(pid) - return count - - def main(): if not Path("/proc/self/fd").is_dir(): @@ -149,31 +133,4 @@ f"leaked {growth} descriptors over {CYCLES} cycles" ) - - # Now leave every handle open and tear the session down. - # tnfs_freesession() has to release plain OPENDIR handles too; - # keying the sweep off 'loaded' alone used to skip them. - for _ in range(MAX_DHND_PER_CONN): - request(client, address, sid, seqno, TNFS_OPENDIR, b"/subdir\x00") - seqno = (seqno + 1) & 0xFF - - with_handles = open_fd_count(server.pid) - if with_handles != baseline + MAX_DHND_PER_CONN: - raise AssertionError( - f"expected {MAX_DHND_PER_CONN} open directory descriptors, " - f"got {with_handles - baseline} " - f"(baseline={baseline}, with_handles={with_handles})" - ) - - request(client, address, sid, seqno, TNFS_UMOUNT) - after_umount = wait_for_fd_count(server.pid, baseline) - print( - f"open fds: {MAX_DHND_PER_CONN} handles left open={with_handles}, " - f"after UMOUNT={after_umount} (baseline={baseline})" - ) - if after_umount != baseline: - raise AssertionError( - f"UMOUNT left {after_umount - baseline} directory descriptors " - f"behind (baseline={baseline}, after_umount={after_umount})" - ) finally: if server.poll() is None: @@ -185,5 +142,5 @@ server.wait(timeout=3) - print("PASS: no descriptor growth, and UMOUNT released every handle") + print("PASS: no descriptor growth") return 0 Only in /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/tests: test_make_chroot.py Only in /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/tests: test_malformed_requests.py Only in /var/lib/copr-rpmbuild/results/tnfsd/upstream-unpacked/Source0/tnfsd-26.0915.1/tests: test_readonly.py