This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Updated patch for Bug 13217 - thread apply all detach throws a SEGFAULT


On Wed, 26 Sep 2012 13:44:27 +0200, ali_anwar wrote:
[...]
> --- 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 *);

Forward declaration not needed when all callers are after the function
definition like in this case.


>  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. */

Empty line between a function comment tnd the function implementation.
Also the comment should end with two spaces:
	/* Return true if TP is valid thread.  */

> +static int
> +thread_valid (struct thread_info *tp)
> +{
> +  struct thread_info  *utp;

Two spaces, use one.  Use empty line between declarations and code statements.

> +  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)

Space before function parameters:
	thread_valid (tp)


>      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)

Space before function parameters:
	thread_count ()


> +	  break;

This will not work universally.  I did not try it but one can do something
like:
	thread apply all call func()

Where func() will pthread_cancel some threads but not all of them.  In such
case thread_count() will not be 0 but still tp->next may be invalid crashing
GDB.

You can remember 'num' and always try to find 'num + 1' thread or any higher
than 'num'.


Thanks,
Jan


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]