From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4761 invoked by alias); 26 Sep 2012 11:46:21 -0000 Received: (qmail 4753 invoked by uid 22791); 26 Sep 2012 11:46:20 -0000 X-SWARE-Spam-Status: No, hits=-0.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_CP X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 26 Sep 2012 11:46:07 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1TGq47-0001xd-Cu from Ali_Anwar@mentor.com for gdb-patches@sourceware.org; Wed, 26 Sep 2012 04:46:07 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Wed, 26 Sep 2012 04:46:07 -0700 Received: from [137.202.157.121] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server (TLS) id 14.1.289.1; Wed, 26 Sep 2012 12:46:05 +0100 Message-ID: <5062EA9B.1060505@codesourcery.com> Date: Wed, 26 Sep 2012 11:46:00 -0000 From: ali_anwar User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.28) Gecko/20120313 Thunderbird/3.1.20 MIME-Version: 1.0 To: Subject: Updated patch for Bug 13217 - thread apply all detach throws a SEGFAULT Content-Type: multipart/mixed; boundary="------------090501070000060708050306" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-09/txt/msg00580.txt.bz2 --------------090501070000060708050306 Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 500 Fixed a formating issue... Attached patch is for Bug 13217 - "thread apply all detach throws a SEGFAULT". Issue: Segmentation fault was coming from invalid access to tp->* i.e "tp->ptid". Fix: Check if the thread is valid before we apply a command Check for the thread count after executing a command on every thread Testing: * Tested on powerpc-linux as well as i686-pc-linux * Also checked with valgrind Test case: Added a test case to test "thread apply all detach" command Regards, -Ali --------------090501070000060708050306 Content-Type: text/x-patch; name="Bug13217.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="Bug13217.patch" Content-length: 2839 Index: ChangeLog =================================================================== RCS file: /cvs/src/src/ChangeLog,v retrieving revision 1.1036 diff -u -r1.1036 ChangeLog --- ChangeLog 21 Sep 2012 15:16:59 -0000 1.1036 +++ ChangeLog 26 Sep 2012 09:51:12 -0000 @@ -1,3 +1,9 @@ +2012-09-21 Ali Anwar + + PR threads/13217 + * thread.c (thread_valid): New function. + (thread_apply_all_command): Check for valid thread and thread count. + 2012-09-21 Steve Ellcey * configure.ac: Add mips*-mti-elf* target. Index: gdb/thread.c =================================================================== RCS file: /cvs/src/src/gdb/thread.c,v retrieving revision 1.149 diff -u -r1.149 thread.c --- gdb/thread.c 27 Jul 2012 00:52:36 -0000 1.149 +++ gdb/thread.c 26 Sep 2012 09:51:13 -0000 @@ -57,6 +57,7 @@ struct thread_info *thread_list = NULL; static int highest_thread_num; +static int thread_valid (struct thread_info *); static void thread_command (char *tidstr, int from_tty); static void thread_apply_all_command (char *, int); static int thread_alive (struct thread_info *); @@ -73,6 +74,17 @@ return tp; } +/* Return true if TP is valid thread. */ +static int +thread_valid (struct thread_info *tp) +{ + struct thread_info *utp; + for (utp = thread_list; utp; utp = utp->next) + if (tp == utp) + return 1; + return 0; +} + void delete_step_resume_breakpoint (struct thread_info *tp) { @@ -1193,7 +1205,7 @@ execute_command. */ saved_cmd = xstrdup (cmd); make_cleanup (xfree, saved_cmd); - for (tp = thread_list; tp; tp = tp->next) + for (tp = thread_list; thread_valid(tp); tp = tp->next) if (thread_alive (tp)) { switch_to_thread (tp->ptid); @@ -1203,6 +1215,8 @@ execute_command (cmd, from_tty); strcpy (cmd, saved_cmd); /* Restore exact command used previously. */ + if (thread_count() == 0) + break; } do_cleanups (old_chain); Index: gdb/testsuite/gdb.threads/threadapply.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.threads/threadapply.exp,v retrieving revision 1.15 diff -u -r1.15 threadapply.exp --- gdb/testsuite/gdb.threads/threadapply.exp 26 Jun 2012 19:23:20 -0000 1.15 +++ gdb/testsuite/gdb.threads/threadapply.exp 26 Sep 2012 09:51:14 -0000 @@ -63,3 +63,4 @@ gdb_test "up" ".*in main.*" "go up in the stack frame" gdb_test "thread apply all print 1" "Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1" "run a simple print command on all threads" gdb_test "down" "#0.*thread_function.*" "go down and check selected frame" +gdb_test "thread apply all detach" "Detaching from.*" "detach all threads" --------------090501070000060708050306--