2007-07-08 Pedro Alves * solib-target.c (core_addr_from_ulongest): New. (library_list_start_segment): Use core_addr_from_ulongest. --- gdb/solib-target.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) Index: src/gdb/solib-target.c =================================================================== --- src.orig/gdb/solib-target.c 2007-07-04 01:19:56.000000000 +0100 +++ src/gdb/solib-target.c 2007-07-07 16:32:44.000000000 +0100 @@ -72,6 +72,43 @@ solib_target_parse_libraries (const char #include "xml-support.h" +static int +core_addr_from_ulongest (CORE_ADDR* to, const ULONGEST* from) +{ + int erange = 0; + + if (sizeof (*to) == 4 && sizeof (*from) == 8) + { + unsigned int high_part; + unsigned int low_part; + CORE_ADDR neg_one = ~ (CORE_ADDR) 0; + + high_part = *from >> 32; + low_part = *from & 0xffffffff; + + if (neg_one < 1) + { + /* CORE_ADDR is signed. */ + if (high_part != 0xffffffff && high_part != 0) + erange = 1; + else if (high_part == 0xffffffff && low_part < 0x80000000) + erange = 1; + } + else if (high_part != 0) + erange = 1; + } + + *to = (CORE_ADDR) *from; + + if (erange) + { + errno = ERANGE; + return -1; + } + + return 0; +} + /* Handle the start of a element. */ static void @@ -82,8 +119,12 @@ library_list_start_segment (struct gdb_x VEC(lm_info_p) **list = user_data; struct lm_info *last = VEC_last (lm_info_p, *list); ULONGEST *address_p = VEC_index (gdb_xml_value_s, attributes, 0)->value; + CORE_ADDR address; + + if (core_addr_from_ulongest (&address, address_p) < 0) + warning (_("Target reported an out-of-range address.")); - VEC_safe_push (CORE_ADDR, last->segment_bases, address_p); + VEC_safe_push (CORE_ADDR, last->segment_bases, &address); } /* Handle the start of a element. */