Hello! A recent version of GCC discovered a number of exploitable buffer overflows in Sword++. Find as attachment a patch ported for Sword master.
J
commit 0a78609a1993d1a4a3bf3eebcc1eab3fd30d77e9 Author: Jaak Ristioja <j...@ristioja.ee> Date: Thu Sep 28 08:24:58 2017 +0300 filters: Fixed a number of buffer overflows due to buffers being too short for sprintf. diff --git a/src/modules/filters/gbfstrongs.cpp b/src/modules/filters/gbfstrongs.cpp index c9b5af9d..5651b875 100644 --- a/src/modules/filters/gbfstrongs.cpp +++ b/src/modules/filters/gbfstrongs.cpp @@ -58,7 +58,7 @@ char GBFStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *modu bool lastspace = false; int word = 1; char val[128]; - char wordstr[5]; + char wordstr[11u]; char *valto; unsigned int textStart = 0, textEnd = 0; bool newText = false; diff --git a/src/modules/filters/gbfwordjs.cpp b/src/modules/filters/gbfwordjs.cpp index 63098a8e..f2233baf 100644 --- a/src/modules/filters/gbfwordjs.cpp +++ b/src/modules/filters/gbfwordjs.cpp @@ -65,7 +65,7 @@ char GBFWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modul bool intoken = false; int word = 1; char val[128]; - char wordstr[5]; + char wordstr[11u]; unsigned int textStart = 0, lastAppendLen = 0, textEnd = 0; SWBuf tmp; bool newText = false; @@ -137,7 +137,7 @@ char GBFWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modul text += token; text += '>'; if (needWordOut) { - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-2); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false; @@ -234,7 +234,7 @@ char GBFWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modul } } - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-1); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false; diff --git a/src/modules/filters/greeklexattribs.cpp b/src/modules/filters/greeklexattribs.cpp index cd04d30e..048c4acb 100644 --- a/src/modules/filters/greeklexattribs.cpp +++ b/src/modules/filters/greeklexattribs.cpp @@ -44,7 +44,7 @@ char GreekLexAttribs::processText(SWBuf &text, const SWKey *key, const SWModule string phrase; string freq; char val[128], *valto; - char wordstr[7]; + char wordstr[11u]; const char *currentPhrase = 0; const char *currentPhraseEnd = 0; int number = 0; diff --git a/src/modules/filters/osisstrongs.cpp b/src/modules/filters/osisstrongs.cpp index 898aa666..cf82202d 100644 --- a/src/modules/filters/osisstrongs.cpp +++ b/src/modules/filters/osisstrongs.cpp @@ -57,7 +57,7 @@ char OSISStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *mod SWBuf token; bool intoken = false; int wordNum = 1; - char wordstr[5]; + char wordstr[11u]; const char *wordStart = 0; SWBuf page = ""; // some modules include <seg> page info, so we add these to the words diff --git a/src/modules/filters/osiswordjs.cpp b/src/modules/filters/osiswordjs.cpp index b76b942c..3977b6eb 100644 --- a/src/modules/filters/osiswordjs.cpp +++ b/src/modules/filters/osiswordjs.cpp @@ -66,7 +66,7 @@ char OSISWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu int tokpos = 0; bool intoken = false; int wordNum = 1; - char wordstr[5]; + char wordstr[11u]; SWBuf modName = (module)?module->getName():""; // add TR to w src in KJV then remove this next line SWBuf wordSrcPrefix = (modName == "KJV")?SWBuf("TR"):modName; diff --git a/src/modules/filters/thmlstrongs.cpp b/src/modules/filters/thmlstrongs.cpp index 524ebfcc..f7b4f9ed 100644 --- a/src/modules/filters/thmlstrongs.cpp +++ b/src/modules/filters/thmlstrongs.cpp @@ -60,7 +60,7 @@ char ThMLStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *mod bool lastspace = false; int word = 1; char val[128]; - char wordstr[5]; + char wordstr[11u]; char *valto; char *ch; unsigned int textStart = 0, textEnd = 0; diff --git a/src/modules/filters/thmlwordjs.cpp b/src/modules/filters/thmlwordjs.cpp index f20f6384..93e19b05 100644 --- a/src/modules/filters/thmlwordjs.cpp +++ b/src/modules/filters/thmlwordjs.cpp @@ -68,7 +68,7 @@ char ThMLWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu char val[128]; char *valto; char *ch; - char wordstr[5]; + char wordstr[11u]; unsigned int textStart = 0, lastAppendLen = 0, textEnd = 0; SWBuf tmp; bool newText = false; @@ -151,7 +151,7 @@ char ThMLWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu text += token; text += '>'; if (needWordOut) { - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-2); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false; @@ -248,7 +248,7 @@ char ThMLWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu } } - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-1); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false;
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 commit 0a78609a1993d1a4a3bf3eebcc1eab3fd30d77e9 Author: Jaak Ristioja <j...@ristioja.ee> Date: Thu Sep 28 08:24:58 2017 +0300 filters: Fixed a number of buffer overflows due to buffers being too short for sprintf. diff --git a/src/modules/filters/gbfstrongs.cpp b/src/modules/filters/gbfstrongs.cpp index c9b5af9d..5651b875 100644 - --- a/src/modules/filters/gbfstrongs.cpp +++ b/src/modules/filters/gbfstrongs.cpp @@ -58,7 +58,7 @@ char GBFStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *modu bool lastspace = false; int word = 1; char val[128]; - - char wordstr[5]; + char wordstr[11u]; char *valto; unsigned int textStart = 0, textEnd = 0; bool newText = false; diff --git a/src/modules/filters/gbfwordjs.cpp b/src/modules/filters/gbfwordjs.cpp index 63098a8e..f2233baf 100644 - --- a/src/modules/filters/gbfwordjs.cpp +++ b/src/modules/filters/gbfwordjs.cpp @@ -65,7 +65,7 @@ char GBFWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modul bool intoken = false; int word = 1; char val[128]; - - char wordstr[5]; + char wordstr[11u]; unsigned int textStart = 0, lastAppendLen = 0, textEnd = 0; SWBuf tmp; bool newText = false; @@ -137,7 +137,7 @@ char GBFWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modul text += token; text += '>'; if (needWordOut) { - - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-2); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false; @@ -234,7 +234,7 @@ char GBFWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modul } } - - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-1); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false; diff --git a/src/modules/filters/greeklexattribs.cpp b/src/modules/filters/greeklexattribs.cpp index cd04d30e..048c4acb 100644 - --- a/src/modules/filters/greeklexattribs.cpp +++ b/src/modules/filters/greeklexattribs.cpp @@ -44,7 +44,7 @@ char GreekLexAttribs::processText(SWBuf &text, const SWKey *key, const SWModule string phrase; string freq; char val[128], *valto; - - char wordstr[7]; + char wordstr[11u]; const char *currentPhrase = 0; const char *currentPhraseEnd = 0; int number = 0; diff --git a/src/modules/filters/osisstrongs.cpp b/src/modules/filters/osisstrongs.cpp index 898aa666..cf82202d 100644 - --- a/src/modules/filters/osisstrongs.cpp +++ b/src/modules/filters/osisstrongs.cpp @@ -57,7 +57,7 @@ char OSISStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *mod SWBuf token; bool intoken = false; int wordNum = 1; - - char wordstr[5]; + char wordstr[11u]; const char *wordStart = 0; SWBuf page = ""; // some modules include <seg> page info, so we add these to the words diff --git a/src/modules/filters/osiswordjs.cpp b/src/modules/filters/osiswordjs.cpp index b76b942c..3977b6eb 100644 - --- a/src/modules/filters/osiswordjs.cpp +++ b/src/modules/filters/osiswordjs.cpp @@ -66,7 +66,7 @@ char OSISWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu int tokpos = 0; bool intoken = false; int wordNum = 1; - - char wordstr[5]; + char wordstr[11u]; SWBuf modName = (module)?module->getName():""; // add TR to w src in KJV then remove this next line SWBuf wordSrcPrefix = (modName == "KJV")?SWBuf("TR"):modName; diff --git a/src/modules/filters/thmlstrongs.cpp b/src/modules/filters/thmlstrongs.cpp index 524ebfcc..f7b4f9ed 100644 - --- a/src/modules/filters/thmlstrongs.cpp +++ b/src/modules/filters/thmlstrongs.cpp @@ -60,7 +60,7 @@ char ThMLStrongs::processText(SWBuf &text, const SWKey *key, const SWModule *mod bool lastspace = false; int word = 1; char val[128]; - - char wordstr[5]; + char wordstr[11u]; char *valto; char *ch; unsigned int textStart = 0, textEnd = 0; diff --git a/src/modules/filters/thmlwordjs.cpp b/src/modules/filters/thmlwordjs.cpp index f20f6384..93e19b05 100644 - --- a/src/modules/filters/thmlwordjs.cpp +++ b/src/modules/filters/thmlwordjs.cpp @@ -68,7 +68,7 @@ char ThMLWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu char val[128]; char *valto; char *ch; - - char wordstr[5]; + char wordstr[11u]; unsigned int textStart = 0, lastAppendLen = 0, textEnd = 0; SWBuf tmp; bool newText = false; @@ -151,7 +151,7 @@ char ThMLWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu text += token; text += '>'; if (needWordOut) { - - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-2); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false; @@ -248,7 +248,7 @@ char ThMLWordJS::processText(SWBuf &text, const SWKey *key, const SWModule *modu } } - - char wstr[10]; + char wstr[11u]; sprintf(wstr, "%03d", word-1); AttributeValue *wAttrs = &(module->getEntryAttributes()["Word"][wstr]); needWordOut = false; -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEMMPmmwJj7NabNzo/ZljyeG9R3q8FAlnMim8ACgkQZljyeG9R 3q94ZQ/5AUv8NNYDlKzQbvUkV3vGhPgZQkH2s+0LsI6CbTiWyeyh02mY7Cds5O0X wtVdVYwt56Qe3GznhGFuViqmsIa/gWPfUZcUpfyPzzj02Un8MrbsKDqJ9o5DGU2x /LK3gxNdsbvAcF6bujf1iwU7eZ7cJERU7K5B9tEEDf9lihH8BdXskmjOhEyD8EdV sKkozQdu7QznxmGPPVPXwwcd4/ra3sOfbqQ8V8HnUTlDc/1JcQJTbz1YareICHrB yHGwN4nn743J3u49KPXTsRcg8fF6JIp0QTfGz0/1BOnVNe9eIyUV+erKYquAex7y i2Yhj9v2AVRIK/2xGAiFaY3ZWAV2IagtKTlpmayAjSej0lleOP6gTzxbZdnG/oJ1 kW3So/vB01J1756mKpigernMofsiepUk/jJanlEgk+wewtuRB9iONNakaGHXJKmJ uAFux+qfVuKrTGXo63ISfbTp2kRq4UFaPwRexaPZkU6uB5drGMRl/OtuKBzloe/f g+ao39y4L3eedyr1vFH0gtbPCzA1IEZuoywdD2tZttYarCOo6XpZI/FhKEAQ3Y+v ZG3Qrt4uP05AKRDV7KbZtQm3uEhZU3LvThvqXa8qzzMYLBCqh0elG7/GDi6X7KKI c3Fts3H/+hxI5w8HKDlqxlMlFgK77QMGdlrTVz9JBlaAY592CtA= =MR/J -----END PGP SIGNATURE-----
_______________________________________________ sword-devel mailing list: sword-devel@crosswire.org http://www.crosswire.org/mailman/listinfo/sword-devel Instructions to unsubscribe/change your settings at above page