* regcache.c (new_register_cache): No need to check result of xcalloc.
* server.c (handle_search_memory): Back out calls to xmalloc, result is checked and error is returned to user upon failure. (handle_query): Ditto. Add more checks for result of malloc. (handle_v_cont): Check result of malloc, report error back to user upon failure. (handle_v_run): Ditto. Call freeargv. * server.h (freeargv): Declare. * utils.c (freeargv): New fn.
This commit is contained in:
parent
a90b386908
commit
aef93bd75f
5 changed files with 76 additions and 21 deletions
|
@ -1,3 +1,15 @@
|
||||||
|
2009-01-18 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
|
* regcache.c (new_register_cache): No need to check result of xcalloc.
|
||||||
|
* server.c (handle_search_memory): Back out calls to xmalloc,
|
||||||
|
result is checked and error is returned to user upon failure.
|
||||||
|
(handle_query): Ditto. Add more checks for result of malloc.
|
||||||
|
(handle_v_cont): Check result of malloc, report error back to
|
||||||
|
user upon failure.
|
||||||
|
(handle_v_run): Ditto. Call freeargv.
|
||||||
|
* server.h (freeargv): Declare.
|
||||||
|
* utils.c (freeargv): New fn.
|
||||||
|
|
||||||
2009-01-15 Doug Evans <dje@google.com>
|
2009-01-15 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
* gdbreplay.c (perror_with_name): Make arg const char *.
|
* gdbreplay.c (perror_with_name): Make arg const char *.
|
||||||
|
|
|
@ -100,8 +100,6 @@ new_register_cache (void)
|
||||||
in case there are registers the target never fetches. This way they'll
|
in case there are registers the target never fetches. This way they'll
|
||||||
read as zero instead of garbage. */
|
read as zero instead of garbage. */
|
||||||
regcache->registers = xcalloc (1, register_bytes);
|
regcache->registers = xcalloc (1, register_bytes);
|
||||||
if (regcache->registers == NULL)
|
|
||||||
fatal ("Could not allocate register cache.");
|
|
||||||
|
|
||||||
regcache->registers_valid = 0;
|
regcache->registers_valid = 0;
|
||||||
|
|
||||||
|
|
|
@ -436,7 +436,7 @@ handle_search_memory (char *own_buf, int packet_len)
|
||||||
CORE_ADDR found_addr;
|
CORE_ADDR found_addr;
|
||||||
int cmd_name_len = sizeof ("qSearch:memory:") - 1;
|
int cmd_name_len = sizeof ("qSearch:memory:") - 1;
|
||||||
|
|
||||||
pattern = xmalloc (packet_len);
|
pattern = malloc (packet_len);
|
||||||
if (pattern == NULL)
|
if (pattern == NULL)
|
||||||
{
|
{
|
||||||
error ("Unable to allocate memory to perform the search");
|
error ("Unable to allocate memory to perform the search");
|
||||||
|
@ -460,7 +460,7 @@ handle_search_memory (char *own_buf, int packet_len)
|
||||||
if (search_space_len < search_buf_size)
|
if (search_space_len < search_buf_size)
|
||||||
search_buf_size = search_space_len;
|
search_buf_size = search_space_len;
|
||||||
|
|
||||||
search_buf = xmalloc (search_buf_size);
|
search_buf = malloc (search_buf_size);
|
||||||
if (search_buf == NULL)
|
if (search_buf == NULL)
|
||||||
{
|
{
|
||||||
free (pattern);
|
free (pattern);
|
||||||
|
@ -575,7 +575,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
|
||||||
return;
|
return;
|
||||||
if (len > PBUFSIZ - 2)
|
if (len > PBUFSIZ - 2)
|
||||||
len = PBUFSIZ - 2;
|
len = PBUFSIZ - 2;
|
||||||
spu_buf = xmalloc (len + 1);
|
spu_buf = malloc (len + 1);
|
||||||
if (!spu_buf)
|
if (!spu_buf)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -604,7 +604,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
|
||||||
|
|
||||||
require_running (own_buf);
|
require_running (own_buf);
|
||||||
strcpy (own_buf, "E00");
|
strcpy (own_buf, "E00");
|
||||||
spu_buf = xmalloc (packet_len - 15);
|
spu_buf = malloc (packet_len - 15);
|
||||||
if (!spu_buf)
|
if (!spu_buf)
|
||||||
return;
|
return;
|
||||||
if (decode_xfer_write (own_buf + 16, packet_len - 16, &annex,
|
if (decode_xfer_write (own_buf + 16, packet_len - 16, &annex,
|
||||||
|
@ -648,7 +648,12 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
|
||||||
more. */
|
more. */
|
||||||
if (len > PBUFSIZ - 2)
|
if (len > PBUFSIZ - 2)
|
||||||
len = PBUFSIZ - 2;
|
len = PBUFSIZ - 2;
|
||||||
data = xmalloc (len + 1);
|
data = malloc (len + 1);
|
||||||
|
if (data == NULL)
|
||||||
|
{
|
||||||
|
write_enn (own_buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
n = (*the_target->read_auxv) (ofs, data, len + 1);
|
n = (*the_target->read_auxv) (ofs, data, len + 1);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
write_enn (own_buf);
|
write_enn (own_buf);
|
||||||
|
@ -726,7 +731,12 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
|
||||||
for (dll_ptr = all_dlls.head; dll_ptr != NULL; dll_ptr = dll_ptr->next)
|
for (dll_ptr = all_dlls.head; dll_ptr != NULL; dll_ptr = dll_ptr->next)
|
||||||
total_len += 128 + 6 * strlen (((struct dll_info *) dll_ptr)->name);
|
total_len += 128 + 6 * strlen (((struct dll_info *) dll_ptr)->name);
|
||||||
|
|
||||||
document = xmalloc (total_len);
|
document = malloc (total_len);
|
||||||
|
if (document == NULL)
|
||||||
|
{
|
||||||
|
write_enn (own_buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
strcpy (document, "<library-list>\n");
|
strcpy (document, "<library-list>\n");
|
||||||
p = document + strlen (document);
|
p = document + strlen (document);
|
||||||
|
|
||||||
|
@ -782,7 +792,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
|
||||||
return;
|
return;
|
||||||
if (len > PBUFSIZ - 2)
|
if (len > PBUFSIZ - 2)
|
||||||
len = PBUFSIZ - 2;
|
len = PBUFSIZ - 2;
|
||||||
workbuf = xmalloc (len + 1);
|
workbuf = malloc (len + 1);
|
||||||
if (!workbuf)
|
if (!workbuf)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -895,9 +905,15 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
|
||||||
/* Handle "monitor" commands. */
|
/* Handle "monitor" commands. */
|
||||||
if (strncmp ("qRcmd,", own_buf, 6) == 0)
|
if (strncmp ("qRcmd,", own_buf, 6) == 0)
|
||||||
{
|
{
|
||||||
char *mon = xmalloc (PBUFSIZ);
|
char *mon = malloc (PBUFSIZ);
|
||||||
int len = strlen (own_buf + 6);
|
int len = strlen (own_buf + 6);
|
||||||
|
|
||||||
|
if (mon == NULL)
|
||||||
|
{
|
||||||
|
write_enn (own_buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((len % 2) != 0 || unhexify (mon, own_buf + 6, len / 2) != len / 2)
|
if ((len % 2) != 0 || unhexify (mon, own_buf + 6, len / 2) != len / 2)
|
||||||
{
|
{
|
||||||
write_enn (own_buf);
|
write_enn (own_buf);
|
||||||
|
@ -975,7 +991,9 @@ handle_v_cont (char *own_buf, char *status, int *signal)
|
||||||
/* Allocate room for one extra action, for the default remain-stopped
|
/* Allocate room for one extra action, for the default remain-stopped
|
||||||
behavior; if no default action is in the list, we'll need the extra
|
behavior; if no default action is in the list, we'll need the extra
|
||||||
slot. */
|
slot. */
|
||||||
resume_info = xmalloc ((n + 1) * sizeof (resume_info[0]));
|
resume_info = malloc ((n + 1) * sizeof (resume_info[0]));
|
||||||
|
if (resume_info == NULL)
|
||||||
|
goto err;
|
||||||
|
|
||||||
default_action.thread = -1;
|
default_action.thread = -1;
|
||||||
default_action.leave_stopped = 1;
|
default_action.leave_stopped = 1;
|
||||||
|
@ -1097,7 +1115,7 @@ handle_v_attach (char *own_buf, char *status, int *signal)
|
||||||
static int
|
static int
|
||||||
handle_v_run (char *own_buf, char *status, int *signal)
|
handle_v_run (char *own_buf, char *status, int *signal)
|
||||||
{
|
{
|
||||||
char *p, **pp, *next_p, **new_argv;
|
char *p, *next_p, **new_argv;
|
||||||
int i, new_argc;
|
int i, new_argc;
|
||||||
|
|
||||||
new_argc = 0;
|
new_argc = 0;
|
||||||
|
@ -1107,7 +1125,13 @@ handle_v_run (char *own_buf, char *status, int *signal)
|
||||||
new_argc++;
|
new_argc++;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_argv = xcalloc (new_argc + 2, sizeof (char *));
|
new_argv = calloc (new_argc + 2, sizeof (char *));
|
||||||
|
if (new_argv == NULL)
|
||||||
|
{
|
||||||
|
write_enn (own_buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for (p = own_buf + strlen ("vRun;"); *p; p = next_p)
|
for (p = own_buf + strlen ("vRun;"); *p; p = next_p)
|
||||||
{
|
{
|
||||||
|
@ -1119,6 +1143,7 @@ handle_v_run (char *own_buf, char *status, int *signal)
|
||||||
new_argv[i] = NULL;
|
new_argv[i] = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* FIXME: Fail request if out of memory instead of dying. */
|
||||||
new_argv[i] = xmalloc (1 + (next_p - p) / 2);
|
new_argv[i] = xmalloc (1 + (next_p - p) / 2);
|
||||||
unhexify (new_argv[i], p, (next_p - p) / 2);
|
unhexify (new_argv[i], p, (next_p - p) / 2);
|
||||||
new_argv[i][(next_p - p) / 2] = '\0';
|
new_argv[i][(next_p - p) / 2] = '\0';
|
||||||
|
@ -1137,20 +1162,22 @@ handle_v_run (char *own_buf, char *status, int *signal)
|
||||||
|
|
||||||
if (program_argv == NULL)
|
if (program_argv == NULL)
|
||||||
{
|
{
|
||||||
|
/* FIXME: new_argv memory leak */
|
||||||
write_enn (own_buf);
|
write_enn (own_buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_argv[0] = xstrdup (program_argv[0]);
|
new_argv[0] = strdup (program_argv[0]);
|
||||||
|
if (new_argv[0] == NULL)
|
||||||
|
{
|
||||||
|
/* FIXME: new_argv memory leak */
|
||||||
|
write_enn (own_buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the old argv. */
|
/* Free the old argv and install the new one. */
|
||||||
if (program_argv)
|
freeargv (program_argv);
|
||||||
{
|
|
||||||
for (pp = program_argv; *pp != NULL; pp++)
|
|
||||||
free (*pp);
|
|
||||||
free (program_argv);
|
|
||||||
}
|
|
||||||
program_argv = new_argv;
|
program_argv = new_argv;
|
||||||
|
|
||||||
*signal = start_inferior (program_argv, status);
|
*signal = start_inferior (program_argv, status);
|
||||||
|
|
|
@ -276,6 +276,7 @@ const char *target_signal_to_name (enum target_signal);
|
||||||
void *xmalloc (size_t) ATTR_MALLOC;
|
void *xmalloc (size_t) ATTR_MALLOC;
|
||||||
void *xcalloc (size_t, size_t) ATTR_MALLOC;
|
void *xcalloc (size_t, size_t) ATTR_MALLOC;
|
||||||
char *xstrdup (const char *) ATTR_MALLOC;
|
char *xstrdup (const char *) ATTR_MALLOC;
|
||||||
|
void freeargv (char **argv);
|
||||||
void perror_with_name (const char *string);
|
void perror_with_name (const char *string);
|
||||||
void error (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2);
|
void error (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2);
|
||||||
void fatal (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2);
|
void fatal (const char *string,...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2);
|
||||||
|
|
|
@ -87,6 +87,23 @@ xstrdup (const char *s)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free a standard argv vector. */
|
||||||
|
|
||||||
|
void
|
||||||
|
freeargv (char **vector)
|
||||||
|
{
|
||||||
|
char **scan;
|
||||||
|
|
||||||
|
if (vector != NULL)
|
||||||
|
{
|
||||||
|
for (scan = vector; *scan != NULL; scan++)
|
||||||
|
{
|
||||||
|
free (*scan);
|
||||||
|
}
|
||||||
|
free (vector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Print the system error message for errno, and also mention STRING
|
/* Print the system error message for errno, and also mention STRING
|
||||||
as the file name for which the error was encountered.
|
as the file name for which the error was encountered.
|
||||||
Then return to command level. */
|
Then return to command level. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue