shithub: m8c

Download patch

ref: 8114130a52e13ee9a8fe1d09a36814cdb3466b92
parent: 0e704657216e6669e9e96d7b5d6b445a0106f5d0
author: Ferrix Hovi <ferrix@ferrix.fi>
date: Thu Jun 2 12:49:04 EDT 2022

Replace sprintf with snprintf

Make the buffer lengths implicit to avoid overflows.

Fixes #73

--- a/config.c
+++ b/config.c
@@ -67,61 +67,83 @@
 
   // Open the default config file for writing
   char config_path[1024] = {0};
-  sprintf(config_path, "%s%s", SDL_GetPrefPath("", "m8c"), conf->filename);
+  snprintf(config_path, sizeof(config_path), "%s%s", SDL_GetPrefPath("", "m8c"),
+           conf->filename);
   SDL_RWops *rw = SDL_RWFromFile(config_path, "w");
 
   SDL_Log("Writing config file to %s", config_path);
 
   const unsigned int INI_LINE_COUNT = 36;
+  const unsigned int LINELEN = 50;
 
   // Entries for the config file
-  char ini_values[INI_LINE_COUNT][50];
+  char ini_values[INI_LINE_COUNT][LINELEN];
   int initPointer = 0;
-  sprintf(ini_values[initPointer++], "[graphics]\n");
-  sprintf(ini_values[initPointer++], "fullscreen=%s\n",
-          conf->init_fullscreen ? "true" : "false");
-  sprintf(ini_values[initPointer++], "use_gpu=%s\n",
-          conf->init_use_gpu ? "true" : "false");
-  sprintf(ini_values[initPointer++], "idle_ms=%d\n", conf->idle_ms);
-  sprintf(ini_values[initPointer++], "[keyboard]\n");
-  sprintf(ini_values[initPointer++], "key_up=%d\n", conf->key_up);
-  sprintf(ini_values[initPointer++], "key_left=%d\n", conf->key_left);
-  sprintf(ini_values[initPointer++], "key_down=%d\n", conf->key_down);
-  sprintf(ini_values[initPointer++], "key_right=%d\n", conf->key_right);
-  sprintf(ini_values[initPointer++], "key_select=%d\n", conf->key_select);
-  sprintf(ini_values[initPointer++], "key_select_alt=%d\n", conf->key_select_alt);
-  sprintf(ini_values[initPointer++], "key_start=%d\n", conf->key_start);
-  sprintf(ini_values[initPointer++], "key_start_alt=%d\n", conf->key_start_alt);
-  sprintf(ini_values[initPointer++], "key_opt=%d\n", conf->key_opt);
-  sprintf(ini_values[initPointer++], "key_opt_alt=%d\n", conf->key_opt_alt);
-  sprintf(ini_values[initPointer++], "key_edit=%d\n", conf->key_edit);
-  sprintf(ini_values[initPointer++], "key_edit_alt=%d\n", conf->key_edit_alt);
-  sprintf(ini_values[initPointer++], "key_delete=%d\n", conf->key_delete);
-  sprintf(ini_values[initPointer++], "key_reset=%d\n", conf->key_reset);
-  sprintf(ini_values[initPointer++], "[gamepad]\n");
-  sprintf(ini_values[initPointer++], "gamepad_up=%d\n", conf->gamepad_up);
-  sprintf(ini_values[initPointer++], "gamepad_left=%d\n", conf->gamepad_left);
-  sprintf(ini_values[initPointer++], "gamepad_down=%d\n", conf->gamepad_down);
-  sprintf(ini_values[initPointer++], "gamepad_right=%d\n", conf->gamepad_right);
-  sprintf(ini_values[initPointer++], "gamepad_select=%d\n", conf->gamepad_select);
-  sprintf(ini_values[initPointer++], "gamepad_start=%d\n", conf->gamepad_start);
-  sprintf(ini_values[initPointer++], "gamepad_opt=%d\n", conf->gamepad_opt);
-  sprintf(ini_values[initPointer++], "gamepad_edit=%d\n", conf->gamepad_edit);
-  sprintf(ini_values[initPointer++], "gamepad_analog_threshold=%d\n",
-          conf->gamepad_analog_threshold);
-  sprintf(ini_values[initPointer++], "gamepad_analog_invert=%s\n",
-          conf->gamepad_analog_invert ? "true" : "false");
-  sprintf(ini_values[initPointer++], "gamepad_analog_axis_updown=%d\n",
-          conf->gamepad_analog_axis_updown);
-  sprintf(ini_values[initPointer++], "gamepad_analog_axis_leftright=%d\n",
-          conf->gamepad_analog_axis_leftright);
-  sprintf(ini_values[initPointer++], "gamepad_analog_axis_select=%d\n",
-          conf->gamepad_analog_axis_select);
-  sprintf(ini_values[initPointer++], "gamepad_analog_axis_start=%d\n",
-          conf->gamepad_analog_axis_start);
-  sprintf(ini_values[initPointer++], "gamepad_analog_axis_opt=%d\n",
+  snprintf(ini_values[initPointer++], LINELEN, "[graphics]\n");
+  snprintf(ini_values[initPointer++], LINELEN, "fullscreen=%s\n",
+           conf->init_fullscreen ? "true" : "false");
+  snprintf(ini_values[initPointer++], LINELEN, "use_gpu=%s\n",
+           conf->init_use_gpu ? "true" : "false");
+  snprintf(ini_values[initPointer++], LINELEN, "idle_ms=%d\n", conf->idle_ms);
+  snprintf(ini_values[initPointer++], LINELEN, "[keyboard]\n");
+  snprintf(ini_values[initPointer++], LINELEN, "key_up=%d\n", conf->key_up);
+  snprintf(ini_values[initPointer++], LINELEN, "key_left=%d\n", conf->key_left);
+  snprintf(ini_values[initPointer++], LINELEN, "key_down=%d\n", conf->key_down);
+  snprintf(ini_values[initPointer++], LINELEN, "key_right=%d\n",
+          conf->key_right);
+  snprintf(ini_values[initPointer++], LINELEN, "key_select=%d\n",
+           conf->key_select);
+  snprintf(ini_values[initPointer++], LINELEN, "key_select_alt=%d\n",
+           conf->key_select_alt);
+  snprintf(ini_values[initPointer++], LINELEN, "key_start=%d\n",
+           conf->key_start);
+  snprintf(ini_values[initPointer++], LINELEN, "key_start_alt=%d\n",
+           conf->key_start_alt);
+  snprintf(ini_values[initPointer++], LINELEN, "key_opt=%d\n",
+           conf->key_opt);
+  snprintf(ini_values[initPointer++], LINELEN, "key_opt_alt=%d\n",
+           conf->key_opt_alt);
+  snprintf(ini_values[initPointer++], LINELEN, "key_edit=%d\n", conf->key_edit);
+  snprintf(ini_values[initPointer++], LINELEN, "key_edit_alt=%d\n",
+           conf->key_edit_alt);
+  snprintf(ini_values[initPointer++], LINELEN, "key_delete=%d\n",
+           conf->key_delete);
+  snprintf(ini_values[initPointer++], LINELEN, "key_reset=%d\n",
+           conf->key_reset);
+  snprintf(ini_values[initPointer++], LINELEN, "[gamepad]\n");
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_up=%d\n",
+           conf->gamepad_up);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_left=%d\n",
+           conf->gamepad_left);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_down=%d\n",
+           conf->gamepad_down);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_right=%d\n",
+           conf->gamepad_right);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_select=%d\n",
+           conf->gamepad_select);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_start=%d\n",
+           conf->gamepad_start);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_opt=%d\n",
+           conf->gamepad_opt);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_edit=%d\n",
+           conf->gamepad_edit);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_threshold=%d\n",
+           conf->gamepad_analog_threshold);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_invert=%s\n",
+           conf->gamepad_analog_invert ? "true" : "false");
+  snprintf(ini_values[initPointer++], LINELEN,
+           "gamepad_analog_axis_updown=%d\n", conf->gamepad_analog_axis_updown);
+  snprintf(ini_values[initPointer++], LINELEN,
+           "gamepad_analog_axis_leftright=%d\n",
+           conf->gamepad_analog_axis_leftright);
+  snprintf(ini_values[initPointer++], LINELEN,
+           "gamepad_analog_axis_select=%d\n",
+           conf->gamepad_analog_axis_select);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_start=%d\n",
+           conf->gamepad_analog_axis_start);
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_opt=%d\n",
           conf->gamepad_analog_axis_opt);
-  sprintf(ini_values[initPointer++], "gamepad_analog_axis_edit=%d\n",
+  snprintf(ini_values[initPointer++], LINELEN, "gamepad_analog_axis_edit=%d\n",
           conf->gamepad_analog_axis_edit);
 
   // Ensure we aren't writing off the end of the array
@@ -149,7 +171,8 @@
 void read_config(config_params_s *conf) {
 
   char config_path[1024] = {0};
-  sprintf(config_path, "%s%s", SDL_GetPrefPath("", "m8c"), conf->filename);
+  snprintf(config_path, sizeof(config_path), "%s%s", SDL_GetPrefPath("", "m8c"),
+           conf->filename);
   SDL_Log("Reading config %s", config_path);
   ini_t *ini = ini_load(config_path);
   if (ini == NULL) {
--