Skip to content

Commit

Permalink
Allow incorrect paths for jar files in the classpath without crashing
Browse files Browse the repository at this point in the history
  • Loading branch information
NathanJPhillips committed Mar 28, 2018
1 parent ce89a41 commit acaaaab
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 13 deletions.
2 changes: 1 addition & 1 deletion regression/cbmc-java/invalid_classpath/test-jar.desc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
KNOWNBUG
CORE
Test.class
--classpath ./NotHere.jar
^EXIT=6$
Expand Down
29 changes: 17 additions & 12 deletions src/java_bytecode/java_class_loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,9 @@ java_class_loadert::parse_tree_with_overlayst &java_class_loadert::operator()(
optionalt<java_bytecode_parse_treet> java_class_loadert::get_class_from_jar(
const irep_idt &class_name,
const std::string &jar_file,
const jar_indext &jar_index,
java_class_loader_limitt &class_loader_limit)
{
jar_indext &jar_index = jars_by_path.at(jar_file);
auto jar_index_it = jar_index.find(class_name);
if(jar_index_it == jar_index.end())
return {};
Expand Down Expand Up @@ -112,9 +112,11 @@ java_class_loadert::get_parse_tree(
// First add all given JAR files
for(const auto &jar_file : jar_files)
{
read_jar_file(class_loader_limit, jar_file);
jar_index_optcreft index = read_jar_file(class_loader_limit, jar_file);
if(!index)
continue;
optionalt<java_bytecode_parse_treet> parse_tree =
get_class_from_jar(class_name, jar_file, class_loader_limit);
get_class_from_jar(class_name, jar_file, *index, class_loader_limit);
if(parse_tree)
parse_trees.push_back(*parse_tree);
}
Expand All @@ -130,23 +132,26 @@ java_class_loadert::get_parse_tree(

// This does not read from the jar file but from the jar_filet object we
// just created
read_jar_file(class_loader_limit, core_models);

optionalt<java_bytecode_parse_treet> parse_tree =
get_class_from_jar(class_name, core_models, class_loader_limit);
if(parse_tree)
parse_trees.push_back(*parse_tree);
jar_index_optcreft index = read_jar_file(class_loader_limit, core_models);
if(index)
{
optionalt<java_bytecode_parse_treet> parse_tree =
get_class_from_jar(class_name, core_models, *index, class_loader_limit);
if(parse_tree)
parse_trees.push_back(*parse_tree);
}
}

// Then add everything on the class path
for(const auto &cp_entry : config.java.classpath)
{
if(has_suffix(cp_entry, ".jar"))
{
read_jar_file(class_loader_limit, cp_entry);

jar_index_optcreft index = read_jar_file(class_loader_limit, cp_entry);
if(!index)
continue;
optionalt<java_bytecode_parse_treet> parse_tree =
get_class_from_jar(class_name, cp_entry, class_loader_limit);
get_class_from_jar(class_name, cp_entry, *index, class_loader_limit);
if(parse_tree)
parse_trees.push_back(*parse_tree);
}
Expand Down
1 change: 1 addition & 0 deletions src/java_bytecode/java_class_loader.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ class java_class_loadert:public messaget
optionalt<java_bytecode_parse_treet> get_class_from_jar(
const irep_idt &class_name,
const std::string &jar_file,
const jar_indext &jar_index,
java_class_loader_limitt &class_loader_limit);
};

Expand Down

0 comments on commit acaaaab

Please sign in to comment.