summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
9b25777)
v4:
- changed first line of commit message
v3:
- added extra LOG_ERROR() message
v2:
- Added missing "goto error"
- free also the on extra element of features[]
In contrast to target_get_gdb_reg_list(), the list returned by
get_reg_features_list() consists of items which are itself
malloc'ed.
--> Free the list items prior freeing the list itself.
Additionally:
- gdb_generate_target_description():
o Do error handling similar as gdb_get_target_description_chunk() does.
- gdb_get_target_description_chunk()
o **features must be initialised prior an "goto error" can happen
Change-Id: Iad07824618c51084e0aa0499ee6fc96198b320f0
Signed-off-by: Christian Eggers <ceggers@gmx.de>
Reviewed-on: http://openocd.zylin.com/1917
Tested-by: jenkins
Reviewed-by: Trevor Woerner <trevor.woerner@linaro.org>
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
static int gdb_generate_target_description(struct target *target, char **tdesc_out)
{
int retval = ERROR_OK;
static int gdb_generate_target_description(struct target *target, char **tdesc_out)
{
int retval = ERROR_OK;
+ struct reg **reg_list = NULL;
+ char **features = NULL;
+ int feature_list_size = 0;
char *tdesc = NULL;
int pos = 0;
int size = 0;
char *tdesc = NULL;
int pos = 0;
int size = 0;
if (retval != ERROR_OK) {
LOG_ERROR("get register list failed");
if (retval != ERROR_OK) {
LOG_ERROR("get register list failed");
+ retval = ERROR_FAIL;
+ goto error;
}
if (reg_list_size <= 0) {
}
if (reg_list_size <= 0) {
- free(reg_list);
- return ERROR_FAIL;
+ LOG_ERROR("get register list failed");
+ retval = ERROR_FAIL;
+ goto error;
- char **features = NULL;
/* Get a list of available target registers features */
/* Get a list of available target registers features */
- retval = get_reg_features_list(target, &features, NULL, reg_list, reg_list_size);
+ retval = get_reg_features_list(target, &features, &feature_list_size, reg_list, reg_list_size);
if (retval != ERROR_OK) {
LOG_ERROR("Can't get the registers feature list");
if (retval != ERROR_OK) {
LOG_ERROR("Can't get the registers feature list");
- free(reg_list);
- return ERROR_FAIL;
+ retval = ERROR_FAIL;
+ goto error;
}
/* If we found some features associated with registers, create sections */
}
/* If we found some features associated with registers, create sections */
xml_printf(&retval, &tdesc, &pos, &size,
"</target>\n");
xml_printf(&retval, &tdesc, &pos, &size,
"</target>\n");
+error:
+
+ /* note: features[] contains (feature_list_size + 1) elements */
+ for (int j = feature_list_size; j >= 0; j--)
+ free(features[j]);
if (retval == ERROR_OK)
*tdesc_out = tdesc;
if (retval == ERROR_OK)
*tdesc_out = tdesc;
int retval = ERROR_OK;
struct reg **reg_list = NULL;
int reg_list_size = 0;
int retval = ERROR_OK;
struct reg **reg_list = NULL;
int reg_list_size = 0;
+ char **features = NULL;
int feature_list_size = 0;
char **features = NULL;
int feature_list_size = 0;
char **features = NULL;
}
if (reg_list_size <= 0) {
}
if (reg_list_size <= 0) {
+ LOG_ERROR("get register list failed");
retval = ERROR_FAIL;
goto error;
}
retval = ERROR_FAIL;
goto error;
}
- if (reg_list != NULL)
- free(reg_list);
- if (features != NULL)
- free(features);
+ /* note: features[] contains (feature_list_size + 1) elements */
+ for (int j = feature_list_size; j >= 0; j--)
+ free(features[j]);
+ free(features);
+
+ free(reg_list);