copyinstr and ENAMETOOLONG

From: Eric van Gyzen <vangyzen_at_FreeBSD.org>
Date: Wed, 2 Nov 2016 14:24:43 -0500
Does copyinstr guarantee that it has filled the output buffer when it
returns ENAMETOOLONG?  I usually try to answer my own questions, but I
don't speak many dialects of assembly.  :)

I ask because I'd like to make the following change, and I'd like to
know whether I should zero the buffer before calling copyinstr to ensure
that I don't set the thread's name to the garbage that was on the stack.

Eric

Index: kern_thr.c
===================================================================
--- kern_thr.c	(revision 308217)
+++ kern_thr.c	(working copy)
_at__at_ -580,8 +580,13 _at__at_ sys_thr_set_name(struct thread *td, struct thr_set
 	if (uap->name != NULL) {
 		error = copyinstr(uap->name, name, sizeof(name),
 			NULL);
-		if (error)
-			return (error);
+		if (error) {
+			if (error == ENAMETOOLONG) {
+				name[sizeof(name) - 1] = '\0';
+			} else {
+				return (error);
+			}
+		}
 	}
 	p = td->td_proc;
 	ttd = tdfind((lwpid_t)uap->id, p->p_pid);
Received on Wed Nov 02 2016 - 18:24:47 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:08 UTC