From 0231017e57e3f3eb57c806aba8e11dd00f670d04 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Fri, 4 Oct 2013 17:03:48 +0100
Subject: [PATCH] [Fix] Some long time snprintf mistakes.

---
 src/outfit.c | 12 +++++-------
 src/player.c | 41 ++++++++++++++++++++---------------------
 src/space.c  | 17 ++++++++---------
 3 files changed, 33 insertions(+), 37 deletions(-)

diff --git a/src/outfit.c b/src/outfit.c
index 41cacba..5c0449b 100644
--- a/src/outfit.c
+++ b/src/outfit.c
@@ -616,7 +616,7 @@ static void outfit_parseSBeam(Outfit* tmp, const xmlNodePtr parent) {
     }
 
   } while(xml_nextNode(node));
-  
+
 #define MELEMENT(o,s) if(0) WARN("Outfit '%s' missing/invalid '"s"' element", tmp->name)
   MELEMENT(tmp->u.bem.gfx==NULL,                                    "gfx");
   MELEMENT(tmp->u.bem.spfx==-1,                                     "spfx");
@@ -636,7 +636,7 @@ static void outfit_parseSBeam(Outfit* tmp, const xmlNodePtr parent) {
 /* Parse the specific area for a launcher and loads it into Outfit. */
 static void outfit_parseSLauncher(Outfit* tmp, const xmlNodePtr parent) {
   xmlNodePtr node;
-  
+
   node = parent->xmlChildrenNode;
   do {
     /* Load the dataz. */
@@ -668,8 +668,7 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) {
     xmlr_float(node, "speed",     tmp->u.amm.speed);
     xmlr_float(node, "energy",    tmp->u.amm.energy);
     if(xml_isNode(node, "gfx")) {
-      snprintf(str, strlen(xml_get(node))+sizeof(OUTFIT_GFX)+10,
-               OUTFIT_GFX"space/%s.png", xml_get(node));
+      snprintf(str, PATH_MAX, OUTFIT_GFX"space/%s.png", xml_get(node));
       tmp->u.amm.gfx_space = gl_newSprite(str, 6, 6);
       continue;
     }
@@ -680,7 +679,7 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) {
     else if(xml_isNode(node, "damage"))
       outfit_parseDamage(&tmp->u.amm.dtype, &tmp->u.amm.damage, node);
   } while((node = node->next));
-  
+
   /* Post-processing. */
   tmp->u.amm.resist /= 100.; /* Set it in per one. */
 
@@ -805,8 +804,7 @@ static Outfit* outfit_parse(const xmlNodePtr parent) {
         xmlr_int(cur, "price", tmp->price);
         xmlr_strd(cur, "description", tmp->description);
         if(xml_isNode(cur, "gfx_store")) {
-          snprintf(str, strlen(xml_get(cur))+sizeof(OUTFIT_GFX)+10,
-                   OUTFIT_GFX"store/%s.png", xml_get(cur));
+          snprintf(str, PATH_MAX, OUTFIT_GFX"store/%s.png", xml_get(cur));
           tmp->gfx_store = gl_newImage(str);
         }
       } while((cur = cur->next));
diff --git a/src/player.c b/src/player.c
index cf56090..9318c3d 100644
--- a/src/player.c
+++ b/src/player.c
@@ -322,7 +322,7 @@ static void player_newMake(void) {
     player_new();
     return;
   }
-  
+
   space_init(sysname);
   free(sysname);
 
@@ -499,7 +499,7 @@ void player_rmShip(char* shipname) {
           sizeof(char*) * (player_nstack-i-1));
 
       player_nstack--;  /* Shrink stack. */
-      
+
       /* Realloc memory to smaller size. */
       player_stack = realloc(player_stack,
           sizeof(Pilot*) * (player_nstack));
@@ -539,7 +539,7 @@ void player_cleanup(void) {
     /* Nothing left. */
     player_nstack = 0;
   }
-  
+
   /* Clean up missions. */
   if(missions_done != NULL) {
     free(missions_done);
@@ -824,12 +824,12 @@ void player_renderGUI(void) {
     }
     /* Fancy cinematic scene borders. */
     spfx_cinematic();
-    
+
     return;
   }
 
   if(player == NULL) return;
-  
+
   /* Lockon warning. */
   if(player->lockons > 0)
     gl_printMid(NULL, SCREEN_W, 0., SCREEN_H-gl_defFont.h-25.,
@@ -1269,31 +1269,30 @@ static void rect_parse(const xmlNodePtr parent, double* x, double* y,
 { (a).x += VX(gui.frame); (a).y = VY(gui.frame) + gui.gfx_frame->h-(a).y; }
 static int gui_parse(const xmlNodePtr parent, const char* name) {
   xmlNodePtr cur, node;
-  char* tmp, *tmp2;
+  char* tmp, buf[PATH_MAX];
 
   /* Gfx. */
   /* Set a property and not a node because it must be loaded first. */
-  tmp2 = xml_nodeProp(parent, "gfx");
-  if(tmp2 == NULL) {
+  tmp = xml_nodeProp(parent, "gfx");
+  if(tmp == NULL) {
     ERR("GUI '%s' has no gfx property", name);
     return -1;
   }
   /* Load gfx. */
-  tmp = malloc((strlen(tmp2)+strlen(GUI_GFX)+12) * sizeof(char));
+
   /* Frame. */
-  snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+5, GUI_GFX"%s.png", tmp2);
+  snprintf(buf, PATH_MAX, GUI_GFX"%s.png", tmp);
   if(gui.gfx_frame) gl_freeTexture(gui.gfx_frame); /* Free if needed. */
-  gui.gfx_frame = gl_newImage(tmp);
+  gui.gfx_frame = gl_newImage(buf);
   /* Pilot. */
-  snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+11, GUI_GFX"%s_pilot.png", tmp2);
+  snprintf(buf, PATH_MAX, GUI_GFX"%s_pilot.png", tmp);
   if(gui.gfx_targetPilot) gl_freeTexture(gui.gfx_targetPilot); /* Free if needed. */
-  gui.gfx_targetPilot = gl_newSprite(tmp, 2, 2);
+  gui.gfx_targetPilot = gl_newSprite(buf, 2, 2);
   /* Planet. */
-  snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+12, GUI_GFX"%s_planet.png", tmp2);
+  snprintf(buf, PATH_MAX, GUI_GFX"%s_planet.png", tmp);
   if(gui.gfx_targetPlanet) gl_freeTexture(gui.gfx_targetPlanet); /* Free if needed. */
-  gui.gfx_targetPlanet = gl_newSprite(tmp, 2, 2);
+  gui.gfx_targetPlanet = gl_newSprite(buf, 2, 2);
   free(tmp);
-  free(tmp2);
 
   /* Frame (based on gfx). */
   vect_csetmin(&gui.frame,
@@ -1477,7 +1476,7 @@ void player_think(Pilot* pplayer) {
   }
   else if(player_isFlag(PLAYER_SECONDARY_L)) {
     player_rmFlag(PLAYER_SECONDARY_L);
-  } 
+  }
 
   /* Afterburn! */
   if(player_isFlag(PLAYER_AFTERBURNER)) {
@@ -1698,7 +1697,7 @@ void player_brokeHyperspace(void) {
   /* Set position, pilot_update will handle the lowering of velocity. */
   player_warp(-cos(player->solid->dir) * MIN_HYPERSPACE_DIST * 2.5,
               -sin(player->solid->dir) * MIN_HYPERSPACE_DIST * 2.5);
-  
+
   /* Reduce fuel. */
   player->fuel -= HYPERSPACE_FUEL;
 
@@ -2119,7 +2118,7 @@ static int player_parse(xmlNodePtr parent) {
 
     if(xml_isNode(node, "ship"))
       player_parseShip(node, 1);
-    
+
     if(xml_isNode(node, "ships")) {
       cur = node->xmlChildrenNode;
       do {
@@ -2238,7 +2237,7 @@ static int player_parseShip(xmlNodePtr parent, int is_player) {
   /* Set fuel. */
   if(fuel != 0)
     ship->fuel = MIN(ship->fuel_max, fuel);
-  
+
   /* Add it to the stack if it's not what the player is in. */
   if(is_player == 0) {
     player_stack = realloc(player_stack, sizeof(Pilot*)*(player_nstack+1));
@@ -2247,7 +2246,7 @@ static int player_parseShip(xmlNodePtr parent, int is_player) {
     player_lstack[player_nstack] = strdup(loc);
     player_nstack++;
   }
-  
+
   return 0;
 }
 
diff --git a/src/space.c b/src/space.c
index 5f092ec..b377cba 100644
--- a/src/space.c
+++ b/src/space.c
@@ -313,7 +313,7 @@ char* space_getRndPlanet(void) {
   return res;
 }
 
-/* Return 1 if player can reach the system. */                                  
+/* Return 1 if player can reach the system. */
 int space_sysReachable(StarSystem* sys) {
   int i;
 
@@ -527,8 +527,7 @@ static Planet* planet_pull(const char* name) {
             do {
               if(xml_isNode(cur, "space")) {
                 /* Load space gfx. */
-                snprintf(str, strlen(xml_get(cur))+sizeof(PLANET_GFX_SPACE),
-                         PLANET_GFX_SPACE"%s", xml_get(cur));
+                snprintf(str, PATH_MAX, PLANET_GFX_SPACE"%s", xml_get(cur));
                 tmp->gfx_space = gl_newImage(str);
               }
               else if(xml_isNode(cur, "exterior")) {
@@ -860,7 +859,7 @@ void space_render(const double dt) {
 
 /* Render the overlay. */
 void space_renderOverlay(const double dt) {
-  if(cur_system == NULL) return; 
+  if(cur_system == NULL) return;
 
   if(cur_system->nebu_density > 0.)
     nebu_renderOverlay(dt);
@@ -911,7 +910,7 @@ static void space_renderStars(const double dt) {
         b = 13.-10.*stars[i].brightness;
         stars[i].x -= player->solid->vel.x/b*dt;
         stars[i].y -= player->solid->vel.y/b*dt;
-        
+
         /* Check for boundaries. */
         if(stars[i].x > SCREEN_W + STAR_BUF) stars[i].x = -STAR_BUF;
         else if(stars[i].x < -STAR_BUF) stars[i].x = SCREEN_W + STAR_BUF;
@@ -952,13 +951,13 @@ void planets_render(void) {
 /* Clean up the system. */
 void space_exit(void) {
   int i,j;
-  
+
   /* Free the names. */
   /*if(planetname_stack) free(planetname_stack); */
   /*if(systemname_stack) free(systemname_stack); */
   if(planetname_stack) {
-  	 free(planetname_stack);
-  	 planetname_stack = NULL;
+     free(planetname_stack);
+     planetname_stack = NULL;
   }
   if(systemname_stack) {
    free(systemname_stack);
@@ -1039,7 +1038,7 @@ int space_sysLoad(xmlNodePtr parent) {
   StarSystem* sys;
 
   space_clearKnown();
-  
+
   node = parent->xmlChildrenNode;
   do {
     if(xml_isNode(node, "space")) {