From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2BEA2262FFC for ; Fri, 26 Dec 2025 19:55:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766778925; cv=none; b=boK4H+abHxMknlwOljFn/6uvqSa+bP7nlVdPtPdxMbqj4K9O6IP2qejMhCmkEhYGcfU+m7MzJTFZqXLE1k34pTTdqpFFwzwfUj1bszoZ5Ezv8j850NP+jA+kHPtFZSkOvWo53AjdbgxaIX6C5VrXbLFfRpLw4e9AiW6pFnZiQio= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766778925; c=relaxed/simple; bh=y0eeyInOH/AIg6NutvYQeOZ0LyR6GWlgPWgYp17PDAE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=elFSKbKlDMOWuvlKoX28Oab//wwrjfLIFCypPrJxL9vYEu40F0SIPW2bChcn7MuIsUe82awVNyVL7OMFPfAW0DBreX4MiSgwnDOtEO7RqdFjgpsLvY6lXhjl4fztEgBlgsPrKDmd9rSkEx7acEBy8M/IKAu5M7d3auSkHZW+BfQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gOTCoBDe; arc=none smtp.client-ip=209.85.208.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gOTCoBDe" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-37a3340391cso57709651fa.3 for ; Fri, 26 Dec 2025 11:55:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1766778921; x=1767383721; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XZ7wyrGQbKhbSZ1qkyBpRXfcM3pVMOETN7OPFmbDZho=; b=gOTCoBDeOY9KuiZeHHMXOvSQqfWcKwR037RYssRY0knway2ve5SVRHrm2Pbz6mye/a MVMn/7pS4houxbdWVvfJ0KvGXvoSi7e7NxZh3AJ+jsDvUg1wzsuTV5hT+MNFWh5MGXS1 2UQlzi2S5OTKf8BQ7ayHOpFR9e5aaD0Wz/NzE0i1UEPCIvjS7oHQ8oYb5JJQ49Dzzj4z Xg1PvfgaM8LgMYAImlpaZDrK+0g0izwS2rrisg4gS3YSKhvAleEFdUt+q10uyU/5LSAp dUWrIIrckpRAjjJrFdR2eVwX88WsHIPzhOO2VMNlEt08eOg8vvjzL2oSugJtJEReIm2R aYlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766778921; x=1767383721; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=XZ7wyrGQbKhbSZ1qkyBpRXfcM3pVMOETN7OPFmbDZho=; b=qGuht5NmH95nCyVAFlbIqb2KLXfNnb+WZHVWlC8gIn6SSwNj6jEzQpoFZ7nTp8wpXT eju2spmfz5IwEJBbECgnB3bq+BvcrykburVeqIwRWJlndZK0Xe29VdaXRt674JY6q7LP 1bavdIrohhZmGwAr0DnaF27u5uzdew/QdvxtbBYFqzX8e+FUMuskq33ZoaBVBx2XCX3L d7H0R0h2qFZoLOgSlop/xW/N+JKTYtk0J/hGp/LARt4jEoJdvOlGMsCe4WwhpHW+R4+G Av2TxAcGudCtr6cfknh/2WkuO0aa8+V5XfotRrnA6FVVr2WZx1/xzUTGk9HJpq7pf3ZX DXvQ== X-Forwarded-Encrypted: i=1; AJvYcCUGscdtT5X1FP2YpaBtYmquM81YffQBaonuAYtUWGC5xH0Mq2EOAAN/Yj9qC3QppMGDQVbCdIfM2nHIBU4=@vger.kernel.org X-Gm-Message-State: AOJu0YyE6+6FI6hfbTaLRzoEnjZeSXqQ+e9WOXoi4LMk8JL3sXt3gpFV NJCYyv3pSNCeRSjYt3gGHr/ZbnN2PRRcPj2xxJvdOHO4ag/Q5+4q/MA= X-Gm-Gg: AY/fxX7rvOj82XCebVtfcpCW7EjvDviNaQokaWk5Zy5mDUXirefx+nJXEnaZXemCrYX SyCw02uxIMwwzP8oCNhF8gGkG0y30UOGD1ktr3k+pRW2LLbOeMwDaoMbppYLLF7aye/ABRdaHe2 QAcRRPcJtqvar8LPEoq5cVfByzdl1XEWs7CFCzxynJJ73ICSf0peMmUvT+p20ZGGh2pIMpBkq7n qohgXb08kKCuhlJttLGzAyZb0ck/8aCbKEDGHz81d9jsKxuXjz0hDt72QrtbPJGQ4jiI7Da8NbH 4BjfxC/kz29AxPUh3QMQxpG2kSiOYRHND6rX5TMqoMzkWZTs7W0ACZWMPkkBVNkU+Uu7HnIm/av 9ahf2n1ypsb7oywrpZSdlcp7K1N+yrh5ZyPr/kYKyY5/ET5yQJCPTeClyfF6pbivBlSFfKH6E25 A= X-Google-Smtp-Source: AGHT+IEgTr4LvCZev/7h3JR1Phz8GPGj4AW1DaTe1GXBLMXWI2FBM/C0duRBVHm4/Nu2XwhXBIPOjQ== X-Received: by 2002:a05:651c:1506:b0:37b:9101:77e6 with SMTP id 38308e7fff4ca-381215699edmr71348711fa.15.1766778920951; Fri, 26 Dec 2025 11:55:20 -0800 (PST) Received: from p183 ([178.172.146.10]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-3812251cfffsm63088951fa.19.2025.12.26.11.55.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Dec 2025 11:55:20 -0800 (PST) From: Alexey Dobriyan To: akpm@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, adobriyan@gmail.com Subject: [PATCH 1/1] proc: test lseek on /proc/net/dev Date: Fri, 26 Dec 2025 22:55:35 +0300 Message-ID: <20251226195536.468978-2-adobriyan@gmail.com> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251226195536.468978-1-adobriyan@gmail.com> References: <20251226195536.468978-1-adobriyan@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit --- tools/testing/selftests/proc/.gitignore | 1 + tools/testing/selftests/proc/Makefile | 1 + .../selftests/proc/proc-net-dev-lseek.c | 68 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 tools/testing/selftests/proc/proc-net-dev-lseek.c diff --git a/tools/testing/selftests/proc/.gitignore b/tools/testing/selftests/proc/.gitignore index 19bb333e2485..243f4537a670 100644 --- a/tools/testing/selftests/proc/.gitignore +++ b/tools/testing/selftests/proc/.gitignore @@ -7,6 +7,7 @@ /proc-loadavg-001 /proc-maps-race /proc-multiple-procfs +/proc-net-dev-lseek /proc-empty-vm /proc-pid-vm /proc-self-map-files-001 diff --git a/tools/testing/selftests/proc/Makefile b/tools/testing/selftests/proc/Makefile index 50aba102201a..2a9547630115 100644 --- a/tools/testing/selftests/proc/Makefile +++ b/tools/testing/selftests/proc/Makefile @@ -10,6 +10,7 @@ TEST_GEN_PROGS += fd-003-kthread TEST_GEN_PROGS += proc-2-is-kthread TEST_GEN_PROGS += proc-loadavg-001 TEST_GEN_PROGS += proc-maps-race +TEST_GEN_PROGS += proc-net-dev-lseek TEST_GEN_PROGS += proc-empty-vm TEST_GEN_PROGS += proc-pid-vm TEST_GEN_PROGS += proc-self-map-files-001 diff --git a/tools/testing/selftests/proc/proc-net-dev-lseek.c b/tools/testing/selftests/proc/proc-net-dev-lseek.c new file mode 100644 index 000000000000..742a3e804451 --- /dev/null +++ b/tools/testing/selftests/proc/proc-net-dev-lseek.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2025 Alexey Dobriyan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#undef _GNU_SOURCE +#define _GNU_SOURCE +#undef NDEBUG +#include +#include +#include +#include +#include +#include +/* + * Test that lseek("/proc/net/dev/", 0, SEEK_SET) + * a) works, + * b) does what you think it does. + */ +int main(void) +{ + /* /proc/net/dev output is deterministic in fresh netns only. */ + if (unshare(CLONE_NEWNET) == -1) { + if (errno == ENOSYS || errno == EPERM) { + return 4; + } + return 1; + } + + const int fd = open("/proc/net/dev", O_RDONLY); + assert(fd >= 0); + + char buf1[4096]; + const ssize_t rv1 = read(fd, buf1, sizeof(buf1)); + /* + * Not "<=", this file can't be empty: + * there is header, "lo" interface with some zeroes. + */ + assert(0 < rv1); + assert(rv1 <= sizeof(buf1)); + + /* Believe it or not, this line broke one day. */ + assert(lseek(fd, 0, SEEK_SET) == 0); + + char buf2[4096]; + const ssize_t rv2 = read(fd, buf2, sizeof(buf2)); + /* Not "<=", see above. */ + assert(0 < rv2); + assert(rv2 <= sizeof(buf2)); + + /* Test that lseek rewinds to the beginning of the file. */ + assert(rv1 == rv2); + assert(memcmp(buf1, buf2, rv1) == 0); + + /* Contents of the file is not validated: this test is about lseek(). */ + + return 0; +} -- 2.49.1