mtasaka / rpms / inchi

Forked from rpms/inchi 2 years ago
Clone
6ef0b9e
From 26351733bde20eb16aedd62b4b64a2417615020e Mon Sep 17 00:00:00 2001
6ef0b9e
From: Mamoru TASAKA <mtasaka@fedoraproject.org>
6ef0b9e
Date: Thu, 25 Nov 2021 23:07:31 +0900
6ef0b9e
Subject: [PATCH] MolfileReadCountsLine: fix storing n_atoms, n_bonds members
6ef0b9e
 after reading short size
6ef0b9e
6ef0b9e
In MolfileReadCountsLine() (in INCHI_BASE/src/mol_fmt1.c), currently
6ef0b9e
ctab->n_atoms and ctab->n_bonds, which have int type (as defined in src/mol_fmt.h),
6ef0b9e
are passed to be MolfileReadField(), and to be treated there as if they have
6ef0b9e
short size (as MOL_FMT_SHORT_INT_DATA is also passed to the argument of
6ef0b9e
MolfileReadField(), and also the comment shows).
6ef0b9e
6ef0b9e
This causes a error on big endian system such as s390x, where for example
6ef0b9e
reading the line:
6ef0b9e
6ef0b9e
1  0  0  0  0  0  0  0  0  0999 V2000
6ef0b9e
6ef0b9e
On little endian (64bit) system, ctab->n_atoms is correctly stored as 1, but on
6ef0b9e
s390x (big endian 64bit) system, ctab->n_atoms gets 65536 (= 1<<16), which is
6ef0b9e
unexpected.
6ef0b9e
6ef0b9e
To fix this, once store the read value to short size local variable, then
6ef0b9e
copy the value to ctab->n_atoms or so later.
6ef0b9e
---
6ef0b9e
 INCHI_BASE/src/mol_fmt1.c | 7 +++++--
6ef0b9e
 1 file changed, 5 insertions(+), 2 deletions(-)
6ef0b9e
6ef0b9e
diff --git a/INCHI_BASE/src/mol_fmt1.c b/INCHI_BASE/src/mol_fmt1.c
6ef0b9e
index 41ed15e..c2ad11a 100644
6ef0b9e
--- a/INCHI_BASE/src/mol_fmt1.c
6ef0b9e
+++ b/INCHI_BASE/src/mol_fmt1.c
6ef0b9e
@@ -572,6 +572,7 @@ int MolfileReadCountsLine( MOL_FMT_CTAB* ctab,
6ef0b9e
     char line[MOL_FMT_INPLINELEN];
6ef0b9e
     const int line_len = sizeof( line );
6ef0b9e
     int   err = 0, len;
6ef0b9e
+    short n_atoms, n_bonds;
6ef0b9e
 
6ef0b9e
     p = inchi_fgetsLf( line, line_len, inp_file );
6ef0b9e
 
6ef0b9e
@@ -588,8 +589,8 @@ int MolfileReadCountsLine( MOL_FMT_CTAB* ctab,
6ef0b9e
         TREAT_ERR( err, 0, "Too long counts line" );  /* too long input file line */
6ef0b9e
     }
6ef0b9e
 
6ef0b9e
-    if (0 > MolfileReadField( &ctab->n_atoms, 3, MOL_FMT_SHORT_INT_DATA, &p ) /* V2000 only: short int */
6ef0b9e
-         || 0 > MolfileReadField( &ctab->n_bonds, 3, MOL_FMT_SHORT_INT_DATA, &p ) /* V2000 only: short int */
6ef0b9e
+    if (0 > MolfileReadField( &n_atoms, 3, MOL_FMT_SHORT_INT_DATA, &p ) /* V2000 only: short int */
6ef0b9e
+         || 0 > MolfileReadField( &n_bonds, 3, MOL_FMT_SHORT_INT_DATA, &p ) /* V2000 only: short int */
6ef0b9e
 
6ef0b9e
 #if ( MOL_FMT_QUERY == MOL_FMT_PRESENT )
6ef0b9e
          || 0 > MolfileReadField( &ctab->n_atom_lists, 3, MOL_FMT_SHORT_INT_DATA, &p )
6ef0b9e
@@ -621,6 +622,8 @@ int MolfileReadCountsLine( MOL_FMT_CTAB* ctab,
6ef0b9e
         AddErrorMessage( pStrErr, line );
6ef0b9e
         goto err_fin;
6ef0b9e
     }
6ef0b9e
+    ctab->n_atoms = n_atoms;
6ef0b9e
+    ctab->n_bonds = n_bonds;
6ef0b9e
 
6ef0b9e
     /* Get CTFile version (V2000 or other) */
6ef0b9e
     len = MolfileReadField( ctab->version_string,
6ef0b9e
-- 
6ef0b9e
2.33.1
6ef0b9e