diff options
Diffstat (limited to 'vppinfra')
-rw-r--r-- | vppinfra/tools/elftool.c | 13 | ||||
-rw-r--r-- | vppinfra/vppinfra/asm_x86.c | 4 | ||||
-rw-r--r-- | vppinfra/vppinfra/bitmap.h | 4 | ||||
-rw-r--r-- | vppinfra/vppinfra/elf.c | 11 | ||||
-rw-r--r-- | vppinfra/vppinfra/elf_clib.c | 8 | ||||
-rw-r--r-- | vppinfra/vppinfra/elog.c | 2 |
6 files changed, 31 insertions, 11 deletions
diff --git a/vppinfra/tools/elftool.c b/vppinfra/tools/elftool.c index f5d70b56d5f..d9d3704b4a3 100644 --- a/vppinfra/tools/elftool.c +++ b/vppinfra/tools/elftool.c @@ -358,10 +358,12 @@ set_interpreter_rpath (elf_tool_main_t * tm) } done: - if (mmap_length > 0) + if (mmap_length > 0 && idp) munmap (idp, mmap_length); - close (ifd); - close (ofd); + if (ifd >= 0) + close (ifd); + if (ofd >= 0) + close (ofd); return error; } @@ -408,7 +410,10 @@ int main (int argc, char * argv[]) } if (! tm->input_file) - clib_error ("no input file"); + { + error = clib_error_return (0, "no input file"); + goto done; + } /* Do the typical case a stone-simple way... */ if (tm->quiet && tm->set_interpreter && tm->set_rpath && tm->output_file) diff --git a/vppinfra/vppinfra/asm_x86.c b/vppinfra/vppinfra/asm_x86.c index d89739cbd90..16e41c249b1 100644 --- a/vppinfra/vppinfra/asm_x86.c +++ b/vppinfra/vppinfra/asm_x86.c @@ -1736,6 +1736,7 @@ static u8 * format_x86_reg_operand (u8 * s, va_list * va) { default: ASSERT (0); + break; case 'x': ASSERT (reg < 16); @@ -1816,6 +1817,7 @@ static u8 * format_x86_insn_operand (u8 * s, va_list * va) /* Memory or reg field from modrm byte. */ case 'M': ASSERT (p->flags & X86_INSN_IS_ADDRESS); + /* FALLTHROUGH */ case 'E': if (p->flags & X86_INSN_IS_ADDRESS) s = format (s, "%U", format_x86_mem_operand, p); @@ -1836,7 +1838,7 @@ static u8 * format_x86_insn_operand (u8 * s, va_list * va) case 'I': { u32 l = x86_insn_log2_immediate_bytes (p, insn); - i64 mask = pow2_mask (8 << l); + i64 mask = pow2_mask (8ULL << l); s = format (s, "$0x%Lx", p->immediate & mask); } break; diff --git a/vppinfra/vppinfra/bitmap.h b/vppinfra/vppinfra/bitmap.h index 35de1b4819f..17b72ac6c1f 100644 --- a/vppinfra/vppinfra/bitmap.h +++ b/vppinfra/vppinfra/bitmap.h @@ -196,7 +196,7 @@ clib_bitmap_get_multiple (uword * bitmap, uword i, uword n_bits) uword i0, i1, result; uword l = vec_len (bitmap); - ASSERT (n_bits >= 0 && n_bits <= BITS (result)); + ASSERT (n_bits <= BITS (result)); i0 = i / BITS (bitmap[0]); i1 = i % BITS (bitmap[0]); @@ -229,7 +229,7 @@ clib_bitmap_set_multiple (uword * bitmap, uword i, uword value, uword n_bits) { uword i0, i1, l, t, m; - ASSERT (n_bits >= 0 && n_bits <= BITS (value)); + ASSERT (n_bits <= BITS (value)); i0 = i / BITS (bitmap[0]); i1 = i % BITS (bitmap[0]); diff --git a/vppinfra/vppinfra/elf.c b/vppinfra/vppinfra/elf.c index 7fe3048b4c7..71ae1d33d70 100644 --- a/vppinfra/vppinfra/elf.c +++ b/vppinfra/vppinfra/elf.c @@ -559,7 +559,8 @@ format_elf_main (u8 * s, va_list * args) s = format (s, "\nSections %d at file offset 0x%Lx-0x%Lx:\n", fh->section_header_count, fh->section_header_file_offset, - fh->section_header_file_offset + fh->section_header_count * fh->section_header_size); + fh->section_header_file_offset + + (u64) fh->section_header_count * fh->section_header_size); s = format (s, "%U\n", format_elf_section, em, 0); vec_foreach (h, copy) s = format (s, "%U\n", format_elf_section, em, h); @@ -1604,7 +1605,7 @@ static void layout_sections (elf_main_t * em) fh->section_header_file_offset = file_offset; fh->section_header_count = vec_len (em->sections) - n_deleted_sections; - file_offset += fh->section_header_count * fh->section_header_size; + file_offset += (u64) fh->section_header_count * fh->section_header_size; } { @@ -1809,7 +1810,11 @@ clib_error_t * elf_write_file (elf_main_t * em, char * file_name) continue; if (fseek (f, s->header.file_offset, SEEK_SET) < 0) - return clib_error_return_unix (0, "fseek 0x%Lx", s->header.file_offset); + { + fclose(f); + return clib_error_return_unix (0, "fseek 0x%Lx", + s->header.file_offset); + } if (s->header.type == ELF_SECTION_NO_BITS) /* don't write for .bss sections */; diff --git a/vppinfra/vppinfra/elf_clib.c b/vppinfra/vppinfra/elf_clib.c index f3d3b32a8c5..8c705488a4b 100644 --- a/vppinfra/vppinfra/elf_clib.c +++ b/vppinfra/vppinfra/elf_clib.c @@ -82,6 +82,9 @@ path_search (char * file) if (file[0] == '.' || file[0] == '/') return file; + if (getenv("PATH") == 0) + return file; + ps.path = split_string (getenv ("PATH"), ':'); for (i = 0; i < vec_len (ps.path); i++) @@ -231,7 +234,10 @@ add_section (struct dl_phdr_info * info, size_t size, void * opaque) name = path_search (cem->exec_path); if (! name) - clib_error ("failed to find %s on PATH", cem->exec_path); + { + clib_error ("failed to find %s on PATH", cem->exec_path); + return 0; + } addr = 0; } diff --git a/vppinfra/vppinfra/elog.c b/vppinfra/vppinfra/elog.c index 06b97d8a390..7ae4ea1d2e2 100644 --- a/vppinfra/vppinfra/elog.c +++ b/vppinfra/vppinfra/elog.c @@ -582,6 +582,8 @@ void elog_merge (elog_main_t * dst, u8 * dst_tag, elog_track_t newt; int i; + memset(&newt, 0, sizeof (newt)); + elog_get_events (src); elog_get_events (dst); |