lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250716123916.511889-4-bhupesh@igalia.com>
Date: Wed, 16 Jul 2025 18:09:16 +0530
From: Bhupesh <bhupesh@...lia.com>
To: akpm@...ux-foundation.org
Cc: bhupesh@...lia.com,
	kernel-dev@...lia.com,
	linux-kernel@...r.kernel.org,
	bpf@...r.kernel.org,
	linux-perf-users@...r.kernel.org,
	linux-fsdevel@...r.kernel.org,
	linux-mm@...ck.org,
	oliver.sang@...el.com,
	lkp@...el.com,
	laoar.shao@...il.com,
	pmladek@...e.com,
	rostedt@...dmis.org,
	mathieu.desnoyers@...icios.com,
	arnaldo.melo@...il.com,
	alexei.starovoitov@...il.com,
	andrii.nakryiko@...il.com,
	mirq-linux@...e.qmqm.pl,
	peterz@...radead.org,
	willy@...radead.org,
	david@...hat.com,
	viro@...iv.linux.org.uk,
	keescook@...omium.org,
	ebiederm@...ssion.com,
	brauner@...nel.org,
	jack@...e.cz,
	mingo@...hat.com,
	juri.lelli@...hat.com,
	bsegall@...gle.com,
	mgorman@...e.de,
	vschneid@...hat.com,
	linux-trace-kernel@...r.kernel.org,
	kees@...nel.org,
	torvalds@...ux-foundation.org
Subject: [PATCH v5 3/3] treewide: Switch from tsk->comm to tsk->comm_str which is 64 bytes long

Historically due to the 16-byte length of TASK_COMM_LEN, the
users of 'tsk->comm' are restricted to use a fixed-size target
buffer also of TASK_COMM_LEN for 'memcpy()' like use-cases.

To fix the same, Kees suggested in [1] that we can replace tsk->comm,
with tsk->comm_str, inside 'task_struct':
       union {
               char    comm_str[TASK_COMM_EXT_LEN];
       };

where TASK_COMM_EXT_LEN is 64-bytes.

And then modify 'get_task_comm()' to pass 'tsk->comm_str'
to the existing users.

This would mean that ABI is maintained while ensuring that:

- Existing users of 'get_task_comm'/ 'set_task_comm' will get 'tsk->comm_str'
  truncated to a maximum of 'TASK_COMM_LEN' (16-bytes) to maintain ABI,
- New / Modified users of 'get_task_comm'/ 'set_task_comm' will get
 'tsk->comm_str' supported for a maximum of 'TASK_COMM_EXTLEN' (64-bytes).

Note, that the existing users have not been modified to migrate to
'TASK_COMM_EXT_LEN', in case they have hard-coded expectations of
dealing with only a 'TASK_COMM_LEN' long 'tsk->comm_str'.

[1]. https://lore.kernel.org/all/202505231346.52F291C54@keescook/

Signed-off-by: Bhupesh <bhupesh@...lia.com>
---
 arch/arm64/kernel/traps.c        |  2 +-
 arch/arm64/kvm/mmu.c             |  2 +-
 block/blk-core.c                 |  2 +-
 block/bsg.c                      |  2 +-
 drivers/char/random.c            |  2 +-
 drivers/hid/hid-core.c           |  6 +++---
 drivers/mmc/host/tmio_mmc_core.c |  6 +++---
 drivers/pci/pci-sysfs.c          |  2 +-
 drivers/scsi/scsi_ioctl.c        |  2 +-
 drivers/tty/serial/serial_core.c |  2 +-
 drivers/tty/tty_io.c             |  8 ++++----
 drivers/usb/core/devio.c         | 16 ++++++++--------
 drivers/usb/core/message.c       |  2 +-
 drivers/vfio/group.c             |  2 +-
 drivers/vfio/vfio_iommu_type1.c  |  2 +-
 drivers/vfio/vfio_main.c         |  2 +-
 drivers/xen/evtchn.c             |  2 +-
 drivers/xen/grant-table.c        |  2 +-
 fs/binfmt_elf.c                  |  2 +-
 fs/coredump.c                    |  4 ++--
 fs/drop_caches.c                 |  2 +-
 fs/exec.c                        |  8 ++++----
 fs/ext4/dir.c                    |  2 +-
 fs/ext4/inode.c                  |  2 +-
 fs/ext4/namei.c                  |  2 +-
 fs/ext4/super.c                  | 12 ++++++------
 fs/hugetlbfs/inode.c             |  2 +-
 fs/ioctl.c                       |  2 +-
 fs/iomap/direct-io.c             |  2 +-
 fs/jbd2/transaction.c            |  2 +-
 fs/locks.c                       |  2 +-
 fs/netfs/internal.h              |  2 +-
 fs/proc/base.c                   |  2 +-
 fs/read_write.c                  |  2 +-
 fs/splice.c                      |  2 +-
 include/linux/coredump.h         |  2 +-
 include/linux/filter.h           |  2 +-
 include/linux/ratelimit.h        |  2 +-
 include/linux/sched.h            | 11 ++++++++---
 init/init_task.c                 |  2 +-
 ipc/sem.c                        |  2 +-
 kernel/acct.c                    |  2 +-
 kernel/audit.c                   |  4 ++--
 kernel/auditsc.c                 | 10 +++++-----
 kernel/bpf/helpers.c             |  2 +-
 kernel/capability.c              |  4 ++--
 kernel/cgroup/cgroup-v1.c        |  2 +-
 kernel/cred.c                    |  4 ++--
 kernel/events/core.c             |  2 +-
 kernel/exit.c                    |  6 +++---
 kernel/fork.c                    |  9 +++++++--
 kernel/freezer.c                 |  4 ++--
 kernel/futex/waitwake.c          |  2 +-
 kernel/hung_task.c               | 10 +++++-----
 kernel/irq/manage.c              |  2 +-
 kernel/kthread.c                 |  2 +-
 kernel/locking/rtmutex.c         |  2 +-
 kernel/printk/printk.c           |  2 +-
 kernel/sched/core.c              | 22 +++++++++++-----------
 kernel/sched/debug.c             |  4 ++--
 kernel/signal.c                  |  6 +++---
 kernel/sys.c                     |  6 +++---
 kernel/sysctl.c                  |  2 +-
 kernel/time/itimer.c             |  4 ++--
 kernel/time/posix-cpu-timers.c   |  2 +-
 kernel/tsacct.c                  |  2 +-
 kernel/workqueue.c               |  6 +++---
 lib/dump_stack.c                 |  2 +-
 lib/nlattr.c                     |  6 +++---
 mm/compaction.c                  |  2 +-
 mm/filemap.c                     |  4 ++--
 mm/gup.c                         |  2 +-
 mm/memfd.c                       |  2 +-
 mm/memory-failure.c              | 10 +++++-----
 mm/memory.c                      |  2 +-
 mm/mmap.c                        |  4 ++--
 mm/oom_kill.c                    | 18 +++++++++---------
 mm/page_alloc.c                  |  4 ++--
 mm/util.c                        |  2 +-
 net/core/sock.c                  |  2 +-
 net/dns_resolver/internal.h      |  2 +-
 net/ipv4/raw.c                   |  2 +-
 net/ipv4/tcp.c                   |  2 +-
 net/socket.c                     |  2 +-
 security/lsm_audit.c             |  4 ++--
 85 files changed, 171 insertions(+), 161 deletions(-)

diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index bed754b736d3..689c2b145fa1 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -245,7 +245,7 @@ static void arm64_show_signal(int signo, const char *str)
 	    !__ratelimit(&rs))
 		return;
 
-	pr_info("%s[%d]: unhandled exception: ", tsk->comm, task_pid_nr(tsk));
+	pr_info("%s[%d]: unhandled exception: ", tsk->comm_str, task_pid_nr(tsk));
 	if (esr)
 		pr_cont("%s, ESR 0x%016lx, ", esr_get_class_string(esr), esr);
 
diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
index 1c78864767c5..c86ab5ae4532 100644
--- a/arch/arm64/kvm/mmu.c
+++ b/arch/arm64/kvm/mmu.c
@@ -891,7 +891,7 @@ static int kvm_init_ipa_range(struct kvm_s2_mmu *mmu, unsigned long type)
 		phys_shift = KVM_PHYS_SHIFT;
 		if (phys_shift > kvm_ipa_limit) {
 			pr_warn_once("%s using unsupported default IPA limit, upgrade your VMM\n",
-				     current->comm);
+				     current->comm_str);
 			return -EINVAL;
 		}
 	}
diff --git a/block/blk-core.c b/block/blk-core.c
index fdac48aec5ef..f93e2a1676b6 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -562,7 +562,7 @@ static inline int bio_check_eod(struct bio *bio)
 	     bio->bi_iter.bi_sector > maxsector - nr_sectors)) {
 		pr_info_ratelimited("%s: attempt to access beyond end of device\n"
 				    "%pg: rw=%d, sector=%llu, nr_sectors = %u limit=%llu\n",
-				    current->comm, bio->bi_bdev, bio->bi_opf,
+				    current->comm_str, bio->bi_bdev, bio->bi_opf,
 				    bio->bi_iter.bi_sector, nr_sectors, maxsector);
 		return -EIO;
 	}
diff --git a/block/bsg.c b/block/bsg.c
index 72157a59b788..1f348e798cfa 100644
--- a/block/bsg.c
+++ b/block/bsg.c
@@ -151,7 +151,7 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 		return bsg_sg_io(bd, file->f_mode & FMODE_WRITE, uarg);
 	case SCSI_IOCTL_SEND_COMMAND:
 		pr_warn_ratelimited("%s: calling unsupported SCSI_IOCTL_SEND_COMMAND\n",
-				current->comm);
+				current->comm_str);
 		return -EINVAL;
 	default:
 		return -ENOTTY;
