1
Fork 0
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:
Ludovic Courtès 2009-06-25 22:45:12 +02:00
parent 60ed31d28b
commit 376b6bd7a2

View file

@ -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);