Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Shaun Jackman <sjackman@gmail.com>
To: Richard Earnshaw <rearnsha@gcc.gnu.org>, gdb-patches@sources.redhat.com
Subject: Re: sim/arm/armos.c: IsTTY [PATCH]
Date: Sat, 17 Sep 2005 23:32:00 -0000	[thread overview]
Message-ID: <7f45d939050917163241caaa41@mail.gmail.com> (raw)
In-Reply-To: <20050917223728.GL8777@nevyn.them.org>

[-- Attachment #1: Type: text/plain, Size: 5900 bytes --]

2005/9/17, Daniel Jacobowitz <drow@false.org>:
> I'd recommend following Richard's suggestion: use PATH_MAX, if it's not
> there, default to 1K.

OK.

> You might want a helper function for this, since it happens in a lot of
> places.  Also, braces on their own lines.

Done.
 
> Otherwise it looks fine to me.

Great!

Cheers,
Shaun

2005-09-17  Shaun Jackman  <sjackman@gmail.com>

	* sim/arm/armos.c: Include limits.h
	(unlink): Remove this macro. It is unused in this file and
	conflicts with sim_callback->unlink.
	(PATH_MAX): Define as 1024 if not already defined.
	(ReadFileName): New function.
	(SWIopen): Fix a potential buffer overflow.
	(SWIremove): New function.
	(SWIrename): Ditto.
	(ARMul_OSHandleSWI): Handle the RDP calls SWI_IsTTY,
	SWI_Remove, and SWI_Rename, as well as the RDI calls
	AngelSWI_Reason_IsTTY, AngelSWI_Reason_Remove, and
	AngelSWI_Reason_Rename.

Index: sim/arm/armos.c
===================================================================
RCS file: /cvs/src/src/sim/arm/armos.c,v
retrieving revision 1.22
diff -u -r1.22 armos.c
--- sim/arm/armos.c	12 May 2005 07:36:58 -0000	1.22
+++ sim/arm/armos.c	17 Sep 2005 23:24:51 -0000
@@ -27,6 +27,7 @@
 
 #include <time.h>
 #include <errno.h>
+#include <limits.h>
 #include <string.h>
 #include "targ-vals.h"
 
@@ -34,10 +35,6 @@
 #define TARGET_O_BINARY 0
 #endif
 
-#ifdef __STDC__
-#define unlink(s) remove(s)
-#endif
-
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>		/* For SEEK_SET etc.  */
 #endif
@@ -89,6 +86,9 @@
 #define FOPEN_MAX 64
 #endif
 #define UNIQUETEMPS 256
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
 
 /* OS private Information.  */
 
@@ -299,22 +299,34 @@
   while (temp != 0);
 }
 
+static int
+ReadFileName(ARMul_State *state, char *buf, ARMword src, size_t n)
+{
+  struct OSblock *OSptr = (struct OSblock *) state->OSptr;
+  char *p = buf;
+
+  while (n--)
+    if ((*p++ = ARMul_SafeReadByte (state, src++)) == '\0')
+      return 0;
+  OSptr->ErrorNo = cb_host_to_target_errno(sim_callback, ENAMETOOLONG);
+  return state->Reg[0] = -1;
+}
+
 static void
 SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags)
 {
   struct OSblock *OSptr = (struct OSblock *) state->OSptr;
-  char dummy[2000];
+  char buf[PATH_MAX];
   int flags;
-  int i;
 
-  for (i = 0; (dummy[i] = ARMul_SafeReadByte (state, name + i)); i++)
-    ;
+  if (ReadFileName(state, buf, name, sizeof buf) == -1)
+    return;
 
   /* Now we need to decode the Demon open mode.  */
   flags = translate_open_mode[SWIflags];
 
   /* Filename ":tt" is special: it denotes stdin/out.  */
-  if (strcmp (dummy, ":tt") == 0)
+  if (strcmp (buf, ":tt") == 0)
     {
       if (flags == TARGET_O_RDONLY) /* opening tty "r" */
 	state->Reg[0] = 0;	/* stdin */
@@ -323,7 +335,7 @@
     }
   else
     {
-      state->Reg[0] = sim_callback->open (sim_callback, dummy, flags);
+      state->Reg[0] = sim_callback->open (sim_callback, buf, flags);
       OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
     }
 }
