public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [hurd,commited 0/5] gcc-11-related fixes
@ 2020-11-23  0:35 Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 1/5] hurd: Fix _S_msg_get/set_env_variable prototype Samuel Thibault
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Samuel Thibault @ 2020-11-23  0:35 UTC (permalink / raw)
  To: libc-alpha; +Cc: Samuel Thibault, commit-hurd

Samuel Thibault (5):
  hurd: Fix _S_msg_get/set_env_variable prototype
  hurd: Fix strcpy calls
  hurd S_msg_report_wait: Fix reporting ports
  hurd S_msg_report_wait: Fix detecting fd ports
  hurd report-wait: Fix stpcpy usage

 hurd/hurdmsg.c      |  6 ++--
 hurd/lookup-retry.c |  7 ++--
 hurd/report-wait.c  | 82 ++++++++++++++++++++++++++++-----------------
 3 files changed, 58 insertions(+), 37 deletions(-)

-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [hurd,commited 1/5] hurd: Fix _S_msg_get/set_env_variable prototype
  2020-11-23  0:35 [hurd,commited 0/5] gcc-11-related fixes Samuel Thibault
@ 2020-11-23  0:35 ` Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 2/5] hurd: Fix strcpy calls Samuel Thibault
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Samuel Thibault @ 2020-11-23  0:35 UTC (permalink / raw)
  To: libc-alpha; +Cc: Samuel Thibault, commit-hurd

_S_msg_get_env_variable and _S_msg_set_env_variable are taking string_t,
not char *.

Fixes a warning with gcc 11.
---
 hurd/hurdmsg.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hurd/hurdmsg.c b/hurd/hurdmsg.c
index ebf2e028ab..80b341f068 100644
--- a/hurd/hurdmsg.c
+++ b/hurd/hurdmsg.c
@@ -295,7 +295,7 @@ _S_msg_set_fd (mach_port_t msgport, mach_port_t auth,
 
 kern_return_t
 _S_msg_get_env_variable (mach_port_t msgport,
-			 char *variable,
+			 string_t variable, //
 			 char **data, mach_msg_type_number_t *datalen)
 {
   error_t err;
@@ -322,8 +322,8 @@ _S_msg_get_env_variable (mach_port_t msgport,
 
 kern_return_t
 _S_msg_set_env_variable (mach_port_t msgport, mach_port_t auth,
-			 char *variable,
-			 char *value,
+			 string_t variable, //
+			 string_t value, //
 			 int replace)
 {
   AUTHCHECK;
-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [hurd,commited 2/5] hurd: Fix strcpy calls
  2020-11-23  0:35 [hurd,commited 0/5] gcc-11-related fixes Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 1/5] hurd: Fix _S_msg_get/set_env_variable prototype Samuel Thibault
@ 2020-11-23  0:35 ` Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 3/5] hurd S_msg_report_wait: Fix reporting ports Samuel Thibault
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Samuel Thibault @ 2020-11-23  0:35 UTC (permalink / raw)
  To: libc-alpha; +Cc: Samuel Thibault, commit-hurd

strcpy cannot be used with overlapping buffer, we have to use memmove
instead. strcpy also cannot be safely used when the destination buffer
is smaller that the source, we need to use strncpy to truncate the
source if needed.
---
 hurd/lookup-retry.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
index 6d8b05e4e6..348549e334 100644
--- a/hurd/lookup-retry.c
+++ b/hurd/lookup-retry.c
@@ -292,7 +292,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
 		  if (p < retryname)
 		    abort ();	/* XXX write this right if this ever happens */
 		  if (p > retryname)
-		    strcpy (retryname, p);
+		    memmove (retryname, p, strlen(p) + 1);
 		  startdir = *result;
 		}
 	      else
@@ -326,7 +326,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
 		  case '/':
 		    if (err = opentty (&startdir))
 		      goto out;
-		    strcpy (retryname, &retryname[4]);
+		    memmove (retryname, &retryname[4], strlen(retryname + 4) + 1);
 		    break;
 		  default:
 		    goto bad_magic;
@@ -344,7 +344,8 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
 		  p = _itoa (__getpid (), &buf[sizeof buf], 10, 0);
 		  len = &buf[sizeof buf] - p;
 		  memcpy (buf, p, len);
