Uses strtol instead of atoi so that we can properly handle errors.
This now handles overflow and underflow correctly, by parsing the string and then clamping the value between INT_MIN and INT_MAX. `atoi` was giving us garbage values when the buffer overflowed. Fixes #408
This commit is contained in:
parent
5b769045f0
commit
a48dab6ef5
|
@ -61,6 +61,13 @@ xed_gdk_color_to_string (GdkColor color)
|
||||||
return g_strdup_printf ("#%04x%04x%04x", color.red, color.green, color.blue);
|
return g_strdup_printf ("#%04x%04x%04x", color.red, color.green, color.blue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
xed_string_to_clamped_gint (const gchar *text)
|
||||||
|
{
|
||||||
|
long int long_line = strtol (text, NULL, 10);
|
||||||
|
return MAX(MIN(long_line, INT_MAX), INT_MIN);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* n: len of the string in bytes
|
* n: len of the string in bytes
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -50,6 +50,8 @@ enum { XED_ALL_WORKSPACES = 0xffffffff };
|
||||||
|
|
||||||
gchar *xed_gdk_color_to_string (GdkColor color);
|
gchar *xed_gdk_color_to_string (GdkColor color);
|
||||||
|
|
||||||
|
gint xed_string_to_clamped_gint (const gchar *text);
|
||||||
|
|
||||||
gchar *xed_utils_escape_underscores (const gchar *text,
|
gchar *xed_utils_escape_underscores (const gchar *text,
|
||||||
gssize length);
|
gssize length);
|
||||||
|
|
||||||
|
|
|
@ -315,7 +315,7 @@ search_init (GtkWidget *entry,
|
||||||
|
|
||||||
if (*(text + 1) != '\0')
|
if (*(text + 1) != '\0')
|
||||||
{
|
{
|
||||||
offset_line = MAX (atoi (text + 1), 0);
|
offset_line = MAX (xed_string_to_clamped_gint (text + 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
line = MAX (cur_line - offset_line, 0);
|
line = MAX (cur_line - offset_line, 0);
|
||||||
|
@ -326,19 +326,19 @@ search_init (GtkWidget *entry,
|
||||||
|
|
||||||
if (*(text + 1) != '\0')
|
if (*(text + 1) != '\0')
|
||||||
{
|
{
|
||||||
offset_line = MAX (atoi (text + 1), 0);
|
offset_line = MAX (xed_string_to_clamped_gint (text + 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
line = cur_line + offset_line;
|
line = cur_line + offset_line;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
line = MAX (atoi (text) - 1, 0);
|
line = MAX (xed_string_to_clamped_gint (text) - 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (split_text[1] != NULL)
|
if (split_text[1] != NULL)
|
||||||
{
|
{
|
||||||
line_offset = atoi (split_text[1]);
|
line_offset = xed_string_to_clamped_gint (split_text[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_strfreev (split_text);
|
g_strfreev (split_text);
|
||||||
|
|
Loading…
Reference in New Issue