@@ -403,6 +415,33 @@
   OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
 }
 
+static void
+SWIremove (ARMul_State * state, ARMword path)
+{
+  char buf[PATH_MAX];
+
+  if (ReadFileName(state, buf, path, sizeof buf) != -1)
+  {
+    struct OSblock *OSptr = (struct OSblock *) state->OSptr;
+    state->Reg[0] = sim_callback->unlink (sim_callback, buf);
+    OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+  }
+}
+
+static void
+SWIrename (ARMul_State * state, ARMword old, ARMword new)
+{
+  char oldbuf[PATH_MAX], newbuf[PATH_MAX];
+
+  if (ReadFileName(state, oldbuf, old, sizeof oldbuf) != -1 &&
+      ReadFileName(state, newbuf, new, sizeof newbuf) != -1)
+  {
+    struct OSblock *OSptr = (struct OSblock *) state->OSptr;
+    state->Reg[0] = sim_callback->rename (sim_callback, oldbuf, newbuf);
+    OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+  }
+}
+
 /* The emulator calls this routine when a SWI instruction is encuntered.
    The parameter passed is the SWI number (lower 24 bits of the
instruction).  */
 
@@ -544,6 +583,30 @@
       state->Emulate = FALSE;
       break;
 
+    case SWI_Remove:
+      if (swi_mask & SWI_MASK_DEMON)
+	SWIremove (state, state->Reg[0]);
+      else
+	unhandled = TRUE;
+      break;
+
+    case SWI_Rename:
+      if (swi_mask & SWI_MASK_DEMON)
+	SWIrename (state, state->Reg[0], state->Reg[1]);
+      else
+	unhandled = TRUE;
+      break;
+
+    case SWI_IsTTY:
+      if (swi_mask & SWI_MASK_DEMON)
+	{
+	  state->Reg[0] = sim_callback->isatty (sim_callback, state->Reg[0]);
+	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+	}
+      else
+	unhandled = TRUE;
+      break;
+
       /* Handle Angel SWIs as well as Demon ones.  */
     case AngelSWI_ARM:
     case AngelSWI_Thumb:
@@ -566,10 +629,7 @@
 	  
 	      /* Unimplemented reason codes.  */
 	    case AngelSWI_Reason_ReadC:
-	    case AngelSWI_Reason_IsTTY:
 	    case AngelSWI_Reason_TmpNam:
-	    case AngelSWI_Reason_Remove:
-	    case AngelSWI_Reason_Rename:
 	    case AngelSWI_Reason_System:
 	    case AngelSWI_Reason_EnterSVC:
 	    default:
@@ -684,6 +744,21 @@
 			ARMul_ReadWord (state, addr + 4),
 			ARMul_ReadWord (state, addr + 8));
 	      break;
+
+	    case AngelSWI_Reason_IsTTY:
+	      state->Reg[0] = sim_callback->close (sim_callback,
+						   ARMul_ReadWord (state, addr));
+	      OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+	      break;
+
+	    case AngelSWI_Reason_Remove:
+	      SWIremove (state,
+			 ARMul_ReadWord (state, addr));
+
+	    case AngelSWI_Reason_Rename:
+	      SWIrename (state,
+			 ARMul_ReadWord (state, addr),
+			 ARMul_ReadWord (state, addr + 4));
 	    }
 	}
       else