-		  strcpy (buf + len, &retryname[3]);
+		  strncpy (buf + len, &retryname[3], sizeof buf - len - 1);
+		  buf[sizeof buf - 1] = '\0';
 		  strcpy (retryname, buf);
 
 		  /* Do a normal retry on the remaining components.  */
-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [hurd,commited 3/5] hurd S_msg_report_wait: Fix reporting ports
  2020-11-23  0:35 [hurd,commited 0/5] gcc-11-related fixes Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 1/5] hurd: Fix _S_msg_get/set_env_variable prototype Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 2/5] hurd: Fix strcpy calls Samuel Thibault
@ 2020-11-23  0:35 ` Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 4/5] hurd S_msg_report_wait: Fix detecting fd ports Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 5/5] hurd report-wait: Fix stpcpy usage Samuel Thibault
  4 siblings, 0 replies; 6+ messages in thread
From: Samuel Thibault @ 2020-11-23  0:35 UTC (permalink / raw)
  To: libc-alpha; +Cc: Samuel Thibault, commit-hurd

This fixes the parameter order of MSG_EXAMINE, thus fixing the detection
of e.g. fd ports for nicer output in ps WAIT output.
---
 hurd/report-wait.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hurd/report-wait.c b/hurd/report-wait.c
index 487a5fb05a..752d0cc1c4 100644
--- a/hurd/report-wait.c
+++ b/hurd/report-wait.c
@@ -152,7 +152,7 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
 	      /* Blocked in a system call.  */
 	      if (*msgid == -25
 		  /* mach_msg system call.  Examine its parameters.  */
-		  && MSG_EXAMINE (&state, msgid, &send_port, &rcv_port,
+		  && MSG_EXAMINE (&state, msgid, &rcv_port, &send_port,
 				  &option, &timeout) == 0)
 		{
 		  char *p;
-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [hurd,commited 4/5] hurd S_msg_report_wait: Fix detecting fd ports
  2020-11-23  0:35 [hurd,commited 0/5] gcc-11-related fixes Samuel Thibault
                   ` (2 preceding siblings ...)
  2020-11-23  0:35 ` [hurd,commited 3/5] hurd S_msg_report_wait: Fix reporting ports Samuel Thibault
@ 2020-11-23  0:35 ` Samuel Thibault
  2020-11-23  0:35 ` [hurd,commited 5/5] hurd report-wait: Fix stpcpy usage Samuel Thibault
  4 siblings, 0 replies; 6+ messages in thread
From: Samuel Thibault @ 2020-11-23  0:35 UTC (permalink / raw)
  To: libc-alpha; +Cc: Samuel Thibault, commit-hurd

_hurd_init_dtable stays set to non-NULL, so we have to run through both
_hurd_init_dtable and _hurd_dtable.
---
 hurd/report-wait.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hurd/report-wait.c b/hurd/report-wait.c
index 752d0cc1c4..eba43c97a6 100644
--- a/hurd/report-wait.c
+++ b/hurd/report-wait.c
@@ -77,7 +77,7 @@ describe_port (string_t description, mach_port_t port)
 	if (port == _hurd_init_dtable[i])
 	  return describe_number (description, "fd#", i);
     }
-  else if (_hurd_dtable)
+  if (_hurd_dtable)
     {
       for (i = 0; i < _hurd_dtablesize; ++i)
 	if (_hurd_dtable[i] == NULL)
-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [hurd,commited 5/5] hurd report-wait: Fix stpcpy usage
  2020-11-23  0:35 [hurd,commited 0/5] gcc-11-related fixes Samuel Thibault
                   ` (3 preceding siblings ...)
  2020-11-23  0:35 ` [hurd,commited 4/5] hurd S_msg_report_wait: Fix detecting fd ports Samuel Thibault
@ 2020-11-23  0:35 ` Samuel Thibault
  4 siblings, 0 replies; 6+ messages in thread
From: Samuel Thibault @ 2020-11-23  0:35 UTC (permalink / raw)
  To: libc-alpha; +Cc: Samuel Thibault, commit-hurd