diff --git a/drivers/char/random.c b/drivers/char/random.c
index d45383d57919..6f28a4d9af4a 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1477,7 +1477,7 @@ static ssize_t urandom_read_iter(struct kiocb *kiocb, struct iov_iter *iter)
 		else if (ratelimit_disable || __ratelimit(&urandom_warning)) {
 			--maxwarn;
 			pr_notice("%s: uninitialized urandom read (%zu bytes read)\n",
-				  current->comm, iov_iter_count(iter));
+				  current->comm_str, iov_iter_count(iter));
 		}
 	}
 
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 2930d6e23d40..f5b75c5837ff 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1405,7 +1405,7 @@ u32 hid_field_extract(const struct hid_device *hid, u8 *report,
 {
 	if (n > 32) {
 		hid_warn_once(hid, "%s() called with n (%d) > 32! (%s)\n",
-			      __func__, n, current->comm);
+			      __func__, n, current->comm_str);
 		n = 32;
 	}
 
@@ -1451,7 +1451,7 @@ static void implement(const struct hid_device *hid, u8 *report,
 {
 	if (unlikely(n > 32)) {
 		hid_warn(hid, "%s() called with n (%d) > 32! (%s)\n",
-			 __func__, n, current->comm);
+			 __func__, n, current->comm_str);
 		n = 32;
 	} else if (n < 32) {
 		u32 m = (1U << n) - 1;
@@ -1459,7 +1459,7 @@ static void implement(const struct hid_device *hid, u8 *report,
 		if (unlikely(value > m)) {
 			hid_warn(hid,
 				 "%s() called with too large value %d (n: %d)! (%s)\n",
-				 __func__, value, n, current->comm);
+				 __func__, value, n, current->comm_str);
 			value &= m;
 		}
 	}
diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c
index 21c2f9095bac..aa083b919532 100644
--- a/drivers/mmc/host/tmio_mmc_core.c
+++ b/drivers/mmc/host/tmio_mmc_core.c
@@ -951,13 +951,13 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 		if (IS_ERR(host->mrq)) {
 			dev_dbg(dev,
 				"%s.%d: concurrent .set_ios(), clk %u, mode %u\n",
-				current->comm, task_pid_nr(current),
+				current->comm_str, task_pid_nr(current),
 				ios->clock, ios->power_mode);
 			host->mrq = ERR_PTR(-EINTR);
 		} else {
 			dev_dbg(dev,
 				"%s.%d: CMD%u active since %lu, now %lu!\n",
-				current->comm, task_pid_nr(current),
+				current->comm_str, task_pid_nr(current),
 				host->mrq->cmd->opcode, host->last_req_ts,
 				jiffies);
 		}
@@ -1000,7 +1000,7 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 	if (PTR_ERR(host->mrq) == -EINTR)
 		dev_dbg(&host->pdev->dev,
 			"%s.%d: IOS interrupted: clk %u, mode %u",
-			current->comm, task_pid_nr(current),
+			current->comm_str, task_pid_nr(current),
 			ios->clock, ios->power_mode);
 
 	/* Ready for new mrqs */
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index 5eea14c1f7f5..a59458f1b091 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -786,7 +786,7 @@ static ssize_t pci_write_config(struct file *filp, struct kobject *kobj,
 	if (resource_is_exclusive(&dev->driver_exclusive_resource, off,
 				  count)) {
 		pci_warn_once(dev, "%s: Unexpected write to kernel-exclusive config offset %llx",
-			      current->comm, off);
+			      current->comm_str, off);
 		add_taint(TAINT_USER, LOCKDEP_STILL_OK);
 	}
 
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c
index 0ddc95bafc71..4afeee7e9dec 100644
--- a/drivers/scsi/scsi_ioctl.c
+++ b/drivers/scsi/scsi_ioctl.c
@@ -894,7 +894,7 @@ int scsi_ioctl(struct scsi_device *sdev, bool open_for_write, int cmd,
 	case SCSI_IOCTL_START_UNIT:
 	case SCSI_IOCTL_STOP_UNIT:
 		printk(KERN_WARNING "program %s is using a deprecated SCSI "
-		       "ioctl, please convert it to SG_IO\n", current->comm);
+		       "ioctl, please convert it to SG_IO\n", current->comm_str);
 		break;
 	default:
 		break;
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 86d404d649a3..66beaa8de571 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1017,7 +1017,7 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
 			if (uport->flags & UPF_SPD_MASK) {
 				dev_notice_ratelimited(uport->dev,
 				       "%s sets custom speed on %s. This is deprecated.\n",
-				      current->comm,
+				      current->comm_str,
 				      tty_name(port->tty));
 			}
 			uart_change_line_settings(tty, state, NULL);
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index e2d92cf70eb7..d354b0d986e7 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -2618,7 +2618,7 @@ static int tty_set_serial(struct tty_struct *tty, struct serial_struct *ss)
 
 	if (flags)
 		pr_warn_ratelimited("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
-				__func__, current->comm, flags);
+				__func__, current->comm_str, flags);
 
 	if (!tty->ops->set_serial)
 		return -ENOTTY;
@@ -3030,7 +3030,7 @@ void __do_SAK(struct tty_struct *tty)
 	/* Kill the entire session */
 	do_each_pid_task(session, PIDTYPE_SID, p) {
 		tty_notice(tty, "SAK: killed process %d (%s): by session\n",
-			   task_pid_nr(p), p->comm);
+			   task_pid_nr(p), p->comm_str);
 		group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_SID);
 	} while_each_pid_task(session, PIDTYPE_SID, p);
 
@@ -3038,7 +3038,7 @@ void __do_SAK(struct tty_struct *tty)
 	for_each_process_thread(g, p) {
 		if (p->signal->tty == tty) {
 			tty_notice(tty, "SAK: killed process %d (%s): by controlling tty\n",
-				   task_pid_nr(p), p->comm);
+				   task_pid_nr(p), p->comm_str);
 			group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p,
 					PIDTYPE_SID);
 			continue;
@@ -3047,7 +3047,7 @@ void __do_SAK(struct tty_struct *tty)
 		i = iterate_fd(p->files, 0, this_tty, tty);
 		if (i != 0) {
 			tty_notice(tty, "SAK: killed process %d (%s): by fd#%d\n",
-				   task_pid_nr(p), p->comm, i - 1);
+				   task_pid_nr(p), p->comm_str, i - 1);
 			group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p,
 					PIDTYPE_SID);
 		}
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index f6ce6e26e0d4..663e752aaa7c 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -849,7 +849,7 @@ static int checkintf(struct usb_dev_state *ps, unsigned int ifnum)
 	/* if not yet claimed, claim it for the driver */
 	dev_warn(&ps->dev->dev, "usbfs: process %d (%s) did not claim "
 		 "interface %u before use\n", task_pid_nr(current),
-		 current->comm, ifnum);
+		 current->comm_str, ifnum);
 	return claimintf(ps, ifnum);
 }
 
@@ -924,7 +924,7 @@ static int check_ctrlrecip(struct usb_dev_state *ps, unsigned int requesttype,
 				dev_info(&ps->dev->dev,
 					"%s: process %i (%s) requesting ep %02x but needs %02x\n",
 					__func__, task_pid_nr(current),
-					current->comm, index, index ^ 0x80);
+					current->comm_str, index, index ^ 0x80);
 		}
 		if (ret >= 0)
 			ret = checkintf(ps, ret);
@@ -1078,7 +1078,7 @@ static int usbdev_open(struct inode *inode, struct file *file)
 	file->private_data = ps;
 	usb_unlock_device(dev);
 	snoop(&dev->dev, "opened by process %d: %s\n", task_pid_nr(current),
-			current->comm);
+			current->comm_str);
 	return ret;
 
  out_unlock_device:
@@ -1257,7 +1257,7 @@ static int do_proc_control(struct usb_dev_state *ps,
 	if (i < 0 && i != -EPIPE) {
 		dev_printk(KERN_DEBUG, &dev->dev, "usbfs: USBDEVFS_CONTROL "
 			   "failed cmd %s rqt %u rq %u len %u ret %d\n",
-			   current->comm, ctrl->bRequestType, ctrl->bRequest,
+			   current->comm_str, ctrl->bRequestType, ctrl->bRequest,
 			   ctrl->wLength, i);
 	}
 	ret = (i < 0 ? i : actlen);
@@ -1389,7 +1389,7 @@ static void check_reset_of_active_ep(struct usb_device *udev,
 	ep = eps[epnum & 0x0f];
 	if (ep && !list_empty(&ep->urb_list))
 		dev_warn(&udev->dev, "Process %d (%s) called USBDEVFS_%s for active endpoint 0x%02x\n",
-				task_pid_nr(current), current->comm,
+				task_pid_nr(current), current->comm_str,
 				ioctl_name, epnum);
 }
 
@@ -1517,7 +1517,7 @@ static int proc_resetdevice(struct usb_dev_state *ps)
 					!test_bit(number, &ps->ifclaimed)) {
 				dev_warn(&ps->dev->dev,
 					"usbfs: interface %d claimed by %s while '%s' resets device\n",
-					number,	interface->dev.driver->name, current->comm);
+					number,	interface->dev.driver->name, current->comm_str);
 				return -EACCES;
 			}
 		}
@@ -1571,7 +1571,7 @@ static int proc_setconfig(struct usb_dev_state *ps, void __user *arg)
 						->desc.bInterfaceNumber,
 					actconfig->interface[i]
 						->dev.driver->name,
-					current->comm, u);
+					current->comm_str, u);
 				status = -EBUSY;
 				break;
 			}
