From nobody Sat Feb 7 13:41:21 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (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 36E762253EE for ; Sat, 31 Jan 2026 16:42:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769877777; cv=none; b=BjlhsjjgttrWt+PmbEpe1U+KDEpXALtU0mZ6syruq1fgIAUGkkeqby/D0ss28N8guQQb3B667H2t9NKBWC8OY+NHQoFECpFyc1IsHZtVD+CQzYXLv1pbuTceCxORfTCYt/GTP1Ub2CasKOf0k5noeVQi7AjLXGTdr1Lf/En31lY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769877777; c=relaxed/simple; bh=J/AAB3tENADKoPHbBY0BMm2WYEeRFL8x0RBuyPbusOQ=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=LQoyFKe0P+21QjefEjki3Vg0WPxEL/wFucv11nhQwfBBf1D3WkUVy0YDhI0DLXky9CscYNSufP4Zr+WSjDXnhhnm8nc2JEs5EEVIrLAobjt8xJS//3msU6f9czRTEqoymlnowi7D/bNWFumGy/Hn9r2r3Qpybfb1SeNOs0tyTtk= 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=Jqo3DPPF; arc=none smtp.client-ip=209.85.214.174 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="Jqo3DPPF" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2a871c8b171so18668755ad.3 for ; Sat, 31 Jan 2026 08:42:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769877775; x=1770482575; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=CfnskZKszActZmelXo052mV+WPSTY5JhwZFi+v0Z/VM=; b=Jqo3DPPFhgT2lg75Ou+JSgifhBnfoJdogLBuwFRgNbA8MwQ1thJFEv2WUeq9W6JiNT uHAd7oCIQm/dxvlsUu9CL1k4BWTAroZRfXNtnFBgLFJF7ChRV5yriPaBkr6pUk5R9l3e RZTbZjTHKx6T1QV1bj9QfDaZ83UKfo5Uh/gYybrfYq4i6BI1ezOG+y0XMaetz01J/Avc wBK2f4Tu3UbrfoJflUn3oOVfPOPa7VgmG988HW2rr6dndcgyxQTylPjCC62PlpqlOXzM KnpuHjg/Qqn0Z4ESjA5O4dpAFTsjJIoHdRhtQ2YzLcTPoq43o9AhY+agAMenIV8TnCfR GY5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769877775; x=1770482575; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=CfnskZKszActZmelXo052mV+WPSTY5JhwZFi+v0Z/VM=; b=coNKBCypNsAbI7h3bNggNy4PqQFEoUz/qBAaicpYyUNNL/uw8Y3AtS0J+Aw5dG04/3 QtEbTcW0CJt6nbdQUrTgY9iHTtqse3uzP5VexXFcx+AK9RddNzBwZauJDTLfjadl99gj M/+G9fOsUGCecfwvA6jmhxuFM/Gh3tzOcsbPX9IFitSI/+RCFa6Gxsax7pvcCYSak15p TnC3qIgdzgqmH7qW1dBfi74iB8wAeTUu0i3ya5h2IyI9m6KbuWyFb/NtIQ7F3Mjp3TEU Ft21T5fQJbEWOqH1Oe/UPZA+QRncoZdG/+KwUJM32zsx0EIqQA8JzS6fJQe3AVpsjwMq YpBQ== X-Gm-Message-State: AOJu0YzjVuF12WBsUEzJFp1WLQrLfX6ga2gZ8a4uBjGD98S8wWLBZ+Wu 9vni4rYcHWBZufFNVCl1UApwqg4/Sk/1KI27pv5li6fM0Hd/zKBwqUtr X-Gm-Gg: AZuq6aLoBzmJVFl7vn3kuP8UwyBvpRQZ9EPUol0lc/KrI6m/XhwlCCsHg5F9nyKFejR Ig1nvGmKx4lmAmTc/aouXnD62mfx5mqGKu5Bkdfnx6WQ1xIUEva3Fr2ffs+hbr0WaSJJDzMex/a NpIW6tgcQakWaHLZDQAlx7P7hUWAk0C8oPXcsqRooGXzufhvqKv+dPjYmyQDgy8p/dBeeZAw0vx HgcCquJ6YxDiZxIhUja+DsnlJLPyJNLErC4AuXlzRnOrT6tVj8DBeBH6ECWTPB+JYjVEJTdOnSP zX/NlGas0m1cglFEbGQVURbMPD9RlYtmgVxHmtSALcidZWU2qbzLZUBTvdBMbpuiHr3RAH0YBRj s3AGnbfYatVbZUWuRq+aTGItW75WBoKmCjdUMr2sop+hTwiU8HCtWA/38beYkzGI9a2HpSKuOHg Bso9IOvS9LTVxxx9SG1TX53ve7ew== X-Received: by 2002:a17:902:dacf:b0:29f:1bf:6424 with SMTP id d9443c01a7336-2a8d7ee5172mr72814435ad.18.1769877775380; Sat, 31 Jan 2026 08:42:55 -0800 (PST) Received: from gmail.com ([2402:e280:3e9b:22f:1ecb:768f:dd7b:8c69]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b3eecedsm104762715ad.15.2026.01.31.08.42.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 31 Jan 2026 08:42:54 -0800 (PST) From: Sumeet Pawnikar To: trenn@suse.com, shuah@kernel.org, jwyatt@redhat.com, jkacur@redhat.com, linux-pm@vger.kernel.org Cc: linux-kernel@vger.kernel.org, sumeet4linux@gmail.com Subject: [PATCH] tools/power/cpupower: Replace strcpy/strcat with snprintf in powercap.c Date: Sat, 31 Jan 2026 22:12:33 +0530 Message-ID: <20260131164233.7924-1-sumeet4linux@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Replace all unsafe strcpy() and strcat() calls with snprintf() in powercap.c to prevent potential buffer overflow vulnerabilities. The snprintf() function performs automatic bounds checking to ensure the destination buffer is not overflowed. No functional change. Signed-off-by: Sumeet Pawnikar --- tools/power/cpupower/lib/powercap.c | 42 +++++++++++++---------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/tools/power/cpupower/lib/powercap.c b/tools/power/cpupower/lib= /powercap.c index 94a0c69e55ef..4116a9795bbe 100644 --- a/tools/power/cpupower/lib/powercap.c +++ b/tools/power/cpupower/lib/powercap.c @@ -100,7 +100,7 @@ int powercap_get_driver(char *driver, int buflen) driver =3D ""; return -1; } else if (buflen > 10) { - strcpy(driver, "intel-rapl"); + snprintf(driver, buflen, "intel-rapl"); return 0; } else return -1; @@ -125,13 +125,12 @@ static int sysfs_powercap_get64_val(struct powercap_z= one *zone, enum powercap_get64 which, uint64_t *val) { - char file[SYSFS_PATH_MAX] =3D PATH_TO_POWERCAP "/"; + char file[SYSFS_PATH_MAX]; int ret; char buf[MAX_LINE_LEN]; =20 - strcat(file, zone->sys_name); - strcat(file, "/"); - strcat(file, powercap_get64_files[which]); + snprintf(file, sizeof(file), "%s/%s/%s", + PATH_TO_POWERCAP, zone->sys_name, powercap_get64_files[which]); =20 ret =3D sysfs_read_file(file, buf, MAX_LINE_LEN); if (ret < 0) @@ -165,16 +164,14 @@ int powercap_get_power_uw(struct powercap_zone *zone,= uint64_t *val) =20 int powercap_zone_get_enabled(struct powercap_zone *zone, int *mode) { - char path[SYSFS_PATH_MAX] =3D PATH_TO_POWERCAP; + char path[SYSFS_PATH_MAX]; + int ret; =20 - if ((strlen(PATH_TO_POWERCAP) + strlen(zone->sys_name)) + - strlen("/enabled") + 1 >=3D SYSFS_PATH_MAX) + ret =3D snprintf(path, sizeof(path), "%s/%s/enabled", + PATH_TO_POWERCAP, zone->sys_name); + if (ret >=3D sizeof(path)) return -1; =20 - strcat(path, "/"); - strcat(path, zone->sys_name); - strcat(path, "/enabled"); - return sysfs_get_enabled(path, mode); } =20 @@ -189,22 +186,21 @@ int powercap_read_zone(struct powercap_zone *zone) { struct dirent *dent; DIR *zone_dir; - char sysfs_dir[SYSFS_PATH_MAX] =3D PATH_TO_POWERCAP; + char sysfs_dir[SYSFS_PATH_MAX]; struct powercap_zone *child_zone; - char file[SYSFS_PATH_MAX] =3D PATH_TO_POWERCAP; + char file[SYSFS_PATH_MAX]; int i, ret =3D 0; uint64_t val =3D 0; =20 - strcat(sysfs_dir, "/"); - strcat(sysfs_dir, zone->sys_name); + snprintf(sysfs_dir, sizeof(sysfs_dir), "%s/%s", + PATH_TO_POWERCAP, zone->sys_name); =20 zone_dir =3D opendir(sysfs_dir); if (zone_dir =3D=3D NULL) return -1; =20 - strcat(file, "/"); - strcat(file, zone->sys_name); - strcat(file, "/name"); + snprintf(file, sizeof(file), "%s/%s/name", + PATH_TO_POWERCAP, zone->sys_name); sysfs_read_file(file, zone->name, MAX_LINE_LEN); if (zone->parent) zone->tree_depth =3D zone->parent->tree_depth + 1; @@ -243,9 +239,8 @@ int powercap_read_zone(struct powercap_zone *zone) return -1; } } - strcpy(child_zone->sys_name, zone->sys_name); - strcat(child_zone->sys_name, "/"); - strcat(child_zone->sys_name, dent->d_name); + snprintf(child_zone->sys_name, sizeof(child_zone->sys_name), + "%s/%s", zone->sys_name, dent->d_name); child_zone->parent =3D zone; if (zone->tree_depth >=3D POWERCAP_MAX_TREE_DEPTH) { fprintf(stderr, "Maximum zone hierarchy depth[%d] reached\n", @@ -278,7 +273,8 @@ struct powercap_zone *powercap_init_zones(void) if (!root_zone) return NULL; =20 - strcpy(root_zone->sys_name, "intel-rapl/intel-rapl:0"); + snprintf(root_zone->sys_name, sizeof(root_zone->sys_name), + "intel-rapl/intel-rapl:0"); =20 powercap_read_zone(root_zone); =20 --=20 2.43.0