Update of bug #19219 (project freeciv):

                  Status:                    None => Confirmed              
        Operating System:       Microsoft Windows => Any                    
         Planned Release:                         => 2.3.2                  


Follow-up Comment #11:

OK, I think I understand what's going on.

We're at the start of the game and the client hasn't yet got all the game
info -- I think the server has just started sending it cities

The client already knows some numeric city IDs -- the IDs of cities in which
the player has wonders ((struct player)->wonders[]), and the IDs of cities
that work tiles. "Invisible city" structures are created for the latter but
not the former; however, since the player should have knowledge of tiles
worked by all its own cities, invisible cities should cover all the city IDs
in the player's own wonders[] array.

When the client gets to num_continent_buildings() as part of processing the
first city sent to the client, it calls city_from_wonder() for Adam Smith.
This returns an invisible city, as the city we're processing the packet for is
not the one with Adam Smith.

Then it evaluates "if (pcity && tile_continent(pcity->tile) == continent)".
Had the invisible city not been created as a side effect of tile info, this
would have worked out fine (the income calculation would have proceeded as if
Adam Smith wasn't present, but this would be fixed up later). However, since
the invisible city exists, we attempt to dereference its tile and come a

I think this would be fairly easy to band-aid: add a "pcity->tile" NULL check
in num_continent_buildings() (IMO this would be a better patch than the
current one floating around). However, I'm now worried about how many more
latent instances of this error we have. I suppose that auditing uses of
city_from_wonder() would be a good start and not too onerous.


Reply to this item at:


  Message sent via/by Gna!

Freeciv-dev mailing list

Reply via email to