@@ -2428,7 +2428,7 @@ static int proc_claim_port(struct usb_dev_state *ps, void __user *arg)
 	rc = usb_hub_claim_port(ps->dev, portnum, ps);
 	if (rc == 0)
 		snoop(&ps->dev->dev, "port %d claimed by process %d: %s\n",
-			portnum, task_pid_nr(current), current->comm);
+			portnum, task_pid_nr(current), current->comm_str);
 	return rc;
 }
 
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index d2b2787be409..d33e8881281c 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -67,7 +67,7 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length)
 
 		dev_dbg(&urb->dev->dev,
 			"%s timed out on ep%d%s len=%u/%u\n",
-			current->comm,
+			current->comm_str,
 			usb_endpoint_num(&urb->ep->desc),
 			usb_urb_dir_in(urb) ? "in" : "out",
 			urb->actual_length,
diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c
index c376a6279de0..991ca92e9eee 100644
--- a/drivers/vfio/group.c
+++ b/drivers/vfio/group.c
@@ -280,7 +280,7 @@ static struct file *vfio_device_open_file(struct vfio_device *device)
 
 	if (device->group->type == VFIO_NO_IOMMU)
 		dev_warn(device->dev, "vfio-noiommu device opened by user "
-			 "(%s:%d)\n", current->comm, task_pid_nr(current));
+			 "(%s:%d)\n", current->comm_str, task_pid_nr(current));
 	/*
 	 * On success the ref of device is moved to the file and
 	 * put in vfio_device_fops_release()
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 1136d7ac6b59..a2d34704f60f 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -778,7 +778,7 @@ static int vfio_pin_page_external(struct vfio_dma *dma, unsigned long vaddr,
 			if (ret == -ENOMEM)
 				pr_warn("%s: Task %s (%d) RLIMIT_MEMLOCK "
 					"(%ld) exceeded\n", __func__,
-					dma->task->comm, task_pid_nr(dma->task),
+					dma->task->comm_str, task_pid_nr(dma->task),
 					task_rlimit(dma->task, RLIMIT_MEMLOCK));
 		}
 	}
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index 5046cae05222..021e41bd7759 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -418,7 +418,7 @@ void vfio_unregister_group_dev(struct vfio_device *device)
 					 "Device is currently in use, task"
 					 " \"%s\" (%d) "
 					 "blocked until device is released",
-					 current->comm, task_pid_nr(current));
+					 current->comm_str, task_pid_nr(current));
 			}
 		}
 	}
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
index 7e4a13e632dc..f51361e1e8e1 100644
--- a/drivers/xen/evtchn.c
+++ b/drivers/xen/evtchn.c
@@ -646,7 +646,7 @@ static int evtchn_open(struct inode *inode, struct file *filp)
 	if (u == NULL)
 		return -ENOMEM;
 
-	u->name = kasprintf(GFP_KERNEL, "evtchn:%s", current->comm);
+	u->name = kasprintf(GFP_KERNEL, "evtchn:%s", current->comm_str);
 	if (u->name == NULL) {
 		kfree(u);
 		return -ENOMEM;
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 04a6b470b15d..6958ce227c4f 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -1163,7 +1163,7 @@ gnttab_retry_eagain_gop(unsigned int cmd, void *gop, int16_t *status,
 	} while ((*status == GNTST_eagain) && (delay < MAX_DELAY));
 
 	if (delay >= MAX_DELAY) {
-		pr_err("%s: %s eagain grant\n", func, current->comm);
+		pr_err("%s: %s eagain grant\n", func, current->comm_str);
 		*status = GNTST_bad_page;
 	}
 }
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index ea3e184cd2e3..e304d19c72e1 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -386,7 +386,7 @@ static unsigned long elf_map(struct file *filep, unsigned long addr,
 	if ((type & MAP_FIXED_NOREPLACE) &&
 	    PTR_ERR((void *)map_addr) == -EEXIST)
 		pr_info("%d (%s): Uhuuh, elf segment at %px requested but the memory is mapped already\n",
-			task_pid_nr(current), current->comm, (void *)addr);
+			task_pid_nr(current), current->comm_str, (void *)addr);
 
 	return(map_addr);
 }
diff --git a/fs/coredump.c b/fs/coredump.c
index f88deb4701ac..0ea4bd2403a8 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -200,7 +200,7 @@ static int cn_print_exe_file(struct core_name *cn, bool name_only)
 
 	exe_file = get_mm_exe_file(current->mm);
 	if (!exe_file)
-		return cn_esc_printf(cn, "%s (path unknown)", current->comm);
+		return cn_esc_printf(cn, "%s (path unknown)", current->comm_str);
 
 	pathbuf = kmalloc(PATH_MAX, GFP_KERNEL);
 	if (!pathbuf) {
@@ -417,7 +417,7 @@ static bool coredump_parse(struct core_name *cn, struct coredump_params *cprm,
 				break;
 			/* executable, could be changed by prctl PR_SET_NAME etc */
 			case 'e':
-				err = cn_esc_printf(cn, "%s", current->comm);
+				err = cn_esc_printf(cn, "%s", current->comm_str);
 				break;
 			/* file name of executable */
 			case 'f':
diff --git a/fs/drop_caches.c b/fs/drop_caches.c
index 019a8b4eaaf9..dbd3f2366028 100644
--- a/fs/drop_caches.c
+++ b/fs/drop_caches.c
@@ -70,7 +70,7 @@ static int drop_caches_sysctl_handler(const struct ctl_table *table, int write,
 		}
 		if (!stfu) {
 			pr_info("%s (%d): drop_caches: %d\n",
-				current->comm, task_pid_nr(current),
+				current->comm_str, task_pid_nr(current),
 				sysctl_drop_caches);
 		}
 		stfu |= sysctl_drop_caches & 4;
diff --git a/fs/exec.c b/fs/exec.c
index 2a1e5e4042a1..80c92fadb367 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1082,11 +1082,11 @@ static int unshare_sighand(struct task_struct *me)
  */
 void __set_task_comm(struct task_struct *tsk, const char *buf, bool exec)
 {
-	size_t len = min(strlen(buf), sizeof(tsk->comm) - 1);
+	size_t len = min(strlen(buf), sizeof(tsk->comm_str) - 1);
 
 	trace_task_rename(tsk, buf);
-	memcpy(tsk->comm, buf, len);
-	memset(&tsk->comm[len], 0, sizeof(tsk->comm) - len);
+	memcpy(tsk->comm_str, buf, len);
+	memset(&tsk->comm_str[len], 0, sizeof(tsk->comm_str) - len);
 	perf_event_comm(tsk, exec);
 }
 
@@ -1854,7 +1854,7 @@ static int do_execveat_common(int fd, struct filename *filename,
 		bprm->argc = 1;
 
 		pr_warn_once("process '%s' launched '%s' with NULL argv: empty string added\n",
-			     current->comm, bprm->filename);
+			     current->comm_str, bprm->filename);
 	}
 
 	retval = bprm_execve(bprm);
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
index d4164c507a90..5636a53b061e 100644
--- a/fs/ext4/dir.c
+++ b/fs/ext4/dir.c
@@ -537,7 +537,7 @@ static int call_filldir(struct file *file, struct dir_context *ctx,
 	if (!fname) {
 		ext4_msg(sb, KERN_ERR, "%s:%d: inode #%lu: comm %s: "
 			 "called with null fname?!?", __func__, __LINE__,
-			 inode->i_ino, current->comm);
+			 inode->i_ino, current->comm_str);
 		return 0;
 	}
 	ctx->pos = hash2pos(file, fname->hash, fname->minor_hash);
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 01c9b620b3f3..ed6743e660ce 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -5235,7 +5235,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
 			return ERR_PTR(-ESTALE);
 		__ext4_error(sb, function, line, false, EFSCORRUPTED, 0,
 			     "inode #%lu: comm %s: iget: illegal inode #",
-			     ino, current->comm);
+			     ino, current->comm_str);
 		return ERR_PTR(-EFSCORRUPTED);
 	}
 
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index a178ac229489..9e9c95e49587 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -147,7 +147,7 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
 			       "inode #%lu: lblock %lu: comm %s: "
 			       "error %ld reading directory block",
 			       inode->i_ino, (unsigned long)block,
-			       current->comm, PTR_ERR(bh));
+			       current->comm_str, PTR_ERR(bh));
 
 		return bh;
 	}
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index d75b416401ae..a9e4e4898847 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -812,7 +812,7 @@ void __ext4_error(struct super_block *sb, const char *function,
 		vaf.va = &args;
 		printk(KERN_CRIT
 		       "EXT4-fs error (device %s): %s:%d: comm %s: %pV\n",
-		       sb->s_id, function, line, current->comm, &vaf);
+		       sb->s_id, function, line, current->comm_str, &vaf);
 		va_end(args);
 	}
 	fsnotify_sb_error(sb, NULL, error ? error : EFSCORRUPTED);
@@ -839,12 +839,12 @@ void __ext4_error_inode(struct inode *inode, const char *function,
 			printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: "
 			       "inode #%lu: block %llu: comm %s: %pV\n",
 			       inode->i_sb->s_id, function, line, inode->i_ino,
-			       block, current->comm, &vaf);
+			       block, current->comm_str, &vaf);
 		else
 			printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: "
 			       "inode #%lu: comm %s: %pV\n",
 			       inode->i_sb->s_id, function, line, inode->i_ino,
-			       current->comm, &vaf);
+			       current->comm_str, &vaf);
 		va_end(args);
 	}
 	fsnotify_sb_error(inode->i_sb, inode, error ? error : EFSCORRUPTED);
@@ -878,13 +878,13 @@ void __ext4_error_file(struct file *file, const char *function,
 			       "EXT4-fs error (device %s): %s:%d: inode #%lu: "
 			       "block %llu: comm %s: path %s: %pV\n",
 			       inode->i_sb->s_id, function, line, inode->i_ino,
-			       block, current->comm, path, &vaf);
+			       block, current->comm_str, path, &vaf);
 		else
 			printk(KERN_CRIT
 			       "EXT4-fs error (device %s): %s:%d: inode #%lu: "
 			       "comm %s: path %s: %pV\n",
 			       inode->i_sb->s_id, function, line, inode->i_ino,
-			       current->comm, path, &vaf);
+			       current->comm_str, path, &vaf);
 		va_end(args);
 	}
 	fsnotify_sb_error(inode->i_sb, inode, EFSCORRUPTED);
@@ -1022,7 +1022,7 @@ void __ext4_warning_inode(const struct inode *inode, const char *function,
 	vaf.va = &args;
 	printk(KERN_WARNING "EXT4-fs warning (device %s): %s:%d: "
 	       "inode #%lu: comm %s: %pV\n", inode->i_sb->s_id,
-	       function, line, inode->i_ino, current->comm, &vaf);
+	       function, line, inode->i_ino, current->comm_str, &vaf);
 	va_end(args);
 }
 
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 14929fcea52d..d4263c3da019 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -1540,7 +1540,7 @@ struct file *hugetlb_file_setup(const char *name, size_t size,
 
 		if (user_shm_lock(size, ucounts)) {
 			pr_warn_once("%s (%d): Using mlock ulimits for SHM_HUGETLB is obsolete\n",
-				current->comm, current->pid);
+				current->comm_str, current->pid);
 			user_shm_unlock(size, ucounts);
 		}
 		return ERR_PTR(-EPERM);
diff --git a/fs/ioctl.c b/fs/ioctl.c
index 0248cb8db2d3..3c543b581501 100644
--- a/fs/ioctl.c
+++ b/fs/ioctl.c
@@ -79,7 +79,7 @@ static int ioctl_fibmap(struct file *filp, int __user *p)
 	if (block > INT_MAX) {
 		error = -ERANGE;
 		pr_warn_ratelimited("[%s/%d] FS: %s File: %pD4 would truncate fibmap result\n",
-				    current->comm, task_pid_nr(current),
+				    current->comm_str, task_pid_nr(current),
 				    sb->s_id, filp);
 	}
 
diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
index 844261a31156..231a1a904496 100644
--- a/fs/iomap/direct-io.c
+++ b/fs/iomap/direct-io.c
@@ -570,7 +570,7 @@ static int iomap_dio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
 		 * DELALLOC block that the page-mkwrite allocated.
 		 */
 		pr_warn_ratelimited("Direct I/O collision with buffered writes! File: %pD4 Comm: %.20s\n",
-				    dio->iocb->ki_filp, current->comm);
+				    dio->iocb->ki_filp, current->comm_str);
 		return -EIO;
 	default:
 		WARN_ON_ONCE(1);
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index c7867139af69..800c5aa86d49 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -329,7 +329,7 @@ static int start_this_handle(journal_t *journal, handle_t *handle,
 	    rsv_blocks + blocks > jbd2_max_user_trans_buffers(journal)) {
 		printk(KERN_ERR "JBD2: %s wants too many credits "
 		       "credits:%d rsv_credits:%d max:%d\n",
-		       current->comm, blocks, rsv_blocks,
+		       current->comm_str, blocks, rsv_blocks,
 		       jbd2_max_user_trans_buffers(journal));
 		WARN_ON(1);
 		return -ENOSPC;
diff --git a/fs/locks.c b/fs/locks.c
index 559f02aa4172..ba204c8b2316 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -2146,7 +2146,7 @@ SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
 	 * throw a warning to let people know that they don't actually work.
 	 */
 	if (cmd & LOCK_MAND) {
-		pr_warn_once("%s(%d): Attempt to set a LOCK_MAND lock via flock(2). This support has been removed and the request ignored.\n", current->comm, current->pid);
+		pr_warn_once("%s(%d): Attempt to set a LOCK_MAND lock via flock(2). This support has been removed and the request ignored.\n", current->comm_str, current->pid);
 		return 0;
 	}
 
diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h
index d4f16fefd965..2988d5cf3c88 100644
--- a/fs/netfs/internal.h
+++ b/fs/netfs/internal.h
@@ -443,7 +443,7 @@ void fscache_create_volume(struct fscache_volume *volume, bool wait);
  * debug tracing
  */
 #define dbgprintk(FMT, ...) \
-	printk("[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
+	printk("[%-6.6s] "FMT"\n", current->comm_str, ##__VA_ARGS__)
 
 #define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
 #define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
diff --git a/fs/proc/base.c b/fs/proc/base.c
index e93149a01341..7f05e8b8f09a 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1144,7 +1144,7 @@ static int __set_oom_adj(struct file *file, int oom_adj, bool legacy)
 		 * /proc/pid/oom_score_adj instead.
 		 */
 		pr_warn_once("%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n",
-			  current->comm, task_pid_nr(current), task_pid_nr(task),
+			  current->comm_str, task_pid_nr(current), task_pid_nr(task),
 			  task_pid_nr(task));
 	} else {
 		if ((short)oom_adj < task->signal->oom_score_adj_min &&
diff --git a/fs/read_write.c b/fs/read_write.c
index c5b6265d984b..5cb15fa8a3ed 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -499,7 +499,7 @@ static int warn_unsupported(struct file *file, const char *op)
 {
 	pr_warn_ratelimited(
 		"kernel %s not supported for file %pD4 (pid: %d comm: %.20s)\n",
-		op, file, current->pid, current->comm);
+		op, file, current->pid, current->comm_str);
 	return -EINVAL;
 }
 
diff --git a/fs/splice.c b/fs/splice.c
index 4d6df083e0c0..b02395d5921f 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -920,7 +920,7 @@ static int warn_unsupported(struct file *file, const char *op)
 {
 	pr_debug_ratelimited(
 		"splice %s not supported for file %pD4 (pid: %d comm: %.20s)\n",
-		op, file, current->pid, current->comm);
+		op, file, current->pid, current->comm_str);
 	return -EINVAL;
 }
 
diff --git a/include/linux/coredump.h b/include/linux/coredump.h
index 988b233dcc09..a53e5fe41b05 100644
--- a/include/linux/coredump.h
+++ b/include/linux/coredump.h
@@ -54,7 +54,7 @@ extern void vfs_coredump(const kernel_siginfo_t *siginfo);
 	do {	\
 		char comm[TASK_COMM_LEN];	\
 		/* This will always be NUL terminated. */ \
-		memcpy(comm, current->comm, TASK_COMM_LEN); \
+		memcpy(comm, current->comm_str, TASK_COMM_LEN); \
 		comm[TASK_COMM_LEN - 1] = '\0'; \
 		printk_ratelimited(Level "coredump: %d(%*pE): " Format "\n",	\
 			task_tgid_vnr(current), (int)strlen(comm), comm, ##__VA_ARGS__);	\
diff --git a/include/linux/filter.h b/include/linux/filter.h
index eca229752cbe..2ae63a4c54c8 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -1285,7 +1285,7 @@ static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen,
 				u32 pass, void *image)
 {
 	pr_err("flen=%u proglen=%u pass=%u image=%pK from=%s pid=%d\n", flen,
-	       proglen, pass, image, current->comm, task_pid_nr(current));
+	       proglen, pass, image, current->comm_str, task_pid_nr(current));
 
 	if (image)
 		print_hex_dump(KERN_ERR, "JIT code: ", DUMP_PREFIX_OFFSET,
diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h
index 7aaad158ee37..751cd81867ef 100644
--- a/include/linux/ratelimit.h
+++ b/include/linux/ratelimit.h
@@ -58,7 +58,7 @@ static inline void ratelimit_state_exit(struct ratelimit_state *rs)
 
 	m = ratelimit_state_reset_miss(rs);
 	if (m)
-		pr_warn("%s: %d output lines suppressed due to ratelimiting\n", current->comm, m);
+		pr_warn("%s: %d output lines suppressed due to ratelimiting\n", current->comm_str, m);
 }
 
 static inline void
diff --git a/include/linux/sched.h b/include/linux/sched.h
index a4a23267a982..1cdfb024173e 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -316,6 +316,7 @@ struct user_event_mm;
  */
 enum {
 	TASK_COMM_LEN = 16,
+	TASK_COMM_EXT_LEN = 64,
 };
 
 extern void sched_tick(void);
@@ -1158,7 +1159,7 @@ struct task_struct {
 	 *   - logic inside set_task_comm() will ensure it is always NUL-terminated and
 	 *     zero-padded
 	 */
-	char				comm[TASK_COMM_LEN];
+	char				comm_str[TASK_COMM_EXT_LEN];
 
 	struct nameidata		*nameidata;
 
@@ -1941,7 +1942,7 @@ extern void kick_process(struct task_struct *tsk);
 
 extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec);
 #define set_task_comm(tsk, from) ({			\
-	BUILD_BUG_ON(sizeof(from) != TASK_COMM_LEN);	\
+	BUILD_BUG_ON(sizeof(from) < TASK_COMM_LEN);	\
 	__set_task_comm(tsk, from, false);		\
 })
 
@@ -1960,7 +1961,11 @@ extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec
  */
 #define get_task_comm(buf, tsk) ({			\
 	BUILD_BUG_ON(sizeof(buf) < TASK_COMM_LEN);	\
-	strscpy_pad(buf, (tsk)->comm);			\
+	strscpy_pad(buf, (tsk)->comm_str);		\
+	if ((sizeof(buf)) == TASK_COMM_LEN)		\
+		buf[TASK_COMM_LEN - 1] = '\0';		\
+	else						\
+		buf[TASK_COMM_EXT_LEN - 1] = '\0';	\
 	buf;						\
 })
 
