* remote.c (remote_threads_info, remote_current_thread): Use
authorJim Blandy <jimb@codesourcery.com>
Tue, 7 Dec 2004 20:21:32 +0000 (20:21 +0000)
committerJim Blandy <jimb@codesourcery.com>
Tue, 7 Dec 2004 20:21:32 +0000 (20:21 +0000)
strtoul to parse thread ID numbers.

gdb/ChangeLog
gdb/remote.c

index 6cf5b29..c6e208c 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-07  Jim Blandy  <jimb@redhat.com>
+
+       * remote.c (remote_threads_info, remote_current_thread): Use
+       strtoul to parse thread ID numbers.
+
 2004-12-07  Mark Kettenis  <kettenis@gnu.org>
 
        * inf-ttrace.c: Include "gdbthread.h".
index c88a13c..8f7a181 100644 (file)
@@ -1735,7 +1735,12 @@ remote_current_thread (ptid_t oldpid)
   putpkt ("qC");
   getpkt (buf, (rs->remote_packet_size), 0);
   if (buf[0] == 'Q' && buf[1] == 'C')
-    return pid_to_ptid (strtol (&buf[2], NULL, 16));
+    /* Use strtoul here, so we'll correctly parse values whose highest
+       bit is set.  The protocol carries them as a simple series of
+       hex digits; in the absence of a sign, strtol will see such
+       values as positive numbers out of range for signed 'long', and
+       return LONG_MAX to indicate an overflow.  */
+    return pid_to_ptid (strtoul (&buf[2], NULL, 16));
   else
     return oldpid;
 }
@@ -1782,7 +1787,13 @@ remote_threads_info (void)
            {
              do
                {
-                 tid = strtol (bufp, &bufp, 16);
+                 /* Use strtoul here, so we'll correctly parse values
+                    whose highest bit is set.  The protocol carries
+                    them as a simple series of hex digits; in the
+                    absence of a sign, strtol will see such values as
+                    positive numbers out of range for signed 'long',
+                    and return LONG_MAX to indicate an overflow.  */
+                 tid = strtoul (bufp, &bufp, 16);
                  if (tid != 0 && !in_thread_list (pid_to_ptid (tid)))
                    add_thread (pid_to_ptid (tid));
                }