diff --git a/CHANGELOG.txt b/CHANGELOG.txt index af007259420189de595538d71a69c4e3aea0bde0..c5ae5d2a49de307843bd31c986b7bab853c880dd 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,10 @@ -Changes in Release 1.2.2 +Changes In Release 1.2.3 +-------------------------------------------------------------------------------- + + * PDBWriter: Prevent writing of out-of-bounds atom coordinates. +Changes in Release 1.2.2 +-------------------------------------------------------------------------------- * Fixed loop indentation in the PDBize function for bio units, leading to exponential running time/ memory consumption. This problem only affected a fraction of PDB entries. diff --git a/CMakeLists.txt b/CMakeLists.txt index 12d7c437b3d323f549ee212953d1137f83208b22..e20df9ab673a010a06b86d6699ec0b86ef13d6a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 2.6.4 FATAL_ERROR) project(OpenStructure CXX C) set (OST_VERSION_MAJOR 1) set (OST_VERSION_MINOR 2) -set (OST_VERSION_PATCH 2) +set (OST_VERSION_PATCH 3) set (OST_VERSION_STRING ${OST_VERSION_MAJOR}.${OST_VERSION_MINOR}.${OST_VERSION_PATCH} ) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_support) include(OST) diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc index e54da5baec836003654ab38adea7eac8a2880fb9..af00fb80656f02846c90a47070e0f1aa609af807 100644 --- a/modules/io/src/mol/pdb_writer.cc +++ b/modules/io/src/mol/pdb_writer.cc @@ -69,6 +69,15 @@ bool shift_left(const String& atom_name, bool is_hetatm, element=="MG" || element=="LI"); } + +bool atom_pos_ok(geom::Vec3 p) { + for (int i=0; i<3; ++i) { + if (p[i]<=-1000 || p[i] >= 10000) { + return false; + } + } + return true; +} void write_atom(std::ostream& ostr, FormattedLine& line, const mol::AtomHandle& atom, int atomnum, bool is_pqr, bool charmm_style) @@ -132,6 +141,9 @@ void write_atom(std::ostream& ostr, FormattedLine& line, // deal with alternative atom locations if (names.empty()) { + if (!atom_pos_ok(p)) { + throw IOException("Atom position outside of bounds supported by PDB format"); + } line(30, 8)=fmt::LPaddedFloat(p[0], 3); line(38, 8)=fmt::LPaddedFloat(p[1], 3); line(46, 8)=fmt::LPaddedFloat(p[2], 3); @@ -162,6 +174,9 @@ void write_atom(std::ostream& ostr, FormattedLine& line, p=atom.GetEntity().GetTransform().Apply(atom.GetAltPos(*i)); line(30, 50).Clear(); + if (!atom_pos_ok(p)) { + throw IOException("Atom position outside of bounds supported by PDB format"); + } if (i->size()>1) { throw IOException("Alternative atom indicator '"+atom.GetQualifiedName()+ "("+*i+")' too long for PDB output. At most 1 " diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc index d1e9526c574fa69d345f961c26181fc07b289280..9b5b6691f6a9410a943bc4ea5850e3e261513d2a 100644 --- a/modules/io/tests/test_io_pdb.cc +++ b/modules/io/tests/test_io_pdb.cc @@ -1035,6 +1035,24 @@ BOOST_AUTO_TEST_CASE(test_pqr_read_atom) BOOST_CHECK_CLOSE(a2.GetRadius(), Real(1.7503), Real(1e-4)); } +BOOST_AUTO_TEST_CASE(checks_for_atom_pos_overflow) +{ + std::stringstream out; + PDBWriter writer(out, IOProfile()); + writer.SetIsPQR(true); + + mol::EntityHandle ent=mol::CreateEntity(); + mol::XCSEditor edi=ent.EditXCS(); + mol::ChainHandle ch=edi.InsertChain("A"); + mol::ResidueHandle r=edi.AppendResidue(ch, "GLY"); + + mol::AtomHandle a=edi.InsertAtom(r, "CA", geom::Vec3(0, -1000,0), "C"); + + BOOST_CHECK_THROW(writer.Write(ent), IOException); + edi.SetAtomPos(a, geom::Vec3(10000,0,0)); + BOOST_CHECK_THROW(writer.Write(ent), IOException); +} + BOOST_AUTO_TEST_CASE(test_pqr_write_atom) { std::stringstream out;