diff --git a/init/init_task.c b/init/init_task.c
index e557f622bd90..afb815189efc 100644
--- a/init/init_task.c
+++ b/init/init_task.c
@@ -121,7 +121,7 @@ struct task_struct init_task __aligned(L1_CACHE_BYTES) = {
 	.group_leader	= &init_task,
 	RCU_POINTER_INITIALIZER(real_cred, &init_cred),
 	RCU_POINTER_INITIALIZER(cred, &init_cred),
-	.comm		= INIT_TASK_COMM,
+	.comm_str	= INIT_TASK_COMM,
 	.thread		= INIT_THREAD,
 	.fs		= &init_fs,
 	.files		= &init_files,
diff --git a/ipc/sem.c b/ipc/sem.c
index a39cdc7bf88f..764d03a43f6c 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -1083,7 +1083,7 @@ static int check_qop(struct sem_array *sma, int semnum, struct sem_queue *q,
 	 */
 	pr_info_once("semctl(GETNCNT/GETZCNT) is since 3.16 Single Unix Specification compliant.\n"
 			"The task %s (%d) triggered the difference, watch for misbehavior.\n",
-			current->comm, task_pid_nr(current));
+			current->comm_str, task_pid_nr(current));
 
 	if (sop->sem_num != semnum)
 		return 0;
diff --git a/kernel/acct.c b/kernel/acct.c
index 6520baa13669..2e4a029d97c9 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -481,7 +481,7 @@ static void fill_ac(struct bsd_acct_struct *acct)
 	memset(ac, 0, sizeof(acct_t));
 
 	ac->ac_version = ACCT_VERSION | ACCT_BYTEORDER;
-	strscpy(ac->ac_comm, current->comm, sizeof(ac->ac_comm));
+	strscpy(ac->ac_comm, current->comm_str, sizeof(ac->ac_comm));
 
 	/* calculate run_time in nsec*/
 	run_time = ktime_get_ns();
diff --git a/kernel/audit.c b/kernel/audit.c
index 61b5744d0bb6..cdead92ab251 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -1600,7 +1600,7 @@ static void audit_log_multicast(int group, const char *op, int err)
 {
 	const struct cred *cred;
 	struct tty_struct *tty;
-	char comm[sizeof(current->comm)];
+	char comm[sizeof(current->comm_str)];
 	struct audit_buffer *ab;
 
 	if (!audit_enabled)
@@ -2243,7 +2243,7 @@ void audit_put_tty(struct tty_struct *tty)
 void audit_log_task_info(struct audit_buffer *ab)
 {
 	const struct cred *cred;
-	char comm[sizeof(current->comm)];
+	char comm[sizeof(current->comm_str)];
 	struct tty_struct *tty;
 
 	if (!ab)
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index eb98cd6fe91f..89e7e972049e 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -2723,7 +2723,7 @@ void __audit_ptrace(struct task_struct *t)
 	context->target_auid = audit_get_loginuid(t);
 	context->target_uid = task_uid(t);
 	context->target_sessionid = audit_get_sessionid(t);
-	strscpy(context->target_comm, t->comm);
+	strscpy(context->target_comm, t->comm_str);
 	security_task_getlsmprop_obj(t, &context->target_ref);
 }
 
@@ -2750,7 +2750,7 @@ int audit_signal_info_syscall(struct task_struct *t)
 		ctx->target_auid = audit_get_loginuid(t);
 		ctx->target_uid = t_uid;
 		ctx->target_sessionid = audit_get_sessionid(t);
-		strscpy(ctx->target_comm, t->comm);
+		strscpy(ctx->target_comm, t->comm_str);
 		security_task_getlsmprop_obj(t, &ctx->target_ref);
 		return 0;
 	}
@@ -2772,7 +2772,7 @@ int audit_signal_info_syscall(struct task_struct *t)
 	axp->target_uid[axp->pid_count] = t_uid;
 	axp->target_sessionid[axp->pid_count] = audit_get_sessionid(t);
 	security_task_getlsmprop_obj(t, &axp->target_ref[axp->pid_count]);
-	strscpy(axp->target_comm[axp->pid_count], t->comm);
+	strscpy(axp->target_comm[axp->pid_count], t->comm_str);
 	axp->pid_count++;
 
 	return 0;
@@ -2919,7 +2919,7 @@ void __audit_log_nfcfg(const char *name, u8 af, unsigned int nentries,
 		       enum audit_nfcfgop op, gfp_t gfp)
 {
 	struct audit_buffer *ab;
-	char comm[sizeof(current->comm)];
+	char comm[sizeof(current->comm_str)];
 
 	ab = audit_log_start(audit_context(), gfp, AUDIT_NETFILTER_CFG);
 	if (!ab)
@@ -2940,7 +2940,7 @@ static void audit_log_task(struct audit_buffer *ab)
 	kuid_t auid, uid;
 	kgid_t gid;
 	unsigned int sessionid;
-	char comm[sizeof(current->comm)];
+	char comm[sizeof(current->comm_str)];
 
 	auid = audit_get_loginuid(current);
 	sessionid = audit_get_sessionid(current);
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index 6b4877e85a68..9c3e48f1348f 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c
@@ -266,7 +266,7 @@ BPF_CALL_2(bpf_get_current_comm, char *, buf, u32, size)
 		goto err_clear;
 
 	/* Verifier guarantees that size > 0 */
-	strscpy_pad(buf, task->comm, size);
+	strscpy_pad(buf, task->comm_str, size);
 	return 0;
 err_clear:
 	memset(buf, 0, size);
diff --git a/kernel/capability.c b/kernel/capability.c
index 829f49ae07b9..73f945dadb58 100644
--- a/kernel/capability.c
+++ b/kernel/capability.c
@@ -39,7 +39,7 @@ __setup("no_file_caps", file_caps_disable);
 static void warn_legacy_capability_use(void)
 {
 	pr_info_once("warning: `%s' uses 32-bit capabilities (legacy support in use)\n",
-		     current->comm);
+		     current->comm_str);
 }
 
 /*
@@ -61,7 +61,7 @@ static void warn_legacy_capability_use(void)
 static void warn_deprecated_v2(void)
 {
 	pr_info_once("warning: `%s' uses deprecated v2 capabilities in a way that may be insecure\n",
-		     current->comm);
+		     current->comm_str);
 }
 
 /*
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index fa24c032ed6f..05e6a54d710f 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -1101,7 +1101,7 @@ int cgroup1_reconfigure(struct fs_context *fc)
 
 	if (ctx->subsys_mask != root->subsys_mask || ctx->release_agent)
 		pr_warn("option changes via remount are deprecated (pid=%d comm=%s)\n",
-			task_tgid_nr(current), current->comm);
+			task_tgid_nr(current), current->comm_str);
 
 	added_mask = ctx->subsys_mask & ~root->subsys_mask;
 	removed_mask = root->subsys_mask & ~ctx->subsys_mask;
diff --git a/kernel/cred.c b/kernel/cred.c
index 9676965c0981..2e5e9a60aee0 100644
--- a/kernel/cred.c
+++ b/kernel/cred.c
@@ -23,13 +23,13 @@
 #if 0
 #define kdebug(FMT, ...)						\
 	printk("[%-5.5s%5u] " FMT "\n",					\
-	       current->comm, current->pid, ##__VA_ARGS__)
+	       current->comm_str, current->pid, ##__VA_ARGS__)
 #else
 #define kdebug(FMT, ...)						\
 do {									\
 	if (0)								\
 		no_printk("[%-5.5s%5u] " FMT "\n",			\
-			  current->comm, current->pid, ##__VA_ARGS__);	\
+			  current->comm_str, current->pid, ##__VA_ARGS__);	\
 } while (0)
 #endif
 
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 22fdf0c187cd..e39c8556685a 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -8962,7 +8962,7 @@ static void perf_event_comm_event(struct perf_comm_event *comm_event)
 	unsigned int size;
 
 	memset(comm, 0, sizeof(comm));
-	strscpy(comm, comm_event->task->comm);
+	strscpy(comm, comm_event->task->comm_str);
 	size = ALIGN(strlen(comm)+1, sizeof(u64));
 
 	comm_event->comm = comm;
diff --git a/kernel/exit.c b/kernel/exit.c
index f03caf17b214..198227a39eb9 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -850,7 +850,7 @@ static void check_stack_usage(void)
 	spin_lock(&low_water_lock);
 	if (free < lowest_to_date) {
 		pr_info("%s (%d) used greatest stack depth: %lu bytes left\n",
-			current->comm, task_pid_nr(current), free);
+			current->comm_str, task_pid_nr(current), free);
 		lowest_to_date = free;
 	}
 	spin_unlock(&low_water_lock);
@@ -1023,12 +1023,12 @@ void __noreturn make_task_dead(int signr)
 
 	if (unlikely(irqs_disabled())) {
 		pr_info("note: %s[%d] exited with irqs disabled\n",
-			current->comm, task_pid_nr(current));
+			current->comm_str, task_pid_nr(current));
 		local_irq_enable();
 	}
 	if (unlikely(in_atomic())) {
 		pr_info("note: %s[%d] exited with preempt_count %d\n",
-			current->comm, task_pid_nr(current),
+			current->comm_str, task_pid_nr(current),
 			preempt_count());
 		preempt_count_set(PREEMPT_ENABLED);
 	}
diff --git a/kernel/fork.c b/kernel/fork.c
index cfe2f1df5f27..fd5bb94596ba 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1922,6 +1922,7 @@ __latent_entropy struct task_struct *copy_process(
 	struct file *pidfile = NULL;
 	const u64 clone_flags = args->flags;
 	struct nsproxy *nsp = current->nsproxy;
+	unsigned char comm[TASK_COMM_EXT_LEN];
 
 	/*
 	 * Don't allow sharing the root directory with processes in a different
@@ -2013,8 +2014,12 @@ __latent_entropy struct task_struct *copy_process(
 	if (args->io_thread)
 		p->flags |= PF_IO_WORKER;
 
-	if (args->name)
-		strscpy_pad(p->comm, args->name, sizeof(p->comm));
+	if (args->name) {
+		memcpy(comm, args->name, sizeof(p->comm_str) - 1);
+		comm[sizeof(p->comm_str) - 1] = '\0';
+
+		set_task_comm(p, comm);
+	}
 
 	p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? args->child_tid : NULL;
 	/*
diff --git a/kernel/freezer.c b/kernel/freezer.c
index 8d530d0949ff..e5b066b7a166 100644
--- a/kernel/freezer.c
+++ b/kernel/freezer.c
@@ -64,7 +64,7 @@ bool __refrigerator(bool check_kthr_stop)
 	unsigned int state = get_current_state();
 	bool was_frozen = false;
 
-	pr_debug("%s entered refrigerator\n", current->comm);
+	pr_debug("%s entered refrigerator\n", current->comm_str);
 
 	WARN_ON_ONCE(state && !(state & TASK_NORMAL));
 
@@ -89,7 +89,7 @@ bool __refrigerator(bool check_kthr_stop)
 	}
 	__set_current_state(TASK_RUNNING);
 
-	pr_debug("%s left refrigerator\n", current->comm);
+	pr_debug("%s left refrigerator\n", current->comm_str);
 
 	return was_frozen;
 }
diff --git a/kernel/futex/waitwake.c b/kernel/futex/waitwake.c
index e2bbe5509ec2..d72246096c06 100644
--- a/kernel/futex/waitwake.c
+++ b/kernel/futex/waitwake.c
@@ -214,7 +214,7 @@ static int futex_atomic_op_inuser(unsigned int encoded_op, u32 __user *uaddr)
 			 * is sane again
 			 */
 			pr_info_ratelimited("futex_wake_op: %s tries to shift op by %d; fix this program\n",
-					    current->comm, oparg);
+					    current->comm_str, oparg);
 			oparg &= 31;
 		}
 		oparg = 1 << oparg;
diff --git a/kernel/hung_task.c b/kernel/hung_task.c
index 8708a1205f82..470ad5bdfc47 100644
--- a/kernel/hung_task.c
+++ b/kernel/hung_task.c
@@ -138,11 +138,11 @@ static void debug_show_blocker(struct task_struct *task)
 		switch (blocker_type) {
 		case BLOCKER_TYPE_MUTEX:
 			pr_err("INFO: task %s:%d is blocked on a mutex, but the owner is not found.\n",
-			       task->comm, task->pid);
+			       task->comm_str, task->pid);
 			break;
 		case BLOCKER_TYPE_SEM:
 			pr_err("INFO: task %s:%d is blocked on a semaphore, but the last holder is not found.\n",
-			       task->comm, task->pid);
+			       task->comm_str, task->pid);
 			break;
 		case BLOCKER_TYPE_RWSEM_READER:
 		case BLOCKER_TYPE_RWSEM_WRITER:
@@ -161,11 +161,11 @@ static void debug_show_blocker(struct task_struct *task)
 		switch (blocker_type) {
 		case BLOCKER_TYPE_MUTEX:
 			pr_err("INFO: task %s:%d is blocked on a mutex likely owned by task %s:%d.\n",
-			       task->comm, task->pid, t->comm, t->pid);
+			       task->comm_str, task->pid, t->comm_str, t->pid);
 			break;
 		case BLOCKER_TYPE_SEM:
 			pr_err("INFO: task %s:%d blocked on a semaphore likely last held by task %s:%d\n",
-			       task->comm, task->pid, t->comm, t->pid);
+			       task->comm_str, task->pid, t->comm_str, t->pid);
 			break;
 		case BLOCKER_TYPE_RWSEM_READER:
 		case BLOCKER_TYPE_RWSEM_WRITER:
@@ -233,7 +233,7 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
 		if (sysctl_hung_task_warnings > 0)
 			sysctl_hung_task_warnings--;
 		pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n",
-		       t->comm, t->pid, (jiffies - t->last_switch_time) / HZ);
+		       t->comm_str, t->pid, (jiffies - t->last_switch_time) / HZ);
 		pr_err("      %s %s %.*s\n",
 			print_tainted(), init_utsname()->release,
 			(int)strcspn(init_utsname()->version, " "),
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index c94837382037..6f52730f86e4 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1175,7 +1175,7 @@ static void irq_thread_dtor(struct callback_head *unused)
 	action = kthread_data(tsk);
 
 	pr_err("exiting task \"%s\" (%d) is an active IRQ thread (irq %d)\n",
-	       tsk->comm, tsk->pid, action->irq);
+	       tsk->comm_str, tsk->pid, action->irq);
 
 
 	desc = irq_to_desc(action->irq);
