mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
Fix `load-objcode' FD/mapping leak occurring upon failure.
* libguile/objcodes.c (make_objcode_by_mmap): Close FD and unmap ADDR upon failure.
This commit is contained in:
parent
60ed31d28b
commit
376b6bd7a2
1 changed files with 19 additions and 7 deletions
|
@ -63,19 +63,31 @@ make_objcode_by_mmap (int fd)
|
||||||
|
|
||||||
addr = mmap (0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
addr = mmap (0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
||||||
if (addr == MAP_FAILED)
|
if (addr == MAP_FAILED)
|
||||||
|
{
|
||||||
|
(void) close (fd);
|
||||||
SCM_SYSERROR;
|
SCM_SYSERROR;
|
||||||
|
}
|
||||||
|
|
||||||
if (memcmp (addr, OBJCODE_COOKIE, strlen (OBJCODE_COOKIE)))
|
if (memcmp (addr, OBJCODE_COOKIE, strlen (OBJCODE_COOKIE)))
|
||||||
|
{
|
||||||
|
(void) close (fd);
|
||||||
|
(void) munmap (addr, st.st_size);
|
||||||
scm_misc_error (FUNC_NAME, "bad header on object file: ~s",
|
scm_misc_error (FUNC_NAME, "bad header on object file: ~s",
|
||||||
scm_list_1 (scm_from_locale_stringn
|
scm_list_1 (scm_from_locale_stringn
|
||||||
(addr, strlen (OBJCODE_COOKIE))));
|
(addr, strlen (OBJCODE_COOKIE))));
|
||||||
|
}
|
||||||
|
|
||||||
data = (struct scm_objcode*)(addr + strlen (OBJCODE_COOKIE));
|
data = (struct scm_objcode*)(addr + strlen (OBJCODE_COOKIE));
|
||||||
|
|
||||||
if (data->len + data->metalen != (st.st_size - sizeof (*data) - strlen (OBJCODE_COOKIE)))
|
if (data->len + data->metalen != (st.st_size - sizeof (*data) - strlen (OBJCODE_COOKIE)))
|
||||||
|
{
|
||||||
|
(void) close (fd);
|
||||||
|
(void) munmap (addr, st.st_size);
|
||||||
scm_misc_error (FUNC_NAME, "bad length header (~a, ~a)",
|
scm_misc_error (FUNC_NAME, "bad length header (~a, ~a)",
|
||||||
scm_list_2 (scm_from_size_t (st.st_size),
|
scm_list_2 (scm_from_size_t (st.st_size),
|
||||||
scm_from_uint32 (sizeof (*data) + data->len + data->metalen)));
|
scm_from_uint32 (sizeof (*data) + data->len
|
||||||
|
+ data->metalen)));
|
||||||
|
}
|
||||||
|
|
||||||
SCM_NEWSMOB3 (sret, scm_tc16_objcode, addr + strlen (OBJCODE_COOKIE),
|
SCM_NEWSMOB3 (sret, scm_tc16_objcode, addr + strlen (OBJCODE_COOKIE),
|
||||||
SCM_PACK (SCM_BOOL_F), fd);
|
SCM_PACK (SCM_BOOL_F), fd);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue