projects
/
babeltrace.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Tests: dereference of NULL pointer on allocation failure
[babeltrace.git]
/
lib
/
bin-info.c
diff --git
a/lib/bin-info.c
b/lib/bin-info.c
index e5d515005125510e0537603e05d299aac904839c..65f9051fb00efe087c24c1fe9f66696cf081ebd1 100644
(file)
--- a/
lib/bin-info.c
+++ b/
lib/bin-info.c
@@
-41,6
+41,7
@@
#include <babeltrace/crc32.h>
#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/utils.h>
#include <babeltrace/crc32.h>
#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/utils.h>
+#include <errno.h>
/*
* An address printed in hex is at most 20 bytes (16 for 64-bits +
/*
* An address printed in hex is at most 20 bytes (16 for 64-bits +
@@
-188,7
+189,7
@@
error:
*
* @param bin bin_info instance for which to set DWARF info
* @param path Presumed location of the DWARF info
*
* @param bin bin_info instance for which to set DWARF info
* @param path Presumed location of the DWARF info
- * @returns 0 on success,
-1
on failure
+ * @returns 0 on success,
negative value
on failure
*/
static
int bin_info_set_dwarf_info_from_path(struct bin_info *bin, char *path)
*/
static
int bin_info_set_dwarf_info_from_path(struct bin_info *bin, char *path)
@@
-203,6
+204,7
@@
int bin_info_set_dwarf_info_from_path(struct bin_info *bin, char *path)
fd = open(path, O_RDONLY);
if (fd < 0) {
fd = open(path, O_RDONLY);
if (fd < 0) {
+ fd = -errno;
goto error;
}
goto error;
}
@@
-236,12
+238,15
@@
int bin_info_set_dwarf_info_from_path(struct bin_info *bin, char *path)
return 0;
error:
return 0;
error:
- close(fd);
+ if (fd >= 0) {
+ close(fd);
+ fd = -1;
+ }
dwarf_end(dwarf_info);
g_free(dwarf_info);
free(cu);
dwarf_end(dwarf_info);
g_free(dwarf_info);
free(cu);
- return
-1
;
+ return
fd
;
}
/**
}
/**
@@
-324,12
+329,12
@@
int is_valid_debug_file(char *path, uint32_t crc)
uint32_t _crc = 0;
if (!path) {
uint32_t _crc = 0;
if (!path) {
- goto end;
+ goto end
_noclose
;
}
fd = open(path, O_RDONLY);
if (fd < 0) {
}
fd = open(path, O_RDONLY);
if (fd < 0) {
- goto end;
+ goto end
_noclose
;
}
ret = crc32(fd, &_crc);
}
ret = crc32(fd, &_crc);
@@
-342,6
+347,7
@@
int is_valid_debug_file(char *path, uint32_t crc)
end:
close(fd);
end:
close(fd);
+end_noclose:
return ret;
}
return ret;
}
@@
-436,7
+442,7
@@
found:
* Initialize the DWARF info for a given executable.
*
* @param bin bin_info instance
* Initialize the DWARF info for a given executable.
*
* @param bin bin_info instance
- * @returns 0 on success,
-1
on failure
+ * @returns 0 on success,
negative value
on failure
*/
static
int bin_info_set_dwarf_info(struct bin_info *bin)
*/
static
int bin_info_set_dwarf_info(struct bin_info *bin)
@@
-444,7
+450,8
@@
int bin_info_set_dwarf_info(struct bin_info *bin)
int ret = 0;
if (!bin) {
int ret = 0;
if (!bin) {
- goto error;
+ ret = -1;
+ goto end;
}
/* First try to set the DWARF info from the ELF file */
}
/* First try to set the DWARF info from the ELF file */
@@
-467,8
+474,6
@@
int bin_info_set_dwarf_info(struct bin_info *bin)
goto end;
}
goto end;
}
-error:
- ret = -1;
end:
return ret;
}
end:
return ret;
}
@@
-477,7
+482,7
@@
end:
* Initialize the ELF file for a given executable.
*
* @param bin bin_info instance
* Initialize the ELF file for a given executable.
*
* @param bin bin_info instance
- * @returns 0 on success,
-1 on failure
+ * @returns 0 on success,
negative value on error.
*/
static
int bin_info_set_elf_file(struct bin_info *bin)
*/
static
int bin_info_set_elf_file(struct bin_info *bin)
@@
-491,6
+496,7
@@
int bin_info_set_elf_file(struct bin_info *bin)
elf_fd = open(bin->elf_path, O_RDONLY);
if (elf_fd < 0) {
elf_fd = open(bin->elf_path, O_RDONLY);
if (elf_fd < 0) {
+ elf_fd = -errno;
printf_verbose("Failed to open %s\n", bin->elf_path);
goto error;
}
printf_verbose("Failed to open %s\n", bin->elf_path);
goto error;
}
@@
-514,9
+520,10
@@
int bin_info_set_elf_file(struct bin_info *bin)
error:
if (elf_fd >= 0) {
close(elf_fd);
error:
if (elf_fd >= 0) {
close(elf_fd);
+ elf_fd = -1;
}
elf_end(elf_file);
}
elf_end(elf_file);
- return
-1
;
+ return
elf_fd
;
}
BT_HIDDEN
}
BT_HIDDEN
@@
-760,7
+767,7
@@
int bin_info_lookup_elf_function_name(struct bin_info *bin, uint64_t addr,
error:
g_free(shdr);
g_free(sym);
error:
g_free(shdr);
g_free(sym);
- return
-1
;
+ return
ret
;
}
/**
}
/**
@@
-824,11
+831,13
@@
int bin_info_lookup_cu_function_name(struct bt_dwarf_cu *cu, uint64_t addr,
ret = dwarf_lowpc(die->dwarf_die, &low_addr);
if (ret) {
ret = dwarf_lowpc(die->dwarf_die, &low_addr);
if (ret) {
+ free(die_name);
goto error;
}
ret = bin_info_append_offset_str(die_name, low_addr, addr,
func_name);
goto error;
}
ret = bin_info_append_offset_str(die_name, low_addr, addr,
func_name);
+ free(die_name);
if (ret) {
goto error;
}
if (ret) {
goto error;
}
@@
-913,6
+922,7
@@
int bin_info_lookup_function_name(struct bin_info *bin, uint64_t addr,
if (!bin->dwarf_info && !bin->is_elf_only) {
ret = bin_info_set_dwarf_info(bin);
if (ret) {
if (!bin->dwarf_info && !bin->is_elf_only) {
ret = bin_info_set_dwarf_info(bin);
if (ret) {
+ printf_verbose("Failed to set bin dwarf info, falling back to ELF lookup.\n");
/* Failed to set DWARF info, fallback to ELF. */
bin->is_elf_only = true;
}
/* Failed to set DWARF info, fallback to ELF. */
bin->is_elf_only = true;
}
@@
-932,12
+942,10
@@
int bin_info_lookup_function_name(struct bin_info *bin, uint64_t addr,
if (bin->is_elf_only) {
ret = bin_info_lookup_elf_function_name(bin, addr, &_func_name);
if (bin->is_elf_only) {
ret = bin_info_lookup_elf_function_name(bin, addr, &_func_name);
+ printf_verbose("Failed to lookup function name (elf), error %i\n", ret);
} else {
ret = bin_info_lookup_dwarf_function_name(bin, addr, &_func_name);
} else {
ret = bin_info_lookup_dwarf_function_name(bin, addr, &_func_name);
- }
-
- if (ret || !_func_name) {
- goto error;
+ printf_verbose("Failed to lookup function name (dwarf), error %i\n", ret);
}
*func_name = _func_name;
}
*func_name = _func_name;
@@
-1029,7
+1037,7
@@
int bin_info_child_die_has_address(struct bt_dwarf_die *die, uint64_t addr, bool
goto error;
}
goto error;
}
- if (contains) {
+ if (
_
contains) {
goto end;
}
}
goto end;
}
}
This page took
0.025903 seconds
and
4
git commands to generate.