-+ guint8* data = g_malloc (entry.length);
-+ if (TEMP_FAILURE_RETRY (read (tzdata_fd, data, entry.length) < entry.length))
-+ {
-+ g_warning ("Failed reading tzdata entry");
-+ g_free (data);
-+ goto error;
-+ }
-+
-+ close (tzdata_fd);
-+ return g_bytes_new_take (data, entry.length);
++ zoneinfo = g_bytes_new_with_free_func (tzdata + header_data_offset + entry_offset,
++ entry_length,
++ (GDestroyNotify)g_mapped_file_unref,
++ g_mapped_file_ref (file));
++ g_mapped_file_unref (file);
++ return zoneinfo;