If the first requested line is larger than the number of lines in the
source buffer, source_cache::extract_lines could crash, because it
would try to pass string::npos" to string::substr.
This patch avoids the crash by checking for this case.
This version of the patch changes get_source_lines to return
std::string.
2019-03-14 Tom Tromey <tromey@adacore.com>
* source-cache.h (class source_cache) <get_source_lines>: Return
std::string.
* source-cache.c (source_cache::extract_lines): Handle case where
first_pos==npos. Return std::string.
(source_cache::get_source_lines): Update.
2019-03-14 Tom Tromey <tromey@adacore.com>
2019-03-14 Tom Tromey <tromey@adacore.com>
+ * source-cache.h (class source_cache) <get_source_lines>: Return
+ std::string.
+ * source-cache.c (source_cache::extract_lines): Handle case where
+ first_pos==npos. Return std::string.
+ (source_cache::get_source_lines): Update.
+
+2019-03-14 Tom Tromey <tromey@adacore.com>
+
* NEWS: Add item for "style sources" commands.
* source-cache.c (source_cache::get_source_lines): Check
source_styling.
* NEWS: Add item for "style sources" commands.
* source-cache.c (source_cache::get_source_lines): Check
source_styling.
/* See source-cache.h. */
/* See source-cache.h. */
source_cache::extract_lines (const struct source_text &text, int first_line,
source_cache::extract_lines (const struct source_text &text, int first_line,
- int last_line, std::string *lines)
{
int lineno = 1;
std::string::size_type pos = 0;
{
int lineno = 1;
std::string::size_type pos = 0;
pos = new_pos;
if (lineno == last_line || pos == std::string::npos)
{
pos = new_pos;
if (lineno == last_line || pos == std::string::npos)
{
+ if (first_pos == std::string::npos)
+ return {};
if (pos == std::string::npos)
pos = text.contents.size ();
if (pos == std::string::npos)
pos = text.contents.size ();
- *lines = text.contents.substr (first_pos, pos - first_pos);
- return true;
+ return text.contents.substr (first_pos, pos - first_pos);
}
#ifdef HAVE_SOURCE_HIGHLIGHT
}
#ifdef HAVE_SOURCE_HIGHLIGHT
for (const auto &item : m_source_map)
{
if (item.fullname == fullname)
for (const auto &item : m_source_map)
{
if (item.fullname == fullname)
- return extract_lines (item, first_line, last_line, lines);
+ {
+ *lines = extract_lines (item, first_line, last_line);
+ return true;
+ }
}
const char *lang_name = get_language_name (SYMTAB_LANGUAGE (s));
}
const char *lang_name = get_language_name (SYMTAB_LANGUAGE (s));
if (m_source_map.size () > MAX_ENTRIES)
m_source_map.erase (m_source_map.begin ());
if (m_source_map.size () > MAX_ENTRIES)
m_source_map.erase (m_source_map.begin ());
- return extract_lines (m_source_map.back (), first_line,
- last_line, lines);
+ *lines = extract_lines (m_source_map.back (), first_line,
+ last_line);
+ return true;
int last_line, std::string *lines_out);
/* A helper function for get_plain_source_lines that extracts the
desired source lines from TEXT, putting them into LINES_OUT. The
int last_line, std::string *lines_out);
/* A helper function for get_plain_source_lines that extracts the
desired source lines from TEXT, putting them into LINES_OUT. The
- arguments and return value are as for get_source_lines. */
- bool extract_lines (const struct source_text &text, int first_line,
- int last_line, std::string *lines_out);
+ arguments are as for get_source_lines. The return value is the
+ desired lines. */
+ std::string extract_lines (const struct source_text &text, int first_line,
+ int last_line);
/* The contents of the cache. */
std::vector<source_text> m_source_map;
/* The contents of the cache. */
std::vector<source_text> m_source_map;