linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* sparse ctags segfaults (latest git)
@ 2018-01-01 22:58 foobar
  2018-01-02 15:11 ` [PATCH 0/2] fix crash in ctags.c Luc Van Oostenryck
  2018-01-04 17:43 ` sparse ctags segfaults (latest git) Christopher Li
  0 siblings, 2 replies; 12+ messages in thread
From: foobar @ 2018-01-01 22:58 UTC (permalink / raw)
  To: linux-sparse; +Cc: foobar

git version 08890dcd7cc77b5d776768775484ed60fc23f08e
linux x64_64 (using musl libc)

gdb --args ./ctags ctags.c

Reading symbols from /home/foobar/sparse/ctags...done.
(gdb) r
Starting program: /home/foobar/sparse/./ctags ctags.c
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ff9000
/usr/include/stdint.h:105:5: warning: constant 0xffffffffffffffffu is so big it is unsigned long
/usr/include/stdint.h:105:20: warning: constant 0xffffffffffffffffu is so big it is unsigned long

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401703 in examine_symbol (sym=0x7ffff7fc2ff0) at ctags.c:138
138                     if (base->type == SYM_FN)
(gdb) p base
$1 = (struct symbol *) 0x0
(gdb) bt
#0  0x0000000000401703 in examine_symbol (sym=0x7ffff7fc2ff0) at ctags.c:138
#1  0x00000000004018c8 in examine_namespace (sym=0x7ffff7fc2ff0) at ctags.c:193
#2  0x0000000000401999 in examine_symbol_list (list=0x7ffff7fd7010) at ctags.c:209
#3  0x0000000000401aac in main (argc=2, argv=0x7fffffffeb68) at ctags.c:223
(gdb) p sym
$2 = (struct symbol *) 0x7ffff7fc2ff0
(gdb) l
133             add_tag(sym);
134             base = sym->ctype.base_type;
135
136             switch (sym->type) {
137             case SYM_NODE:
138                     if (base->type == SYM_FN)
139                             sym->kind = 'f';
140                     examine_symbol(base);
141                     break;
142             case SYM_STRUCT:
(gdb) 


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

* [PATCH 0/2] fix crash in ctags.c
  2018-01-01 22:58 sparse ctags segfaults (latest git) foobar
@ 2018-01-02 15:11 ` Luc Van Oostenryck
  2018-01-02 15:11   ` [PATCH 1/2] give a type to builtin functions Luc Van Oostenryck
                     ` (2 more replies)
  2018-01-04 17:43 ` sparse ctags segfaults (latest git) Christopher Li
  1 sibling, 3 replies; 12+ messages in thread
From: Luc Van Oostenryck @ 2018-01-02 15:11 UTC (permalink / raw)
  To: linux-sparse; +Cc: foobar, Luc Van Oostenryck

This series contains two patches fixing a null pointer
dereference in ctags.

Note: part of the problem here is that the ctags tools directly
      use global_scope->symbols and that the builtins are in
      the global scope. I think they should be in a separate
      scope, but it'll be another story.

These patches are available in the Git repository at:
  git://github.com/lucvoo/sparse-dev.git fix-ctags-crash
and soon will be pushed at:
  git://github.com/lucvoo/sparse.git     master

Luc Van Oostenryck (2):
  give a type to builtin functions
  ctags: avoid null deref

 builtin.c | 6 +++---
 ctags.c   | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

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

* [PATCH 1/2] give a type to builtin functions
  2018-01-02 15:11 ` [PATCH 0/2] fix crash in ctags.c Luc Van Oostenryck
@ 2018-01-02 15:11   ` Luc Van Oostenryck
  2018-01-03 15:57     ` foobar
  2018-01-05 17:21     ` Christopher Li
  2018-01-02 15:11   ` [PATCH 2/2] ctags: avoid null deref Luc Van Oostenryck
  2018-01-04 17:44   ` [PATCH 0/2] fix crash in ctags.c Christopher Li
  2 siblings, 2 replies; 12+ messages in thread
From: Luc Van Oostenryck @ 2018-01-02 15:11 UTC (permalink / raw)
  To: linux-sparse; +Cc: foobar, Luc Van Oostenryck

When creating builtin functions via init-builtins(), it shouldn't
really be needed to give them a type because their purpose is only
as a placeholder for the symbol->op->{evaluate,expand,..}. Also,
they should be part of the builtin_scope and never be visible.

However, currently the global scope is the same as the builtin_scope
and these symbols are thus visible via global_scope->symbols where
the missing type can be a problem.

Fix this to giving to the builtin functions which hadn't a type
the same phony type as the other functions had.

Reported-by: foobar <foobar@redchan.it>
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 builtin.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/builtin.c b/builtin.c
index 9f90926cb..acb2fabe9 100644
--- a/builtin.c
+++ b/builtin.c
@@ -240,9 +240,9 @@ static struct sym_init {
 	{ "__builtin_warning", &builtin_fn_type, MOD_TOPLEVEL, &warning_op },
 	{ "__builtin_expect", &builtin_fn_type, MOD_TOPLEVEL, &expect_op },
 	{ "__builtin_choose_expr", &builtin_fn_type, MOD_TOPLEVEL, &choose_op },
-	{ "__builtin_bswap16", NULL, MOD_TOPLEVEL, &bswap_op },
-	{ "__builtin_bswap32", NULL, MOD_TOPLEVEL, &bswap_op },
-	{ "__builtin_bswap64", NULL, MOD_TOPLEVEL, &bswap_op },
+	{ "__builtin_bswap16", &builtin_fn_type, MOD_TOPLEVEL, &bswap_op },
+	{ "__builtin_bswap32", &builtin_fn_type, MOD_TOPLEVEL, &bswap_op },
+	{ "__builtin_bswap64", &builtin_fn_type, MOD_TOPLEVEL, &bswap_op },
 	{ NULL,		NULL,		0 }
 };
 
-- 
2.15.0


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

* [PATCH 2/2] ctags: avoid null deref
  2018-01-02 15:11 ` [PATCH 0/2] fix crash in ctags.c Luc Van Oostenryck
  2018-01-02 15:11   ` [PATCH 1/2] give a type to builtin functions Luc Van Oostenryck
@ 2018-01-02 15:11   ` Luc Van Oostenryck
  2018-01-03 15:55     ` foobar
  2018-01-04 17:44   ` [PATCH 0/2] fix crash in ctags.c Christopher Li
  2 siblings, 1 reply; 12+ messages in thread
From: Luc Van Oostenryck @ 2018-01-02 15:11 UTC (permalink / raw)
  To: linux-sparse; +Cc: foobar, Luc Van Oostenryck

Protect the dereference of null base_type.

Reported-by: foobar <foobar@redchan.it>
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 ctags.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ctags.c b/ctags.c
index 9ec6b3c37..30976542d 100644
--- a/ctags.c
+++ b/ctags.c
@@ -135,7 +135,7 @@ static void examine_symbol(struct symbol *sym)
 
 	switch (sym->type) {
 	case SYM_NODE:
-		if (base->type == SYM_FN)
+		if (base && base->type == SYM_FN)
 			sym->kind = 'f';
 		examine_symbol(base);
 		break;
-- 
2.15.0


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

* Re: [PATCH 2/2] ctags: avoid null deref
  2018-01-02 15:11   ` [PATCH 2/2] ctags: avoid null deref Luc Van Oostenryck
@ 2018-01-03 15:55     ` foobar
  2018-01-03 16:43       ` Luc Van Oostenryck
  0 siblings, 1 reply; 12+ messages in thread
From: foobar @ 2018-01-03 15:55 UTC (permalink / raw)
  To: Luc Van Oostenryck; +Cc: linux-sparse

Luc, thank you for addressing this issue so quickly!

On Tue,  2 Jan 2018 16:11:16 +0100
Luc Van Oostenryck <luc.vanoostenryck@gmail.com> wrote:

> Protect the dereference of null base_type.

I wonder, maybe it would be better not to add this protection so future similar bugs can be found ?

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

* Re: [PATCH 1/2] give a type to builtin functions
  2018-01-02 15:11   ` [PATCH 1/2] give a type to builtin functions Luc Van Oostenryck
@ 2018-01-03 15:57     ` foobar
  2018-01-03 16:41       ` Luc Van Oostenryck
  2018-01-05 17:21     ` Christopher Li
  1 sibling, 1 reply; 12+ messages in thread
From: foobar @ 2018-01-03 15:57 UTC (permalink / raw)
  To: Luc Van Oostenryck; +Cc: linux-sparse

On Tue,  2 Jan 2018 16:11:15 +0100
Luc Van Oostenryck <luc.vanoostenryck@gmail.com> wrote:

> When creating builtin functions via init-builtins(), it shouldn't
> really be needed to give them a type because their purpose is only
> as a placeholder for the symbol->op->{evaluate,expand,..}. Also,
> they should be part of the builtin_scope and never be visible.

yeah, it seems odd (and annoying at the same time) that ctags emits internal symbols __builtin_bswap16 and similar stuff, unlike exuberant ctags.

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

* Re: [PATCH 1/2] give a type to builtin functions
  2018-01-03 15:57     ` foobar
@ 2018-01-03 16:41       ` Luc Van Oostenryck
  2018-01-05 17:26         ` Christopher Li
  0 siblings, 1 reply; 12+ messages in thread
From: Luc Van Oostenryck @ 2018-01-03 16:41 UTC (permalink / raw)
  To: foobar; +Cc: linux-sparse

On Wed, Jan 03, 2018 at 03:57:43PM +0000, foobar wrote:
> On Tue,  2 Jan 2018 16:11:15 +0100
> Luc Van Oostenryck <luc.vanoostenryck@gmail.com> wrote:
> 
> > When creating builtin functions via init-builtins(), it shouldn't
> > really be needed to give them a type because their purpose is only
> > as a placeholder for the symbol->op->{evaluate,expand,..}. Also,
> > they should be part of the builtin_scope and never be visible.
> 
> yeah, it seems odd (and annoying at the same time) that ctags emits internal symbols __builtin_bswap16 and similar stuff, unlike exuberant ctags.

There is several ways to change this but I need to think a bit
about it.

There is also that sparse's ctags work on the preprocessed source
while, I think, other ctags work purely on the lexical level,
thus on non-preprocessed sources.

Ciao and hanks for the bug repport
-- Luc

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

* Re: [PATCH 2/2] ctags: avoid null deref
  2018-01-03 15:55     ` foobar
@ 2018-01-03 16:43       ` Luc Van Oostenryck
  0 siblings, 0 replies; 12+ messages in thread
From: Luc Van Oostenryck @ 2018-01-03 16:43 UTC (permalink / raw)
  To: foobar; +Cc: linux-sparse

On Wed, Jan 03, 2018 at 03:55:23PM +0000, foobar wrote:
> Luc, thank you for addressing this issue so quickly!
> 
> On Tue,  2 Jan 2018 16:11:16 +0100
> Luc Van Oostenryck <luc.vanoostenryck@gmail.com> wrote:
> 
> > Protect the dereference of null base_type.
> 
> I wonder, maybe it would be better not to add this protection so future similar bugs can be found ?

When there have been a previous error, a warning is issued and
often (but depending on the exact nature of the problem)
the returned pointer is null. So it's kinda normal to have
such pointer and we need to test them before continuing.
So, I really think the patch here is needed.

-- Luc

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

* Re: sparse ctags segfaults (latest git)
  2018-01-01 22:58 sparse ctags segfaults (latest git) foobar
  2018-01-02 15:11 ` [PATCH 0/2] fix crash in ctags.c Luc Van Oostenryck
@ 2018-01-04 17:43 ` Christopher Li
  1 sibling, 0 replies; 12+ messages in thread
From: Christopher Li @ 2018-01-04 17:43 UTC (permalink / raw)
  To: foobar; +Cc: Linux-Sparse

On Tue, Jan 2, 2018 at 6:58 AM, foobar <foobar@redchan.it> wrote:
> git version 08890dcd7cc77b5d776768775484ed60fc23f08e
> linux x64_64 (using musl libc)
>
> gdb --args ./ctags ctags.c
>
> Reading symbols from /home/foobar/sparse/ctags...done.
> (gdb) r
> Starting program: /home/foobar/sparse/./ctags ctags.c
> warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ff9000
> /usr/include/stdint.h:105:5: warning: constant 0xffffffffffffffffu is so big it is unsigned long
> /usr/include/stdint.h:105:20: warning: constant 0xffffffffffffffffu is so big it is unsigned long

Thanks for the bug report.

Chris

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

* Re: [PATCH 0/2] fix crash in ctags.c
  2018-01-02 15:11 ` [PATCH 0/2] fix crash in ctags.c Luc Van Oostenryck
  2018-01-02 15:11   ` [PATCH 1/2] give a type to builtin functions Luc Van Oostenryck
  2018-01-02 15:11   ` [PATCH 2/2] ctags: avoid null deref Luc Van Oostenryck
@ 2018-01-04 17:44   ` Christopher Li
  2 siblings, 0 replies; 12+ messages in thread
From: Christopher Li @ 2018-01-04 17:44 UTC (permalink / raw)
  To: Luc Van Oostenryck; +Cc: Linux-Sparse, foobar

On Tue, Jan 2, 2018 at 11:11 PM, Luc Van Oostenryck
<luc.vanoostenryck@gmail.com> wrote:
> This series contains two patches fixing a null pointer
> dereference in ctags.
>
> Note: part of the problem here is that the ctags tools directly
>       use global_scope->symbols and that the builtins are in
>       the global scope. I think they should be in a separate
>       scope, but it'll be another story.
>
> These patches are available in the Git repository at:
>   git://github.com/lucvoo/sparse-dev.git fix-ctags-crash
> and soon will be pushed at:
>   git://github.com/lucvoo/sparse.git     master
>
> Luc Van Oostenryck (2):
>   give a type to builtin functions
>   ctags: avoid null deref

Sorry for the late reply. I will take a look at it tomorrow.
Too late for me to think straight now.

Thanks for the patches

Chris

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

* Re: [PATCH 1/2] give a type to builtin functions
  2018-01-02 15:11   ` [PATCH 1/2] give a type to builtin functions Luc Van Oostenryck
  2018-01-03 15:57     ` foobar
@ 2018-01-05 17:21     ` Christopher Li
  1 sibling, 0 replies; 12+ messages in thread
From: Christopher Li @ 2018-01-05 17:21 UTC (permalink / raw)
  To: Luc Van Oostenryck; +Cc: Linux-Sparse, foobar

On Tue, Jan 2, 2018 at 11:11 PM, Luc Van Oostenryck
<luc.vanoostenryck@gmail.com> wrote:
> When creating builtin functions via init-builtins(), it shouldn't
> really be needed to give them a type because their purpose is only
> as a placeholder for the symbol->op->{evaluate,expand,..}. Also,
> they should be part of the builtin_scope and never be visible.
>
> However, currently the global scope is the same as the builtin_scope
> and these symbols are thus visible via global_scope->symbols where
> the missing type can be a problem.
>
> Fix this to giving to the builtin functions which hadn't a type
> the same phony type as the other functions had.

My casual look this seem fine to me.

Thanks for the fix.

Chris

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

* Re: [PATCH 1/2] give a type to builtin functions
  2018-01-03 16:41       ` Luc Van Oostenryck
@ 2018-01-05 17:26         ` Christopher Li
  0 siblings, 0 replies; 12+ messages in thread
From: Christopher Li @ 2018-01-05 17:26 UTC (permalink / raw)
  To: Luc Van Oostenryck; +Cc: foobar, Linux-Sparse

On Thu, Jan 4, 2018 at 12:41 AM, Luc Van Oostenryck
<luc.vanoostenryck@gmail.com> wrote:
>>
>> yeah, it seems odd (and annoying at the same time) that ctags emits internal symbols __builtin_bswap16 and similar stuff, unlike exuberant ctags.
>
> There is several ways to change this but I need to think a bit
> about it.

The builtin needs to be in the global scope because we don't want to lose
those function when sparse switch to the next C files.
>
> There is also that sparse's ctags work on the preprocessed source
> while, I think, other ctags work purely on the lexical level,
> thus on non-preprocessed sources.

Yes, that is by design. It is a useful feature to find out those
symbol generated from the macro expansion.

I have one idea, I haven't look closely how piratical it is.
I think we can filter out the __buildin_xxx functions by looking at
the some builtin flags in the symbol.

Chris

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

end of thread, other threads:[~2018-01-05 17:26 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-01 22:58 sparse ctags segfaults (latest git) foobar
2018-01-02 15:11 ` [PATCH 0/2] fix crash in ctags.c Luc Van Oostenryck
2018-01-02 15:11   ` [PATCH 1/2] give a type to builtin functions Luc Van Oostenryck
2018-01-03 15:57     ` foobar
2018-01-03 16:41       ` Luc Van Oostenryck
2018-01-05 17:26         ` Christopher Li
2018-01-05 17:21     ` Christopher Li
2018-01-02 15:11   ` [PATCH 2/2] ctags: avoid null deref Luc Van Oostenryck
2018-01-03 15:55     ` foobar
2018-01-03 16:43       ` Luc Van Oostenryck
2018-01-04 17:44   ` [PATCH 0/2] fix crash in ctags.c Christopher Li
2018-01-04 17:43 ` sparse ctags segfaults (latest git) Christopher Li

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 NNTP newsgroup(s).