summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvangyzen <vangyzen@FreeBSD.org>2016-12-13 23:34:07 +0000
committervangyzen <vangyzen@FreeBSD.org>2016-12-13 23:34:07 +0000
commitf1a55d2a3f0f502f1b9f16b4d166349ecf79664d (patch)
tree945af3134d118911e02cf4f89d57e705d6f36960
parent33d63662f28bf596d2c89c3428e2d96264ad6c4c (diff)
downloadFreeBSD-src-f1a55d2a3f0f502f1b9f16b4d166349ecf79664d.zip
FreeBSD-src-f1a55d2a3f0f502f1b9f16b4d166349ecf79664d.tar.gz
MFC r309460
thr_set_name(): silently truncate the given name as needed Instead of failing with ENAMETOOLONG, which is swallowed by pthread_set_name_np() anyway, truncate the given name to MAXCOMLEN+1 bytes. This is more likely what the user wants, and saves the caller from truncating it before the call (which was the only recourse). Polish pthread_set_name_np(3) and add a .Xr to thr_set_name(2) so the user might find the documentation for this behavior. Sponsored by: Dell EMC
-rw-r--r--lib/libc/sys/thr_set_name.225
-rw-r--r--share/man/man3/pthread_set_name_np.313
-rw-r--r--sys/kern/kern_thr.c7
3 files changed, 23 insertions, 22 deletions
diff --git a/lib/libc/sys/thr_set_name.2 b/lib/libc/sys/thr_set_name.2
index d2549e4..a83e531 100644
--- a/lib/libc/sys/thr_set_name.2
+++ b/lib/libc/sys/thr_set_name.2
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 1, 2016
+.Dd December 2, 2016
.Dt THR_SET_NAME 2
.Os
.Sh NAME
@@ -43,37 +43,34 @@
.Sh DESCRIPTION
The
.Fn thr_set_name
-sets the user-visible name for the kernel thread with the identifier
+system call sets the user-visible name for the thread with the identifier
.Va id
-in the current process, to the NUL-terminated string
+in the current process to the NUL-terminated string
.Va name .
+The name will be silently truncated to fit into a buffer of
+.Dv MAXCOMLEN + 1
+bytes.
The thread name can be seen in the output of the
.Xr ps 1
and
.Xr top 1
commands, in the kernel debuggers and kernel tracing facility outputs,
-also in userland debuggers and program core files, as notes.
+and in userland debuggers and program core files, as notes.
.Sh RETURN VALUES
If successful,
.Fn thr_set_name
-will return zero, otherwise \-1 is returned, and
+returns zero; otherwise, \-1 is returned, and
.Va errno
is set to indicate the error.
.Sh ERRORS
The
.Fn thr_set_name
-operation may return the following errors:
+system call may return the following errors:
.Bl -tag -width Er
.It Bq Er EFAULT
The memory pointed to by the
.Fa name
argument is not valid.
-.It Bq Er ENAMETOOLONG
-The string pointed to by the
-.Fa name
-argument exceeds
-.Dv MAXCOMLEN + 1
-bytes in length.
.It Bq Er ESRCH
The thread with the identifier
.Fa id
@@ -92,6 +89,6 @@ does not exist in the current process.
.Xr ktr 9
.Sh STANDARDS
The
-.Fn thr_new
-system call is non-standard and is used by
+.Fn thr_set_name
+system call is non-standard and is used by the
.Lb libthr .
diff --git a/share/man/man3/pthread_set_name_np.3 b/share/man/man3/pthread_set_name_np.3
index e302939..c8e5cb4 100644
--- a/share/man/man3/pthread_set_name_np.3
+++ b/share/man/man3/pthread_set_name_np.3
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 13, 2003
+.Dd December 2, 2016
.Dt PTHREAD_SET_NAME_NP 3
.Os
.Sh NAME
@@ -35,18 +35,19 @@
.Sh SYNOPSIS
.In pthread_np.h
.Ft void
-.Fn pthread_set_name_np "pthread_t tid" "const char *name"
+.Fn pthread_set_name_np "pthread_t thread" "const char *name"
.Sh DESCRIPTION
The
.Fn pthread_set_name_np
-function sets internal name for thread specified by
-.Fa tid
-argument to string value specified by
+function applies a copy of the given
.Fa name
-argument.
+to the given
+.Fa thread .
.Sh ERRORS
Because of the debugging nature of this function, all errors that may
appear inside are silently ignored.
+.Sh SEE ALSO
+.Xr thr_set_name 2
.Sh AUTHORS
This manual page was written by
.An Alexey Zelkin Aq Mt phantom@FreeBSD.org .
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 1af776c..9458b70 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -579,8 +579,11 @@ sys_thr_set_name(struct thread *td, struct thr_set_name_args *uap)
error = 0;
name[0] = '\0';
if (uap->name != NULL) {
- error = copyinstr(uap->name, name, sizeof(name),
- NULL);
+ error = copyinstr(uap->name, name, sizeof(name), NULL);
+ if (error == ENAMETOOLONG) {
+ error = copyin(uap->name, name, sizeof(name) - 1);
+ name[sizeof(name) - 1] = '\0';
+ }
if (error)
return (error);
}
OpenPOWER on IntegriCloud