From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (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 A33F342315B for ; Tue, 30 Jun 2026 13:24:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782825878; cv=none; b=IT427jg/xClrTdCrtKKnVVGGaWrdSUByWVaKjHSApTf08DtaaLRijAPMURueH0TiB80bfxwWxJdqtVTIZGqdCjeF1qWiWyDCXNV04TYbspe+9PXS9lkpYcolnOSPhuu/mij1i52UBaO5EpucCRS4khAn+TX1HcCjvzecD2IZQic= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782825878; c=relaxed/simple; bh=dUkUd9P+6IRdz6008280NMCqTBYhRonALzd8HyL08W8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jCVNPSNWCshW4b0C3nnLLZYKiz8mEcDlw45Q4PtqpjhQ/DHVocFeqAdJAsbkByPo8hUUX1AqDWB6cFbV8yQ0pv48sPS/k704npN+UbQj1C3i0FaHbjSFYjT6PfqtA7rKgUELHI0FiSW4n8SvZZneUBaLzd6BuBopjhYFLVCVt7o= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=thingy.jp; spf=pass smtp.mailfrom=0x0f.com; dkim=pass (1024-bit key) header.d=thingy.jp header.i=@thingy.jp header.b=Eugh8IW3; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=thingy.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=0x0f.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=thingy.jp header.i=@thingy.jp header.b="Eugh8IW3" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2c9e8a1d256so22400555ad.1 for ; Tue, 30 Jun 2026 06:24:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=thingy.jp; s=google; t=1782825876; x=1783430676; 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=YSHVFfwnOoet8TtmUcVnB+QvyKVId/YvQ7GsdJoKpDg=; b=Eugh8IW3ppSV3ojVtycdjSDCFe1Hd5jvQjOOuk4zUMTLxf6g17uEq3hjqOj9uBqw1j GaJexikV/fDc0e08iEgs2oyZZXtCrfJYRo18t432vrepHNony59CeFvYfSlMi1T8OmZ7 NzDeGRcucfXgEh3sXOEkFNujtrO0LINSFma10= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782825876; x=1783430676; 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=YSHVFfwnOoet8TtmUcVnB+QvyKVId/YvQ7GsdJoKpDg=; b=mUm/h35Zqc7lKSY6Mh4mZ3Q9lbFfO2+ZIHLdZtp91H6ZD335uDyC9YHrzqP+PFnVob OSAoEnre/xVEQivYLAOKH7odcD0NkxFYRDkAGVTtn3egOIjjqA3MlvidoQYxfFg2L/LF GCy3tmu6Ozn5B8nzHv8DjDjG9c26mYvQ3Jp3UbK9NKZEOyiYBNmiHWQ7g56fn3uKtGjv ZyYkJ8odBgcjWKwXEoVx2wrOs0V/H0HHs2PhYV3K3D46uX7gQSN3bScasVz8F07rwj3L fZ5T/yd2iGl/6qpScNrZyiZwrqDm3xtKnkSrY/luT6tVwm0d2G9y7R3G3X4hdpo0vQhQ TtDQ== X-Gm-Message-State: AOJu0YyZWGWOoOHLpUwFV9HotN5W9osEfl+PDP+xk+aazCJXgB00YHoc AYHKxEt+1wKgiuyLmUKiJ4cNYZqoG8N2vUee0PETRixhOEvJ4RCfJdSwT5z34Q3/0GfbHBn34nX S2SWf X-Gm-Gg: AfdE7clyu5LeGNfRsByeBKxuA5l6/lvIBAG06IPClcuz0FkxKy8TTs5J2lkclpiGRRP vatETc/PyakMCYvRO2hwrjVZMqm7tQutkryYBe3o4cg4uc3EwQuGew6S9ZAewM1g2UHNOcZc5ld eWM2xSyoRNVC1WaESoVhsv3tiRCy4mbU5skq9IRG28r7VsgiiG96rVJELWmTaO8kZE49LgHK+Ww lFmqWaFOTdRlZIVDIWTR/ONls/XLa1P1fPvuxQ26uO6yveXEkvJt5YpI+jv5C1gsT6R1nYew7mi g+4NC+GC+BrJC2YDU9u26MCunITCrYELC+i8S+Y92Yl5oc1ARHMKCCT6wMFj3h0j1vnZCbc1wds zB/87/rjsqIarfuSnoD+Nq4xOgTvYOPwvXv1SY213vtXOIzOnFBqFjz6jEhNHH/pcqlroStTt/I 6+j+JMCcmN8nE/MpXWC4DUi52TD8sVPkzgddzl X-Received: by 2002:a17:902:e5ce:b0:2c9:97a9:2095 with SMTP id d9443c01a7336-2ca2eb32e0bmr28638195ad.41.1782825875814; Tue, 30 Jun 2026 06:24:35 -0700 (PDT) Received: from kinako.work.home.arpa ([2400:4162:2428:2ffe:a973:53e4:1a28:8545]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2ca382abefdsm14716155ad.59.2026.06.30.06.24.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2026 06:24:35 -0700 (PDT) From: Daniel Palmer To: w@1wt.eu, linux@weissschuh.net Cc: linux-kernel@vger.kernel.org, Daniel Palmer Subject: [PATCH v2 3/3] selftests/nolibc: Add test for getcwd() and readlink() Date: Tue, 30 Jun 2026 22:24:19 +0900 Message-ID: <20260630132419.2523890-4-daniel@thingy.jp> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260630132419.2523890-1-daniel@thingy.jp> References: <20260630132419.2523890-1-daniel@thingy.jp> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add a test that uses both getcwd() and readlink() so that both are exercised. First the happy path is tested by fetching what should be the same string via getcwd() and readlink() and checking they match. Then a few different combinations of bad parameters are passed to getcwd() to make sure it returns NULL and sets errno in those cases. Signed-off-by: Daniel Palmer --- tools/testing/selftests/nolibc/nolibc-test.c | 48 ++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index c1c1ce43a047..d54e7188e2ab 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -854,6 +854,53 @@ static int test_dirent(void) return 0; } +static int test_getcwd(void) +{ + char cwd_syscall[1024]; + char cwd_proc[1024]; + ssize_t len; + + /* Read where the link /proc/self/cwd points */ + len = readlink("/proc/self/cwd", cwd_proc, sizeof(cwd_proc) - 1); + if (len <= 0) + return -1; + + /* Terminate the string from readlink() */ + cwd_proc[len] = '\0'; + + /* Get the cwd via syscall */ + if (getcwd(cwd_syscall, sizeof(cwd_syscall)) == NULL) + return -1; + + /* Fail if they aren't the same */ + if (strcmp(cwd_proc, cwd_syscall) != 0) + return -1; + + /* Try getcwd() with NULL for the buffer, + * should return NULL and an error in errno. + */ + if (getcwd(NULL, 0) != NULL || !errno) + return -1; + + /* Try getcwd() with a buffer but make the size 0, + * should return NULL and an error in errno. + */ + errno = 0; + if (getcwd(cwd_syscall, 0) != NULL || !errno) + return -1; + + /* Try getcwd() with a buffer but make the size 1, + * should return NULL and an error in errno because + * the string written to the buffer is terminated + * so you need at least 2 bytes even for "/". + */ + errno = 0; + if (getcwd(cwd_syscall, 1) != NULL || !errno) + return -1; + + return 0; +} + int test_getrandom(void) { uint64_t rng = 0; @@ -1555,6 +1602,7 @@ int run_syscall(int min, int max) CASE_TEST(clock_getres); EXPECT_SYSZR(1, clock_getres(CLOCK_MONOTONIC, &ts)); break; CASE_TEST(clock_gettime); EXPECT_SYSZR(1, clock_gettime(CLOCK_MONOTONIC, &ts)); break; CASE_TEST(clock_settime); EXPECT_SYSER(1, clock_settime(CLOCK_MONOTONIC, &ts), -1, EINVAL); break; + CASE_TEST(getcwd); EXPECT_SYSZR(proc, test_getcwd()); break; CASE_TEST(getpid); EXPECT_SYSNE(1, getpid(), -1); break; CASE_TEST(getppid); EXPECT_SYSNE(1, getppid(), -1); break; CASE_TEST(gettid); EXPECT_SYSNE(has_gettid, gettid(), -1); break; -- 2.53.0