diff --git a/kernel/kthread.c b/kernel/kthread.c
index 0e98b228a8ef..4222e531d487 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -108,7 +108,7 @@ void get_kthread_comm(char *buf, size_t buf_size, struct task_struct *tsk)
 	struct kthread *kthread = to_kthread(tsk);
 
 	if (!kthread || !kthread->full_name) {
-		strscpy(buf, tsk->comm, buf_size);
+		strscpy(buf, tsk->comm_str, buf_size);
 		return;
 	}
 
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
index c80902eacd79..ab883220d4e8 100644
--- a/kernel/locking/rtmutex.c
+++ b/kernel/locking/rtmutex.c
@@ -712,7 +712,7 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 			prev_max = max_lock_depth;
 			printk(KERN_WARNING "Maximum lock depth %d reached "
 			       "task: %s (%d)\n", max_lock_depth,
-			       top_task->comm, task_pid_nr(top_task));
+			       top_task->comm_str, task_pid_nr(top_task));
 		}
 		put_task_struct(task);
 
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 0efbcdda9aab..ba7f690c8ba9 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -777,7 +777,7 @@ static ssize_t devkmsg_write(struct kiocb *iocb, struct iov_iter *from)
 
 	/* Ratelimit when not explicitly enabled. */
 	if (!(devkmsg_log & DEVKMSG_LOG_MASK_ON)) {
-		if (!___ratelimit(&user->rs, current->comm))
+		if (!___ratelimit(&user->rs, current->comm_str))
 			return ret;
 	}
 
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index ae360daf7d80..c4c437b1a035 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3240,7 +3240,7 @@ void force_compatible_cpus_allowed_ptr(struct task_struct *p)
 out_set_mask:
 	if (printk_ratelimit()) {
 		printk_deferred("Overriding affinity for process %d (%s) to CPUs %*pbl\n",
-				task_pid_nr(p), p->comm,
+				task_pid_nr(p), p->comm_str,
 				cpumask_pr_args(override_mask));
 	}
 
@@ -3545,7 +3545,7 @@ static int select_fallback_rq(int cpu, struct task_struct *p)
 		 */
 		if (p->mm && printk_ratelimit()) {
 			printk_deferred("process %d (%s) no longer affine to cpu%d\n",
-					task_pid_nr(p), p->comm, cpu);
+					task_pid_nr(p), p->comm_str, cpu);
 		}
 	}
 
@@ -5156,7 +5156,7 @@ static struct rq *finish_task_switch(struct task_struct *prev)
 	 */
 	if (WARN_ONCE(preempt_count() != 2*PREEMPT_DISABLE_OFFSET,
 		      "corrupted preempt_count: %s/%d/0x%x\n",
-		      current->comm, current->pid, preempt_count()))
+		      current->comm_str, current->pid, preempt_count()))
 		preempt_count_set(FORK_PREEMPT_COUNT);
 
 	rq->prev_mm = NULL;
@@ -5849,7 +5849,7 @@ static noinline void __schedule_bug(struct task_struct *prev)
 		return;
 
 	printk(KERN_ERR "BUG: scheduling while atomic: %s/%d/0x%08x\n",
-		prev->comm, prev->pid, preempt_count());
+		prev->comm_str, prev->pid, preempt_count());
 
 	debug_show_held_locks(prev);
 	print_modules();
@@ -5881,7 +5881,7 @@ static inline void schedule_debug(struct task_struct *prev, bool preempt)
 #ifdef CONFIG_DEBUG_ATOMIC_SLEEP
 	if (!preempt && READ_ONCE(prev->__state) && prev->non_block_count) {
 		printk(KERN_ERR "BUG: scheduling in a non-blocking section: %s/%d/%i\n",
-			prev->comm, prev->pid, prev->non_block_count);
+			prev->comm_str, prev->pid, prev->non_block_count);
 		dump_stack();
 		add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
 	}
@@ -7645,7 +7645,7 @@ void sched_show_task(struct task_struct *p)
 	if (!try_get_task_stack(p))
 		return;
 
-	pr_info("task:%-15.15s state:%c", p->comm, task_state_to_char(p));
+	pr_info("task:%-15.15s state:%c", p->comm_str, task_state_to_char(p));
 
 	if (task_is_running(p))
 		pr_cont("  running task    ");
@@ -7786,7 +7786,7 @@ void __init init_idle(struct task_struct *idle, int cpu)
 	idle->sched_class = &idle_sched_class;
 	ftrace_graph_init_idle_task(idle, cpu);
 	vtime_init_idle(idle, cpu);
-	sprintf(idle->comm, "%s/%d", INIT_TASK_COMM, cpu);
+	sprintf(idle->comm_str, "%s/%d", INIT_TASK_COMM, cpu);
 }
 
 int cpuset_cpumask_can_shrink(const struct cpumask *cur,
@@ -8322,7 +8322,7 @@ static void dump_rq_tasks(struct rq *rq, const char *loglvl)
 		if (!task_on_rq_queued(p))
 			continue;
 
-		printk("%s\tpid: %d, name: %s\n", loglvl, p->pid, p->comm);
+		printk("%s\tpid: %d, name: %s\n", loglvl, p->pid, p->comm_str);
 	}
 }
 
@@ -8667,7 +8667,7 @@ void __might_resched(const char *file, int line, unsigned int offsets)
 	       file, line);
 	pr_err("in_atomic(): %d, irqs_disabled(): %d, non_block: %d, pid: %d, name: %s\n",
 	       in_atomic(), irqs_disabled(), current->non_block_count,
-	       current->pid, current->comm);
+	       current->pid, current->comm_str);
 	pr_err("preempt_count: %x, expected: %x\n", preempt_count(),
 	       offsets & MIGHT_RESCHED_PREEMPT_MASK);
 
@@ -8711,7 +8711,7 @@ void __cant_sleep(const char *file, int line, int preempt_offset)
 	printk(KERN_ERR "BUG: assuming atomic context at %s:%d\n", file, line);
 	printk(KERN_ERR "in_atomic(): %d, irqs_disabled(): %d, pid: %d, name: %s\n",
 			in_atomic(), irqs_disabled(),
-			current->pid, current->comm);
+			current->pid, current->comm_str);
 
 	debug_show_held_locks(current);
 	dump_stack();
