<URL: http://bugs.freeciv.org/Ticket/Display.html?id=35866 >

If no sprite is available (possible in some tilesets) nothing should be
drawn.  Instead the code in question here crashes (because of doing
mod-0 math).

This simple patch fixes it.  For 2.1 and development branches - I will
commit immediately.

-jason

Index: client/tilespec.c
===================================================================
--- client/tilespec.c	(revision 12631)
+++ client/tilespec.c	(working copy)
@@ -3575,18 +3575,21 @@
     int count = sprite_vector_size(&draw->layer[l].base);
     int ox = draw->layer[l].offset_x, oy = draw->layer[l].offset_y;
 
-    /* Pseudo-random reproducable algorithm to pick a sprite. */
-#define LARGE_PRIME 10007
-#define SMALL_PRIME 1009
-    assert(count < SMALL_PRIME);
-    assert((int)(LARGE_PRIME * MAP_INDEX_SIZE) > 0);
-    count = ((ptile->index
-	      * LARGE_PRIME) % SMALL_PRIME) % count;
-    if (draw->layer[l].is_tall) {
-      ox += FULL_TILE_X_OFFSET;
-      oy += FULL_TILE_Y_OFFSET;
+    if (count > 0) {
+      /* Pseudo-random reproducable algorithm to pick a sprite. */
+      const int LARGE_PRIME = 10007;
+      const int SMALL_PRIME = 1009;
+
+      assert(count < SMALL_PRIME);
+      assert((int)(LARGE_PRIME * MAP_INDEX_SIZE) > 0);
+      count = ((ptile->index
+		* LARGE_PRIME) % SMALL_PRIME) % count;
+      if (draw->layer[l].is_tall) {
+	ox += FULL_TILE_X_OFFSET;
+	oy += FULL_TILE_Y_OFFSET;
+      }
+      ADD_SPRITE(draw->layer[l].base.p[count], TRUE, ox, oy);
     }
-    ADD_SPRITE(draw->layer[l].base.p[count], TRUE, ox, oy);
   } else {
     int match_type = draw->layer[l].match_type;
 
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to