We shall not overflow the size of the description parameter. This makes
describe_number and describe_port behave like strpcpy (except for not filling
all the end of buffer with zeroes) and _S_msg_report_wait use series of
stpncpy-like call. If we were to overflow, we can now detect it and
return ENOMEM.
---
 hurd/report-wait.c | 78 +++++++++++++++++++++++++++++-----------------
 1 file changed, 49 insertions(+), 29 deletions(-)

diff --git a/hurd/report-wait.c b/hurd/report-wait.c
index eba43c97a6..291032142a 100644
--- a/hurd/report-wait.c
+++ b/hurd/report-wait.c
@@ -26,12 +26,16 @@
 #include <intr-msg.h>
 
 static char *
-describe_number (string_t description, const char *flavor, long int i)
+describe_number (char *description, const char *flavor, long int i, size_t size)
 {
   unsigned long int j;
-  char *p = flavor == NULL ? description : __stpcpy (description, flavor);
+  char *limit = description + size;
+  char *p = flavor == NULL ? description : __stpncpy (description, flavor, size);
   char *end;
 
+  if (p == limit)
+    return p;
+
   /* Handle sign.  */
   if (i < 0)
     {
@@ -39,15 +43,24 @@ describe_number (string_t description, const char *flavor, long int i)
       *p++ = '-';
     }
 
+  if (p == limit)
+    return p;
+
   /* Allocate space for the number at the end of DESCRIPTION.  */
   for (j = i; j >= 10; j /= 10)
     p++;
   end = p + 1;
-  *end = '\0';
+
+  if (end < limit)
+    *end = '\0';
+  else
+    end = limit;
 
   do
     {
-      *p-- = '0' + i % 10;
+      if (p < limit)
+	*p = '0' + i % 10;
+      p--;
       i /= 10;
     } while (i != 0);
 
@@ -55,27 +68,27 @@ describe_number (string_t description, const char *flavor, long int i)
 }
 
 static char *
-describe_port (string_t description, mach_port_t port)
+describe_port (char *description, mach_port_t port, size_t size)
 {
   int i;
 
   if (port == MACH_PORT_NULL)
-    return __stpcpy (description, "(null)");
+    return __stpncpy (description, "(null)", size);
   if (port == MACH_PORT_DEAD)
-    return __stpcpy (description, "(dead)");
+    return __stpncpy (description, "(dead)", size);
 
   if (port == __mach_task_self ())
-    return __stpcpy (description, "task-self");
+    return __stpncpy (description, "task-self", size);
 
   for (i = 0; i < _hurd_nports; ++i)
     if (port == _hurd_ports[i].port)
-      return describe_number (description, "init#", i);
+      return describe_number (description, "init#", i, size);
 
   if (_hurd_init_dtable)
     {
       for (i = 0; i < _hurd_init_dtablesize; ++i)
 	if (port == _hurd_init_dtable[i])
-	  return describe_number (description, "fd#", i);
+	  return describe_number (description, "fd#", i, size);
     }
   if (_hurd_dtable)
     {
@@ -83,12 +96,12 @@ describe_port (string_t description, mach_port_t port)
 	if (_hurd_dtable[i] == NULL)
 	  continue;
 	else if (port == _hurd_dtable[i]->port.port)
-	  return describe_number (description, "fd#", i);
+	  return describe_number (description, "fd#", i, size);
 	else if (port == _hurd_dtable[i]->ctty.port)
-	  return describe_number (description, "bgfd#", i);
+	  return describe_number (description, "bgfd#", i, size);
     }
 
-  return describe_number (description, "port#", port);
+  return describe_number (description, "port#", port, size);
 }
 
 
@@ -106,13 +119,15 @@ kern_return_t
 _S_msg_report_wait (mach_port_t msgport, thread_t thread,
 		    string_t description, mach_msg_id_t *msgid)
 {
+  char *limit = description + 1024; /* XXX */
+  char *cur = description;
   *msgid = 0;
 
   if (thread == _hurd_msgport_thread)
     /* Cute.  */
-    strcpy (description, "msgport");
+    cur = __stpncpy (cur, "msgport", limit - cur);
   else if (&_hurd_itimer_thread && thread == _hurd_itimer_thread)
-    strcpy (description, "itimer");
+    cur = __stpncpy (cur, "itimer", limit - cur);
   else
     {
       /* Make sure this is really one of our threads.  */
@@ -129,7 +144,7 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
 	return EINVAL;
 
       if (ss->suspended != MACH_PORT_NULL)
-	strcpy (description, "sigsuspend");
+	cur = __stpncpy (cur, "sigsuspend", limit - cur);
       else
 	{
 	  /* Examine the thread's state to see if it is blocked in an RPC.  */
@@ -155,7 +170,6 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
 		  && MSG_EXAMINE (&state, msgid, &rcv_port, &send_port,
 				  &option, &timeout) == 0)
 		{
-		  char *p;
 		  if (send_port != MACH_PORT_NULL && *msgid != 0)
 		    {
 		      /* For the normal case of RPCs, we consider the
@@ -168,13 +182,14 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
 			  /* This is a Hurd interruptible RPC.
 			     Mark it by surrounding the port description
 			     string with [...] brackets.  */
-			  description[0] = '[';
-			  p = describe_port (description + 1, send_port);
-			  *p++ = ']';
-			  *p = '\0';
+			  if (cur < limit)
+			    *cur++ = '[';
+			  cur = describe_port (cur, send_port, limit - cur);
+			  if (cur < limit)
+			    *cur++ = ']';
 			}
 		      else
-			(void) describe_port (description, send_port);
+			cur = describe_port (cur, send_port, limit - cur);
 		    }
 		  else if (rcv_port != MACH_PORT_NULL)
 		    {
@@ -183,7 +198,8 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
 			 some garbage or perhaps the msgid of the last
 			 message this thread received, but it's not a
 			 helpful thing to return.  */
-		      strcpy (describe_port (description, rcv_port), ":rcv");
+		      cur = describe_port (cur, rcv_port, limit - cur);
+		      cur = __stpncpy (cur, ":rcv", limit - cur);
 		      *msgid = 0;
 		    }
 		  else if ((option & (MACH_RCV_MSG|MACH_RCV_TIMEOUT))
@@ -193,27 +209,31 @@ _S_msg_report_wait (mach_port_t msgport, thread_t thread,
 			 pure timeout.  Report the timeout value (counted
 			 in milliseconds); note this is the original total
 			 time, not the time remaining.  */
-		      strcpy (describe_number (description, 0, timeout), "ms");
+		      cur = describe_number (cur, 0, timeout, limit - cur);
+		      cur = __stpncpy (cur, "ms", limit - cur);
 		      *msgid = 0;
 		    }
 		  else
 		    {
-		      strcpy (description, "mach_msg");
+		      cur = __stpncpy (cur, "mach_msg", limit - cur);
 		      *msgid = 0;
 		    }
 		}
 	      else		/* Some other system call.  */
 		{
-		  (void) describe_number (description, "syscall#", *msgid);
+		  cur = describe_number (cur, "syscall#", *msgid, limit - cur);
 		  *msgid = 0;
 		}
 	    }
-	  else
-	    description[0] = '\0';
 	}
     }
 
   __mach_port_deallocate (__mach_task_self (), thread);
+
+  if (cur == limit)
+    return ENOMEM;
+
+  *cur = '\0';
   return 0;
 }
 
@@ -232,7 +252,7 @@ _S_msg_describe_ports (mach_port_t msgport, mach_port_t refport,
   while (nports-- > 0)
     {
       char this[200];
-      describe_port (this, *ports++);
+      describe_port (this, *ports++, sizeof this);
       p = __stpncpy (p, this, end - p);
       if (p == end && p[-1] != '\0')
 	return ENOMEM;
-- 
2.29.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-11-23  0:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-23  0:35 [hurd,commited 0/5] gcc-11-related fixes Samuel Thibault
2020-11-23  0:35 ` [hurd,commited 1/5] hurd: Fix _S_msg_get/set_env_variable prototype Samuel Thibault
2020-11-23  0:35 ` [hurd,commited 2/5] hurd: Fix strcpy calls Samuel Thibault
2020-11-23  0:35 ` [hurd,commited 3/5] hurd S_msg_report_wait: Fix reporting ports Samuel Thibault
2020-11-23  0:35 ` [hurd,commited 4/5] hurd S_msg_report_wait: Fix detecting fd ports Samuel Thibault
2020-11-23  0:35 ` [hurd,commited 5/5] hurd report-wait: Fix stpcpy usage Samuel Thibault

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).