[GRASS5] Re: [bug #2767] (grass) r.stats bug (due to recent

Markus Neteler neteler at itc.it
Thu Dec 9 04:35:16 EST 2004


On Wed, Dec 08, 2004 at 09:51:08PM +0100, Paul Kelly via RT wrote:
> Hello Thierry
> 
> On Tue, 7 Dec 2004 tlaronde at polynum.com wrote:
> 
> > Hello,
> >
> > I haven't look at the code you are trying to fix (I have some other
> > stuff ;-), but here are some tips :
> >
> [...]
> Snip explanation of why my suggested fix was completely wrong
> [...]
> >
> > So a correct sequence is :
> >
> > title = (char *) malloc(expected_size_of_string_plus_trailing_null);
> > *title = '\0'; /* default to empty if intitle not set */
> >
> 
> The first line here is more or less what G_store() does. But the recent 
> change added
> if ( s == NULL ) return NULL ;
> to G_store.

This change was needed to make db.login happy
(locally discussed with Radim).

> Perhaps (going by what you suggest above) it should look more like:
> char *G_store (char *s)
> {
>    char *buf;
> 
>    if ( s == NULL )
>      *buf = '\0';
>    else
>    {
>      buf = G_malloc (strlen(s) + 1);
>      strcpy (buf, s);
>    }
>    return buf;
> }

... also crashing:

(gdb) r -anC fields,elevation.10m
Starting program: /hardmnt/thuille0/ssi/software/cvsgrass57/dist.i686-pc-linux-gnu/bin/r.stats -anC fields,elevation.10m

Program received signal SIGSEGV, Segmentation fault.
0x00306657 in G_set_raster_cats_title (title=0xbfffb3c0 "", pcats=0x7a2d4fd0) at cats.c:1536
1536        pcats->title = G_store (title);
(gdb) bt
#0  0x00306657 in G_set_raster_cats_title (title=0xbfffb3c0 "", pcats=0x7a2d4fd0) at cats.c:1536
#1  0x0030657c in G_init_raster_cats (title=0xbfffb3c0 "", pcats=0x7a2d4fd0) at cats.c:1488
#2  0x00304fcb in G__read_cats (element=0x340840 "cats", name=0x94a0520 "elevation.10m",
    mapset=0x94a0218 "PERMANENT", pcats=0x7a2d4fd0, full=1) at cats.c:488
#3  0x00304cb5 in G_read_raster_cats (name=0x94a0520 "elevation.10m",
    mapset=0x94a0218 "PERMANENT", pcats=0x7a2d4fd0) at cats.c:372
#4  0x00304c80 in G_read_cats (name=0x94a0520 "elevation.10m", mapset=0x94a0218 "PERMANENT",
    pcats=0x7a2d4fd0) at cats.c:350
#5  0x0804a402 in main (argc=3, argv=0xbfffbb24) at main.c:269

Is it possible that 'pcats' isn't initialized properly?

If I run it in 'ddd' and add a break point to the first line of G_init_raster_cats()
in lib/gis/cats.c:
G_init_raster_cats (char *title, struct Categories *pcats)
{
    G_set_raster_cats_title (title, pcats); 

just before segfaulting, pcats isn't initialized.

So maybe G__read_cats() in G_read_raster_cats() called by G_read_cats() 
already fails? In G__read_cats() the function G_init_raster_cats() is executed,
but pcats is reported as 'disabled' in the ddd debugger at that state.

> so you are returning a pointer to an empty string rather than returning a 
> NULL pointer. But I am still not very hopeful.
> 
> The funny thing is I am unable to reproduce this bug so cannot test. 
> Running 'r.stats -anC fields' in Spearfish with yesterday's 5.7 CVS on IRIX 
> produces normal-looking output.

Also here.
The problem appears with

r.stats -anC fields,elevation.10m
Segmentation fault

Markus




More information about the grass-dev mailing list