@@ -8743,7 +8743,7 @@ void __cant_migrate(const char *file, int line)
 	pr_err("BUG: assuming non migratable context at %s:%d\n", file, line);
 	pr_err("in_atomic(): %d, irqs_disabled(): %d, migration_disabled() %u pid: %d, name: %s\n",
 	       in_atomic(), irqs_disabled(), is_migration_disabled(current),
-	       current->pid, current->comm);
+	       current->pid, current->comm_str);
 
 	debug_show_held_locks(current);
 	dump_stack();
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index 3f06ab84d53f..24db33d9016e 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -734,7 +734,7 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
 		SEQ_printf(m, " %c", task_state_to_char(p));
 
 	SEQ_printf(m, " %15s %5d %9Ld.%06ld   %c   %9Ld.%06ld %c %9Ld.%06ld %9Ld.%06ld %9Ld   %5d ",
-		p->comm, task_pid_nr(p),
+		p->comm_str, task_pid_nr(p),
 		SPLIT_NS(p->se.vruntime),
 		entity_eligible(cfs_rq_of(&p->se), &p->se) ? 'E' : 'N',
 		SPLIT_NS(p->se.deadline),
@@ -1150,7 +1150,7 @@ void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns,
 {
 	unsigned long nr_switches;
 
-	SEQ_printf(m, "%s (%d, #threads: %d)\n", p->comm, task_pid_nr_ns(p, ns),
+	SEQ_printf(m, "%s (%d, #threads: %d)\n", p->comm_str, task_pid_nr_ns(p, ns),
 						get_nr_threads(p));
 	SEQ_printf(m,
 		"---------------------------------------------------------"
diff --git a/kernel/signal.c b/kernel/signal.c
index e2c928de7d2c..de0e1a413d04 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -257,7 +257,7 @@ static inline void print_dropped_signal(int sig)
 		return;
 
 	pr_info("%s/%d: reached RLIMIT_SIGPENDING, dropped signal %d\n",
-				current->comm, current->pid, sig);
+				current->comm_str, current->pid, sig);
 }
 
 /**
@@ -1224,11 +1224,11 @@ static void print_fatal_signal(int signr)
 	exe_file = get_task_exe_file(current);
 	if (exe_file) {
 		pr_info("%pD: %s: potentially unexpected fatal signal %d.\n",
-			exe_file, current->comm, signr);
+			exe_file, current->comm_str, signr);
 		fput(exe_file);
 	} else {
 		pr_info("%s: potentially unexpected fatal signal %d.\n",
-			current->comm, signr);
+			current->comm_str, signr);
 	}
 
 #if defined(__i386__) && !defined(__arch_um__)
diff --git a/kernel/sys.c b/kernel/sys.c
index 1e28b40053ce..25c79f78fbbf 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -2456,7 +2456,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
 		unsigned long, arg4, unsigned long, arg5)
 {
 	struct task_struct *me = current;
-	unsigned char comm[sizeof(me->comm)];
+	unsigned char comm[sizeof(me->comm_str)];
 	long error;
 
 	error = security_task_prctl(option, arg2, arg3, arg4, arg5);
@@ -2512,9 +2512,9 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
 			error = -EINVAL;
 		break;
 	case PR_SET_NAME:
-		comm[sizeof(me->comm) - 1] = 0;
+		comm[sizeof(me->comm_str) - 1] = 0;
 		if (strncpy_from_user(comm, (char __user *)arg2,
-				      sizeof(me->comm) - 1) < 0)
+				      sizeof(me->comm_str) - 1) < 0)
 			return -EFAULT;
 		set_task_comm(me, comm);
 		proc_comm_connector(me);
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index cb6196e3fa99..e5bceda6fc3d 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -140,7 +140,7 @@ static void warn_sysctl_write(const struct ctl_table *table)
 	pr_warn_once("%s wrote to %s when file position was not 0!\n"
 		"This will not be supported in the future. To silence this\n"
 		"warning, set kernel.sysctl_writes_strict = -1\n",
-		current->comm, table->procname);
+		current->comm_str, table->procname);
 }
 
 /**
diff --git a/kernel/time/itimer.c b/kernel/time/itimer.c
index 876d389b2e21..7fda10130508 100644
--- a/kernel/time/itimer.c
+++ b/kernel/time/itimer.c
@@ -363,7 +363,7 @@ SYSCALL_DEFINE3(setitimer, int, which, struct __kernel_old_itimerval __user *, v
 		memset(&set_buffer, 0, sizeof(set_buffer));
 		printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer."
 			    " Misfeature support will be removed\n",
-			    current->comm);
+			    current->comm_str);
 	}
 
 	error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL);
@@ -410,7 +410,7 @@ COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
 		memset(&set_buffer, 0, sizeof(set_buffer));
 		printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer."
 			    " Misfeature support will be removed\n",
-			    current->comm);
+			    current->comm_str);
 	}
 
 	error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL);
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index 2e5b89d7d866..19ed72294481 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -851,7 +851,7 @@ static bool check_rlimit(u64 time, u64 limit, int signo, bool rt, bool hard)
 	if (print_fatal_signals) {
 		pr_info("%s Watchdog Timeout (%s): %s[%d]\n",
 			rt ? "RT" : "CPU", hard ? "hard" : "soft",
-			current->comm, task_pid_nr(current));
+			current->comm_str, task_pid_nr(current));
 	}
 	send_signal_locked(signo, SEND_SIG_PRIV, current, PIDTYPE_TGID);
 	return true;
diff --git a/kernel/tsacct.c b/kernel/tsacct.c
index 16b283f9d831..6eaa5e0e20b4 100644
--- a/kernel/tsacct.c
+++ b/kernel/tsacct.c
@@ -76,7 +76,7 @@ void bacct_add_tsk(struct user_namespace *user_ns,
 	stats->ac_minflt = tsk->min_flt;
 	stats->ac_majflt = tsk->maj_flt;
 
-	strscpy_pad(stats->ac_comm, tsk->comm);
+	strscpy_pad(stats->ac_comm, tsk->comm_str);
 }
 
 
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index ae99311f1a96..a573cd6b26b3 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -3252,7 +3252,7 @@ __acquires(&pool->lock)
 		     rcu_preempt_depth() != rcu_start_depth)) {
 		pr_err("BUG: workqueue leaked atomic, lock or RCU: %s[%d]\n"
 		       "     preempt=0x%08x lock=%d->%d RCU=%d->%d workfn=%ps\n",
-		       current->comm, task_pid_nr(current), preempt_count(),
+		       current->comm_str, task_pid_nr(current), preempt_count(),
 		       lockdep_start_depth, lockdep_depth(current),
 		       rcu_start_depth, rcu_preempt_depth(),
 		       worker->current_func);
@@ -3716,7 +3716,7 @@ static void check_flush_dependency(struct workqueue_struct *target_wq,
 
 	WARN_ONCE(current->flags & PF_MEMALLOC,
 		  "workqueue: PF_MEMALLOC task %d(%s) is flushing !WQ_MEM_RECLAIM %s:%ps",
-		  current->pid, current->comm, target_wq->name, target_func);
+		  current->pid, current->comm_str, target_wq->name, target_func);
 	WARN_ONCE(worker && ((worker->current_pwq->wq->flags &
 			      (WQ_MEM_RECLAIM | __WQ_LEGACY)) == WQ_MEM_RECLAIM),
 		  "workqueue: WQ_MEM_RECLAIM %s:%ps is flushing !WQ_MEM_RECLAIM %s:%ps",
@@ -6486,7 +6486,7 @@ void wq_worker_comm(char *buf, size_t size, struct task_struct *task)
 			raw_spin_unlock_irq(&pool->lock);
 		}
 	} else {
-		strscpy(buf, task->comm, size);
+		strscpy(buf, task->comm_str, size);
 	}
 
 	mutex_unlock(&wq_pool_attach_mutex);
diff --git a/lib/dump_stack.c b/lib/dump_stack.c
index b3a85fe8b673..5ebf7503f3c6 100644
--- a/lib/dump_stack.c
+++ b/lib/dump_stack.c
@@ -57,7 +57,7 @@ void dump_stack_print_info(const char *log_lvl)
 	printk("%sCPU: %d UID: %u PID: %d Comm: %.20s %s%s %s %.*s %s " BUILD_ID_FMT "\n",
 	       log_lvl, raw_smp_processor_id(),
 	       __kuid_val(current_real_cred()->euid),
-	       current->pid, current->comm,
+	       current->pid, current->comm_str,
 	       kexec_crash_loaded() ? "Kdump: loaded " : "",
 	       print_tainted(),
 	       init_utsname()->release,
diff --git a/lib/nlattr.c b/lib/nlattr.c
index be9c576b6e2d..994a4ae5b2ec 100644
--- a/lib/nlattr.c
+++ b/lib/nlattr.c
@@ -212,7 +212,7 @@ static int nla_validate_range_unsigned(const struct nla_policy *pt,
 	if (pt->validation_type == NLA_VALIDATE_RANGE_WARN_TOO_LONG &&
 	    pt->type == NLA_BINARY && value > range.max) {
 		pr_warn_ratelimited("netlink: '%s': attribute type %d has an invalid length.\n",
-				    current->comm, pt->type);
+				    current->comm_str, pt->type);
 		if (validate & NL_VALIDATE_STRICT_ATTRS) {
 			NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
 						"invalid attribute length");
@@ -412,7 +412,7 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
 
 	if (nla_attr_len[pt->type] && attrlen != nla_attr_len[pt->type]) {
 		pr_warn_ratelimited("netlink: '%s': attribute type %d has an invalid length.\n",
-				    current->comm, type);
+				    current->comm_str, type);
 		if (validate & NL_VALIDATE_STRICT_ATTRS) {
 			NL_SET_ERR_MSG_ATTR_POL(extack, nla, pt,
 						"invalid attribute length");
@@ -645,7 +645,7 @@ static int __nla_validate_parse(const struct nlattr *head, int len, int maxtype,
 
 	if (unlikely(rem > 0)) {
 		pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n",
-				    rem, current->comm);
+				    rem, current->comm_str);
 		NL_SET_ERR_MSG(extack, "bytes leftover after parsing attributes");
 		if (validate & NL_VALIDATE_TRAILING)
 			return -EINVAL;
diff --git a/mm/compaction.c b/mm/compaction.c
index bf021b31c7ec..e89741a68834 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -3278,7 +3278,7 @@ static int proc_dointvec_minmax_warn_RT_change(const struct ctl_table *table,
 		return ret;
 	if (old != *(int *)table->data)
 		pr_warn_once("sysctl attribute %s changed by %s[%d]\n",
-			     table->procname, current->comm,
+			     table->procname, current->comm_str,
 			     task_pid_nr(current));
 	return ret;
 }
diff --git a/mm/filemap.c b/mm/filemap.c
index 413492492b5a..085335253b11 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -154,7 +154,7 @@ static void filemap_unaccount_folio(struct address_space *mapping,
 	VM_BUG_ON_FOLIO(folio_mapped(folio), folio);
 	if (!IS_ENABLED(CONFIG_DEBUG_VM) && unlikely(folio_mapped(folio))) {
 		pr_alert("BUG: Bad page cache in process %s  pfn:%05lx\n",
-			 current->comm, folio_pfn(folio));
+			 current->comm_str, folio_pfn(folio));
 		dump_page(&folio->page, "still mapped when deleted");
 		dump_stack();
 		add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
@@ -4084,7 +4084,7 @@ static void dio_warn_stale_pagecache(struct file *filp)
 			path = "(unknown)";
 		pr_crit("Page cache invalidation failure on direct I/O.  Possible data corruption due to collision with buffered I/O!\n");
 		pr_crit("File: %s PID: %d Comm: %.20s\n", path, current->pid,
-			current->comm);
+			current->comm_str);
 	}
 }
 
diff --git a/mm/gup.c b/mm/gup.c
index adffe663594d..ca529d439e72 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -1308,7 +1308,7 @@ static struct vm_area_struct *gup_vma_lookup(struct mm_struct *mm,
 
 	/* Let people know things may have changed. */
 	pr_warn("GUP no longer grows the stack in %s (%d): %lx-%lx (%lx)\n",
-		current->comm, task_pid_nr(current),
+		current->comm_str, task_pid_nr(current),
 		vma->vm_start, vma->vm_end, addr);
 	dump_stack();
 	return NULL;
diff --git a/mm/memfd.c b/mm/memfd.c
index bbe679895ef6..acfdb41ed161 100644
--- a/mm/memfd.c
+++ b/mm/memfd.c
@@ -331,7 +331,7 @@ static int check_sysctl_memfd_noexec(unsigned int *flags)
 	if (!(*flags & MFD_NOEXEC_SEAL) && sysctl >= MEMFD_NOEXEC_SCOPE_NOEXEC_ENFORCED) {
 		pr_err_ratelimited(
 			"%s[%d]: memfd_create() requires MFD_NOEXEC_SEAL with vm.memfd_noexec=%d\n",
-			current->comm, task_pid_nr(current), sysctl);
+			current->comm_str, task_pid_nr(current), sysctl);
 		return -EACCES;
 	}
 #endif
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index 003b51e4adc0..b81dd0b7a5a3 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -354,7 +354,7 @@ static int kill_proc(struct to_kill *tk, unsigned long pfn, int flags)
 	int ret = 0;
 
 	pr_err("%#lx: Sending SIGBUS to %s:%d due to hardware memory corruption\n",
-			pfn, t->comm, task_pid_nr(t));
+			pfn, t->comm_str, task_pid_nr(t));
 
 	if ((flags & MF_ACTION_REQUIRED) && (t == current))
 		ret = force_sig_mceerr(BUS_MCEERR_AR,
@@ -370,7 +370,7 @@ static int kill_proc(struct to_kill *tk, unsigned long pfn, int flags)
 				      addr_lsb, t);
 	if (ret < 0)
 		pr_info("Error sending signal to %s:%d: %d\n",
-			t->comm, task_pid_nr(t), ret);
+			t->comm_str, task_pid_nr(t), ret);
 	return ret;
 }
 
@@ -475,7 +475,7 @@ static void __add_to_kill(struct task_struct *tsk, const struct page *p,
 	 */
 	if (tk->addr == -EFAULT) {
 		pr_info("Unable to find user space address %lx in %s\n",
-			page_to_pfn(p), tsk->comm);
+			page_to_pfn(p), tsk->comm_str);
 	} else if (tk->size_shift == 0) {
 		kfree(tk);
 		return;
@@ -532,7 +532,7 @@ static void kill_procs(struct list_head *to_kill, int forcekill,
 		if (forcekill) {
 			if (tk->addr == -EFAULT) {
 				pr_err("%#lx: forcibly killing %s:%d because of failure to unmap corrupted page\n",
-				       pfn, tk->tsk->comm, task_pid_nr(tk->tsk));
+				       pfn, tk->tsk->comm_str, task_pid_nr(tk->tsk));
 				do_send_sig_info(SIGKILL, SEND_SIG_PRIV,
 						 tk->tsk, PIDTYPE_PID);
 			}
@@ -545,7 +545,7 @@ static void kill_procs(struct list_head *to_kill, int forcekill,
 			 */
 			else if (kill_proc(tk, pfn, flags) < 0)
 				pr_err("%#lx: Cannot send advisory machine check signal to %s:%d\n",
-				       pfn, tk->tsk->comm, task_pid_nr(tk->tsk));
+				       pfn, tk->tsk->comm_str, task_pid_nr(tk->tsk));
 		}
 		list_del(&tk->nd);
 		put_task_struct(tk->tsk);
diff --git a/mm/memory.c b/mm/memory.c
index 4020639593ce..c7049ced1ae3 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -540,7 +540,7 @@ static void print_bad_pte(struct vm_area_struct *vma, unsigned long addr,
 	index = linear_page_index(vma, addr);
 
 	pr_alert("BUG: Bad page map in process %s  pte:%08llx pmd:%08llx\n",
-		 current->comm,
+		 current->comm_str,
 		 (long long)pte_val(pte), (long long)pmd_val(*pmd));
 	if (page)
 		dump_page(page, "bad pte");
diff --git a/mm/mmap.c b/mm/mmap.c
index 7306253cc3b5..c5971b26b005 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1096,7 +1096,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
 	vm_flags_t vm_flags;
 
 	pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/mm/remap_file_pages.rst.\n",
-		     current->comm, current->pid);
+		     current->comm_str, current->pid);
 
 	if (prot)
 		return ret;