[-- Attachment #2: sim-arm-swi.diff --]
[-- Type: text/plain, Size: 5348 bytes --]

2005-09-17  Shaun Jackman  <sjackman@gmail.com>

	* sim/arm/armos.c: Include limits.h
	(unlink): Remove this macro. It is unused in this file and
	conflicts with sim_callback->unlink.
	(PATH_MAX): Define as 1024 if not already defined.
	(ReadFileName): New function.
	(SWIopen): Fix a potential buffer overflow.
	(SWIremove): New function.
	(SWIrename): Ditto.
	(ARMul_OSHandleSWI): Handle the RDP calls SWI_IsTTY,
	SWI_Remove, and SWI_Rename, as well as the RDI calls
	AngelSWI_Reason_IsTTY, AngelSWI_Reason_Remove, and
	AngelSWI_Reason_Rename.

Index: sim/arm/armos.c
===================================================================
RCS file: /cvs/src/src/sim/arm/armos.c,v
retrieving revision 1.22
diff -u -r1.22 armos.c
--- sim/arm/armos.c	12 May 2005 07:36:58 -0000	1.22
+++ sim/arm/armos.c	17 Sep 2005 23:24:51 -0000
@@ -27,6 +27,7 @@
 
 #include <time.h>
 #include <errno.h>
+#include <limits.h>
 #include <string.h>
 #include "targ-vals.h"
 
@@ -34,10 +35,6 @@
 #define TARGET_O_BINARY 0
 #endif
 
-#ifdef __STDC__
-#define unlink(s) remove(s)
-#endif
-
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>		/* For SEEK_SET etc.  */
 #endif
@@ -89,6 +86,9 @@
 #define FOPEN_MAX 64
 #endif
 #define UNIQUETEMPS 256
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
 
 /* OS private Information.  */
 
@@ -299,22 +299,34 @@
   while (temp != 0);
 }
 
+static int
+ReadFileName(ARMul_State *state, char *buf, ARMword src, size_t n)
+{
+  struct OSblock *OSptr = (struct OSblock *) state->OSptr;
+  char *p = buf;
+
+  while (n--)
+    if ((*p++ = ARMul_SafeReadByte (state, src++)) == '\0')
+      return 0;
+  OSptr->ErrorNo = cb_host_to_target_errno(sim_callback, ENAMETOOLONG);
+  return state->Reg[0] = -1;
+}
+
 static void
 SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags)
 {
   struct OSblock *OSptr = (struct OSblock *) state->OSptr;
-  char dummy[2000];
+  char buf[PATH_MAX];
   int flags;
-  int i;
 
-  for (i = 0; (dummy[i] = ARMul_SafeReadByte (state, name + i)); i++)
-    ;
+  if (ReadFileName(state, buf, name, sizeof buf) == -1)
+    return;
 
   /* Now we need to decode the Demon open mode.  */
   flags = translate_open_mode[SWIflags];
 
   /* Filename ":tt" is special: it denotes stdin/out.  */
-  if (strcmp (dummy, ":tt") == 0)
+  if (strcmp (buf, ":tt") == 0)
     {
       if (flags == TARGET_O_RDONLY) /* opening tty "r" */
 	state->Reg[0] = 0;	/* stdin */
@@ -323,7 +335,7 @@
     }
   else
     {
-      state->Reg[0] = sim_callback->open (sim_callback, dummy, flags);
+      state->Reg[0] = sim_callback->open (sim_callback, buf, flags);
       OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
     }
 }
@@ -403,6 +415,33 @@
   OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
 }
 
+static void
+SWIremove (ARMul_State * state, ARMword path)
+{
+  char buf[PATH_MAX];
+
+  if (ReadFileName(state, buf, path, sizeof buf) != -1)
+  {
+    struct OSblock *OSptr = (struct OSblock *) state->OSptr;
+    state->Reg[0] = sim_callback->unlink (sim_callback, buf);
+    OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+  }
+}
+
+static void
+SWIrename (ARMul_State * state, ARMword old, ARMword new)
+{
+  char oldbuf[PATH_MAX], newbuf[PATH_MAX];
+
+  if (ReadFileName(state, oldbuf, old, sizeof oldbuf) != -1 &&
+      ReadFileName(state, newbuf, new, sizeof newbuf) != -1)
+  {
+    struct OSblock *OSptr = (struct OSblock *) state->OSptr;
+    state->Reg[0] = sim_callback->rename (sim_callback, oldbuf, newbuf);
+    OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+  }
+}
+
 /* The emulator calls this routine when a SWI instruction is encuntered.
    The parameter passed is the SWI number (lower 24 bits of the instruction).  */
 
