Skip to content

Commit c1d94d7

Browse files
committed
Don't segfault when fastdev is used
1 parent 2460c63 commit c1d94d7

File tree

2 files changed

+22
-30
lines changed

2 files changed

+22
-30
lines changed

src/native/monodroid/embedded-assemblies.cc

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,32 @@ EmbeddedAssemblies::find_assembly_store_entry (hash_t hash, const AssemblyStoreI
190190
return nullptr;
191191
}
192192

193+
// TODO: need to forbid loading assemblies into non-default ALC if they contain marshal method callbacks.
194+
// The best way is probably to store the information in the assembly `MonoImage*` cache. We should
195+
// abort() if the assembly contains marshal callbacks.
193196
template<LoaderData TLoaderData>
194197
force_inline MonoAssembly*
195-
EmbeddedAssemblies::assembly_store_open_from_bundles (dynamic_local_string<SENSIBLE_PATH_MAX>& name, TLoaderData loader_data, bool ref_only) noexcept
198+
EmbeddedAssemblies::open_from_bundles (MonoAssemblyName* aname, TLoaderData loader_data, [[maybe_unused]] MonoError *error, bool ref_only) noexcept
196199
{
200+
#if defined (DEBUG)
201+
if (assembly_store_hashes == nullptr) {
202+
// With FastDev we might not have any assembly stores present
203+
return nullptr;
204+
}
205+
#endif
206+
207+
const char *culture = mono_assembly_name_get_culture (aname);
208+
const char *asmname = mono_assembly_name_get_name (aname);
209+
210+
dynamic_local_string<SENSIBLE_PATH_MAX> name;
211+
if (culture != nullptr && *culture != '\0') {
212+
name.append_c (culture);
213+
name.append (zip_path_separator);
214+
}
215+
name.append_c (asmname);
216+
197217
hash_t name_hash = xxhash::hash (name.get (), name.length ());
198-
log_debug (LOG_ASSEMBLY, "assembly_store_open_from_bundles: looking for bundled name: '%s' (hash 0x%zx)", name.get (), name_hash);
218+
log_debug (LOG_ASSEMBLY, "open_from_bundles: looking for bundled assembly '%s' (hash 0x%zx)", name.get (), name_hash);
199219

200220
const AssemblyStoreIndexEntry *hash_entry = find_assembly_store_entry (name_hash, assembly_store_hashes, assembly_store.index_entry_count);
201221
if (hash_entry == nullptr) {
@@ -256,32 +276,7 @@ EmbeddedAssemblies::assembly_store_open_from_bundles (dynamic_local_string<SENSI
256276

257277
MonoImageOpenStatus status;
258278
MonoAssembly *a = mono_assembly_load_from_full (image, name.get (), &status, ref_only);
259-
if (a == nullptr || status != MonoImageOpenStatus::MONO_IMAGE_OK) {
260-
log_warn (LOG_ASSEMBLY, "Failed to load managed assembly '%s'. %s", name.get (), mono_image_strerror (status));
261-
return nullptr;
262-
}
263-
264-
return a;
265-
}
266-
267-
// TODO: need to forbid loading assemblies into non-default ALC if they contain marshal method callbacks.
268-
// The best way is probably to store the information in the assembly `MonoImage*` cache. We should
269-
// abort() if the assembly contains marshal callbacks.
270-
template<LoaderData TLoaderData>
271-
force_inline MonoAssembly*
272-
EmbeddedAssemblies::open_from_bundles (MonoAssemblyName* aname, TLoaderData loader_data, [[maybe_unused]] MonoError *error, bool ref_only) noexcept
273-
{
274-
const char *culture = mono_assembly_name_get_culture (aname);
275-
const char *asmname = mono_assembly_name_get_name (aname);
276-
277-
dynamic_local_string<SENSIBLE_PATH_MAX> name;
278-
if (culture != nullptr && *culture != '\0') {
279-
name.append_c (culture);
280-
name.append (zip_path_separator);
281-
}
282-
name.append_c (asmname);
283279

284-
MonoAssembly *a = assembly_store_open_from_bundles (name, loader_data, ref_only);
285280
if (a == nullptr) {
286281
log_warn (LOG_ASSEMBLY, "open_from_bundles: failed to load bundled assembly %s", name.get ());
287282
#if defined(DEBUG)

src/native/monodroid/embedded-assemblies.hh

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,6 @@ namespace xamarin::android::internal {
197197

198198
void gather_bundled_assemblies_from_apk (const char* apk, monodroid_should_register should_register);
199199

200-
template<LoaderData TLoaderData>
201-
MonoAssembly* assembly_store_open_from_bundles (dynamic_local_string<SENSIBLE_PATH_MAX>& name, TLoaderData loader_data, bool ref_only) noexcept;
202-
203200
template<LoaderData TLoaderData>
204201
MonoAssembly* open_from_bundles (MonoAssemblyName* aname, TLoaderData loader_data, MonoError *error, bool ref_only) noexcept;
205202

0 commit comments

Comments
 (0)