@@ -1334,7 +1334,7 @@ bool may_expand_vm(struct mm_struct *mm, vm_flags_t flags, unsigned long npages)
 			return true;
 
 		pr_warn_once("%s (%d): VmData %lu exceed data ulimit %lu. Update limits%s.\n",
-			     current->comm, current->pid,
+			     current->comm_str, current->pid,
 			     (mm->data_vm + npages) << PAGE_SHIFT,
 			     rlimit(RLIMIT_DATA),
 			     ignore_rlimit_data ? "" : " or use boot option ignore_rlimit_data");
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 25923cfec9c6..023eec5ec9c3 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -406,7 +406,7 @@ static int dump_task(struct task_struct *p, void *arg)
 		get_mm_counter(task->mm, MM_ANONPAGES), get_mm_counter(task->mm, MM_FILEPAGES),
 		get_mm_counter(task->mm, MM_SHMEMPAGES), mm_pgtables_bytes(task->mm),
 		get_mm_counter(task->mm, MM_SWAPENTS),
-		task->signal->oom_score_adj, task->comm);
+		task->signal->oom_score_adj, task->comm_str);
 	task_unlock(task);
 
 	return 0;
@@ -452,14 +452,14 @@ static void dump_oom_victim(struct oom_control *oc, struct task_struct *victim)
 			nodemask_pr_args(oc->nodemask));
 	cpuset_print_current_mems_allowed();
 	mem_cgroup_print_oom_context(oc->memcg, victim);
-	pr_cont(",task=%s,pid=%d,uid=%d\n", victim->comm, victim->pid,
+	pr_cont(",task=%s,pid=%d,uid=%d\n", victim->comm_str, victim->pid,
 		from_kuid(&init_user_ns, task_uid(victim)));
 }
 
 static void dump_header(struct oom_control *oc)
 {
 	pr_warn("%s invoked oom-killer: gfp_mask=%#x(%pGg), order=%d, oom_score_adj=%hd\n",
-		current->comm, oc->gfp_mask, &oc->gfp_mask, oc->order,
+		current->comm_str, oc->gfp_mask, &oc->gfp_mask, oc->order,
 			current->signal->oom_score_adj);
 	if (!IS_ENABLED(CONFIG_COMPACTION) && oc->order)
 		pr_warn("COMPACTION is disabled!!!\n");
@@ -596,7 +596,7 @@ static bool oom_reap_task_mm(struct task_struct *tsk, struct mm_struct *mm)
 		goto out_finish;
 
 	pr_info("oom_reaper: reaped process %d (%s), now anon-rss:%lukB, file-rss:%lukB, shmem-rss:%lukB\n",
-			task_pid_nr(tsk), tsk->comm,
+			task_pid_nr(tsk), tsk->comm_str,
 			K(get_mm_counter(mm, MM_ANONPAGES)),
 			K(get_mm_counter(mm, MM_FILEPAGES)),
 			K(get_mm_counter(mm, MM_SHMEMPAGES)));
@@ -623,7 +623,7 @@ static void oom_reap_task(struct task_struct *tsk)
 		goto done;
 
 	pr_info("oom_reaper: unable to reap pid:%d (%s)\n",
-		task_pid_nr(tsk), tsk->comm);
+		task_pid_nr(tsk), tsk->comm_str);
 	sched_show_task(tsk);
 	debug_show_all_locks();
 
@@ -927,7 +927,7 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
 	p = find_lock_task_mm(victim);
 	if (!p) {
 		pr_info("%s: OOM victim %d (%s) is already exiting. Skip killing the task\n",
-			message, task_pid_nr(victim), victim->comm);
+			message, task_pid_nr(victim), victim->comm_str);
 		put_task_struct(victim);
 		return;
 	} else if (victim != p) {
@@ -952,7 +952,7 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
 	do_send_sig_info(SIGKILL, SEND_SIG_PRIV, victim, PIDTYPE_TGID);
 	mark_oom_victim(victim);
 	pr_err("%s: Killed process %d (%s) total-vm:%lukB, anon-rss:%lukB, file-rss:%lukB, shmem-rss:%lukB, UID:%u pgtables:%lukB oom_score_adj:%hd\n",
-		message, task_pid_nr(victim), victim->comm, K(mm->total_vm),
+		message, task_pid_nr(victim), victim->comm_str, K(mm->total_vm),
 		K(get_mm_counter(mm, MM_ANONPAGES)),
 		K(get_mm_counter(mm, MM_FILEPAGES)),
 		K(get_mm_counter(mm, MM_SHMEMPAGES)),
@@ -979,8 +979,8 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
 			can_oom_reap = false;
 			set_bit(MMF_OOM_SKIP, &mm->flags);
 			pr_info("oom killer %d (%s) has mm pinned by %d (%s)\n",
-					task_pid_nr(victim), victim->comm,
-					task_pid_nr(p), p->comm);
+					task_pid_nr(victim), victim->comm_str,
+					task_pid_nr(p), p->comm_str);
 			continue;
 		}
 		/*
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index fa09154a799c..92de19bdf9d4 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -643,7 +643,7 @@ static void bad_page(struct page *page, const char *reason)
 		resume = jiffies + 60 * HZ;
 
 	pr_alert("BUG: Bad page state in process %s  pfn:%05lx\n",
-		current->comm, page_to_pfn(page));
+		current->comm_str, page_to_pfn(page));
 	dump_page(page, reason);
 
 	print_modules();
@@ -3923,7 +3923,7 @@ void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...)
 	vaf.fmt = fmt;
 	vaf.va = &args;
 	pr_warn("%s: %pV, mode:%#x(%pGg), nodemask=%*pbl",
-			current->comm, &vaf, gfp_mask, &gfp_mask,
+			current->comm_str, &vaf, gfp_mask, &gfp_mask,
 			nodemask_pr_args(nodemask));
 	va_end(args);
 
diff --git a/mm/util.c b/mm/util.c
index 68ea833ba25f..0995f8e90edb 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -965,7 +965,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
 error:
 	bytes_failed = pages << PAGE_SHIFT;
 	pr_warn_ratelimited("%s: pid: %d, comm: %s, bytes: %lu not enough memory for the allocation\n",
-			    __func__, current->pid, current->comm, bytes_failed);
+			    __func__, current->pid, current->comm_str, bytes_failed);
 	vm_unacct_memory(pages);
 
 	return -ENOMEM;
diff --git a/net/core/sock.c b/net/core/sock.c
index 8b7623c7d547..516eab62f3c9 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -443,7 +443,7 @@ static int sock_set_timeout(long *timeo_p, sockptr_t optval, int optlen,
 		if (warned < 10 && net_ratelimit()) {
 			warned++;
 			pr_info("%s: `%s' (pid %d) tries to set negative timeout\n",
-				__func__, current->comm, task_pid_nr(current));
+				__func__, current->comm_str, task_pid_nr(current));
 		}
 		return 0;
 	}
diff --git a/net/dns_resolver/internal.h b/net/dns_resolver/internal.h
index 0c570d40e4d6..447b1256bf42 100644
--- a/net/dns_resolver/internal.h
+++ b/net/dns_resolver/internal.h
@@ -44,7 +44,7 @@ extern unsigned int dns_resolver_debug;
 do {							\
 	if (unlikely(dns_resolver_debug))		\
 		printk(KERN_DEBUG "[%-6.6s] "FMT"\n",	\
-		       current->comm, ##__VA_ARGS__);	\
+		       current->comm_str, ##__VA_ARGS__);	\
 } while (0)
 
 #define kenter(FMT, ...) kdebug("==> %s("FMT")", __func__, ##__VA_ARGS__)
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 1d2c89d63cc7..5037968c95dd 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -520,7 +520,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 			goto out;
 		if (usin->sin_family != AF_INET) {
 			pr_info_once("%s: %s forgot to set AF_INET. Fix it!\n",
-				     __func__, current->comm);
+				     __func__, current->comm_str);
 			err = -EAFNOSUPPORT;
 			if (usin->sin_family)
 				goto out;
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 31149a0ac849..c98e4d577ea3 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2761,7 +2761,7 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
 		if ((flags & MSG_PEEK) &&
 		    (peek_seq - peek_offset - copied - urg_hole != tp->copied_seq)) {
 			net_dbg_ratelimited("TCP(%s:%d): Application bug, race in MSG_PEEK\n",
-					    current->comm,
+					    current->comm_str,
 					    task_pid_nr(current));
 			peek_seq = tp->copied_seq + peek_offset;
 		}
diff --git a/net/socket.c b/net/socket.c
index 682969deaed3..df2f3d0c10b4 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1537,7 +1537,7 @@ int __sock_create(struct net *net, int family, int type, int protocol,
 	 */
 	if (family == PF_INET && type == SOCK_PACKET) {
 		pr_info_once("%s uses obsolete (PF_INET,SOCK_PACKET)\n",
-			     current->comm);
+			     current->comm_str);
 		family = PF_PACKET;
 	}
 
diff --git a/security/lsm_audit.c b/security/lsm_audit.c
index 7d623b00495c..c64dce81e4f2 100644
--- a/security/lsm_audit.c
+++ b/security/lsm_audit.c
@@ -274,7 +274,7 @@ void audit_log_lsm_data(struct audit_buffer *ab,
 		if (tsk) {
 			pid_t pid = task_tgid_nr(tsk);
 			if (pid) {
-				char tskcomm[sizeof(tsk->comm)];
+				char tskcomm[TASK_COMM_LEN];
 				audit_log_format(ab, " opid=%d ocomm=", pid);
 				audit_log_untrustedstring(ab,
 				    get_task_comm(tskcomm, tsk));
@@ -414,7 +414,7 @@ void audit_log_lsm_data(struct audit_buffer *ab,
 static void dump_common_audit_data(struct audit_buffer *ab,
 				   const struct common_audit_data *a)
 {
-	char comm[sizeof(current->comm)];
+	char comm[TASK_COMM_LEN];
 
 	audit_log_format(ab, " pid=%d comm=", task_tgid_nr(current));
 	audit_log_untrustedstring(ab, get_task_comm(comm, current));
-- 
2.38.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