@@ -544,6 +583,30 @@
       state->Emulate = FALSE;
       break;
 
+    case SWI_Remove:
+      if (swi_mask & SWI_MASK_DEMON)
+	SWIremove (state, state->Reg[0]);
+      else
+	unhandled = TRUE;
+      break;
+
+    case SWI_Rename:
+      if (swi_mask & SWI_MASK_DEMON)
+	SWIrename (state, state->Reg[0], state->Reg[1]);
+      else
+	unhandled = TRUE;
+      break;
+
+    case SWI_IsTTY:
+      if (swi_mask & SWI_MASK_DEMON)
+	{
+	  state->Reg[0] = sim_callback->isatty (sim_callback, state->Reg[0]);
+	  OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+	}
+      else
+	unhandled = TRUE;
+      break;
+
       /* Handle Angel SWIs as well as Demon ones.  */
     case AngelSWI_ARM:
     case AngelSWI_Thumb:
@@ -566,10 +629,7 @@
 	  
 	      /* Unimplemented reason codes.  */
 	    case AngelSWI_Reason_ReadC:
-	    case AngelSWI_Reason_IsTTY:
 	    case AngelSWI_Reason_TmpNam:
-	    case AngelSWI_Reason_Remove:
-	    case AngelSWI_Reason_Rename:
 	    case AngelSWI_Reason_System:
 	    case AngelSWI_Reason_EnterSVC:
 	    default:
@@ -684,6 +744,21 @@
 			ARMul_ReadWord (state, addr + 4),
 			ARMul_ReadWord (state, addr + 8));
 	      break;
+
+	    case AngelSWI_Reason_IsTTY:
+	      state->Reg[0] = sim_callback->close (sim_callback,
+						   ARMul_ReadWord (state, addr));
+	      OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
+	      break;
+
+	    case AngelSWI_Reason_Remove:
+	      SWIremove (state,
+			 ARMul_ReadWord (state, addr));
+
+	    case AngelSWI_Reason_Rename:
+	      SWIrename (state,
+			 ARMul_ReadWord (state, addr),
+			 ARMul_ReadWord (state, addr + 4));
 	    }
 	}
       else

  reply	other threads:[~2005-09-17 23:32 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-15 21:19 Shaun Jackman
2005-08-22 18:51 ` Shaun Jackman
2005-08-30  2:38 ` Daniel Jacobowitz
2005-09-06 16:22   ` Richard Earnshaw
2005-09-07 16:51   ` Shaun Jackman
2005-09-08  9:07     ` Richard Earnshaw
2005-09-08 19:28       ` Eli Zaretskii
2005-09-09 17:16       ` Shaun Jackman
2005-09-09 17:23       ` Shaun Jackman
2005-09-17 22:37         ` Daniel Jacobowitz
2005-09-17 23:32           ` Shaun Jackman [this message]
2005-09-18  1:14             ` Daniel Jacobowitz
2005-09-18  2:40               ` Shaun Jackman
2005-09-18  2:59                 ` Daniel Jacobowitz
     [not found]                 ` <20050918025653.GA4285@nevyn.them.org>
     [not found]                   ` <7f45d93905091720161f61e995@mail.gmail.com>
     [not found]                     ` <20050918033152.GA6546@nevyn.them.org>
2005-10-13 20:30                       ` Shaun Jackman
2005-10-19 16:12                 ` Shaun Jackman
2005-11-17 10:49                   ` Daniel Jacobowitz
2005-11-17 15:54                     ` Shaun Jackman
2005-09-18  3:32           ` Eli Zaretskii
2005-09-18  3:44             ` Daniel Jacobowitz
2005-09-18  9:04               ` Mark Kettenis
2005-09-18 19:13                 ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7f45d939050917163241caaa41@mail.gmail.com \
    --to=sjackman@gmail.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=rearnsha@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox