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.

Reviewed by:	jilles
MFC after:	3 days
Sponsored by:	Dell EMC
This commit is contained in:
vangyzen 2016-12-03 01:14:21 +00:00
parent a6655c37ed
commit abbf63d36b
3 changed files with 23 additions and 22 deletions

View File

@ -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 .

View File

@ -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 .

View File

@ -578,8 +578,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);
}