From 30cc5405aeaf8db1aef00718ce21f2b2decad9c8 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 12:59:03 +0100 Subject: [PATCH 1/9] CID 22467: Division or modulo by zero github issue #348 --- src/names.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/names.c b/src/names.c index 71c4c6504..f608764d8 100644 --- a/src/names.c +++ b/src/names.c @@ -238,9 +238,6 @@ static const char *dragon_name(const unit * u) if (num_postfix == 0) num_postfix = -1; } - if (num_postfix <= 0) { - return NULL; - } if (u) { region *r = u->region; @@ -264,9 +261,16 @@ static const char *dragon_name(const unit * u) } } - rnd = num_postfix / 6; - rnd = (rng_int() % rnd) + ter * rnd; - + if (num_postfix <=0) { + return NULL; + } + else if (num_postfix < 6) { + rnd = rng_int() % num_postfix; + } + else { + rnd = num_postfix / 6; + rnd = (rng_int() % rnd) + ter * rnd; + } sprintf(zText, "dragon_postfix_%d", rnd); str = locale_getstring(default_locale, zText); From eea0186601bd43365132cddda3031ac3f3292b3f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 14:16:15 +0100 Subject: [PATCH 2/9] 22440 Unchecked return value from library rewrite log rotation, check errors --- src/util/log.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/util/log.c b/src/util/log.c index 33ca16abc..953557923 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -76,27 +76,24 @@ cp_convert(const char *format, char *buffer, size_t length, int codepage) void log_rotate(const char *filename, int maxindex) { - int n; if (_access(filename, 4) == 0) { char buffer[2][MAX_PATH]; - int src = 1; + int dst = 1; assert(strlen(filename) < sizeof(buffer[0]) - 4); - for (n = 0; n < maxindex; ++n) { - sprintf(buffer[0], "%s.%d", filename, n); - if (_access(filename, 0) != 0) { - break; + + sprintf(buffer[dst], "%s.%d", filename, maxindex); + while (maxindex > 0) { + int err, src = dst - 1; + sprintf(buffer[src], "%s.%d", filename, --maxindex); + err = rename(buffer[src], buffer[dst]); + if (err != 0) { + log_error("log rotate %s: %s", buffer[dst], strerror(errno)); } + dst = src; } - if (_access(buffer[0], 0) == 0) { - unlink(buffer[0]); + if (rename(filename, buffer[dst]) != 0) { + log_error("log rotate %s: %s", buffer[dst], strerror(errno)); } - while (n--) { - int dst = 1 - src; - sprintf(buffer[src], "%s.%d", filename, n); - rename(buffer[src], buffer[dst]); - src = dst; - } - rename(filename, buffer[1 - src]); } } From 0a5bd9d3567d954d4c1f4f117853534ad9a3850e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 14:19:43 +0100 Subject: [PATCH 3/9] 22480 Dereference after null check --- src/magic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/magic.c b/src/magic.c index a9aa682ec..62fca7314 100644 --- a/src/magic.c +++ b/src/magic.c @@ -480,7 +480,7 @@ void pick_random_spells(faction * f, int level, spellbook * book, int num_spells } } - if (spellno < maxspell) { + if (sbe && spellno < maxspell) { if (!f->spellbook) { f->spellbook = create_spellbook(0); } From 6e3175173180fcdeaa224d04390898e46c75d425 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 14:22:45 +0100 Subject: [PATCH 4/9] =?UTF-8?q?CID=2022542=20Resource=20leak=20Fix=20broke?= =?UTF-8?q?n=20error=20mesasge:=20"Die=20Einheit=20hat=20diesen=20Gegensta?= =?UTF-8?q?nd=20zwar,=20aber=20s=C3=A4mtliche=20$int($reservation)=20$reso?= =?UTF-8?q?urce($resource,$reservation)=20sind=20reserviert."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/give.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/give.c b/src/give.c index 6d1d525e8..a95f3dd29 100644 --- a/src/give.c +++ b/src/give.c @@ -165,8 +165,8 @@ struct order *ord) else if (n == 0) { int reserve = get_reservation(src, itype); if (reserve) { - msg_feedback(src, ord, "nogive_reserved", "resource reservation", - itype->rtype, reserve); + ADDMSG(&src->faction->msgs, msg_feedback(src, ord, "nogive_reserved", "resource reservation", + itype->rtype, reserve)); return -1; } error = 36; From 0271336428aeb453b3d0cc74d40be93f8c89a36b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 14:24:44 +0100 Subject: [PATCH 5/9] CID 22494 Identical code for different branches --- src/give.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/give.c b/src/give.c index a95f3dd29..11c3f12c5 100644 --- a/src/give.c +++ b/src/give.c @@ -618,8 +618,6 @@ void give_cmd(unit * u, order * ord) * item-liste der unit, darum continue vor pointerumsetzten */ if (give_item(itm->number, itm->type, u, u2, ord) == 0) { given = true; - if (*itmp != itm) - continue; continue; } } From 65f1574312bca4439f9a3ec4f817e9e1523e6c7d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 14:27:38 +0100 Subject: [PATCH 6/9] CID 22490 Dereference after null check --- src/give.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/give.c b/src/give.c index 11c3f12c5..e41ee19f5 100644 --- a/src/give.c +++ b/src/give.c @@ -403,7 +403,7 @@ void give_unit(unit * u, unit * u2, order * ord) int maxt = max_transfers(); assert(u); - if (!rule_transfermen() && u->faction != u2->faction) { + if (!rule_transfermen() && u2 && u->faction != u2->faction) { cmistake(u, ord, 74, MSG_COMMERCE); return; } From 10f2dd2d6e6a733a041cefea406d6c77069b6e2f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 14:52:10 +0100 Subject: [PATCH 7/9] CID 22497 Missing break in switch make this code easier to read, favor if over switch --- src/creport.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/creport.c b/src/creport.c index 9c2d2c423..c077db5f0 100644 --- a/src/creport.c +++ b/src/creport.c @@ -361,10 +361,10 @@ static int cr_race(variant var, char *buffer, const void *userdata) static int cr_alliance(variant var, char *buffer, const void *userdata) { const alliance *al = (const alliance *)var.v; + unused_arg(userdata); if (al != NULL) { sprintf(buffer, "%d", al->id); } - unused_arg(userdata); return 0; } @@ -372,6 +372,7 @@ static int cr_skill(variant var, char *buffer, const void *userdata) { const faction *report = (const faction *)userdata; skill_t sk = (skill_t)var.i; + unused_arg(userdata); if (sk != NOSKILL) sprintf(buffer, "\"%s\"", translate(mkname("skill", skillnames[sk]), skillname(sk, @@ -384,6 +385,7 @@ static int cr_skill(variant var, char *buffer, const void *userdata) static int cr_order(variant var, char *buffer, const void *userdata) { order *ord = (order *)var.v; + unused_arg(userdata); if (ord != NULL) { char cmd[ORDERSIZE]; char *wp = buffer; @@ -393,13 +395,11 @@ static int cr_order(variant var, char *buffer, const void *userdata) *wp++ = '\"'; for (rp = cmd; *rp;) { - switch (*rp) { - case '\"': - case '\\': + char r = *rp++; + if (r == '\"' || r == '\\') { *wp++ = '\\'; - default: - *wp++ = *rp++; } + *wp++ = r; } *wp++ = '\"'; *wp++ = 0; From 67e2eafbcfde78bef88cefb34bbe5297e2a37669 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 14:55:13 +0100 Subject: [PATCH 8/9] add missing include (MSVC is not picky enough) --- src/util/log.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/log.c b/src/util/log.c index 953557923..9f5f0abb2 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -15,6 +15,7 @@ without prior permission by the authors of Eressea. #include "unicode.h" #include +#include #include #include #include From 075de3c919a73245ccbc7f8edec769a6e44074a6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 4 Nov 2015 15:00:15 +0100 Subject: [PATCH 9/9] math is hard, typing is harder. bugfix. thank you, valgrind my friend. --- src/util/log.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/log.c b/src/util/log.c index 9f5f0abb2..29b0e1151 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -84,7 +84,7 @@ void log_rotate(const char *filename, int maxindex) sprintf(buffer[dst], "%s.%d", filename, maxindex); while (maxindex > 0) { - int err, src = dst - 1; + int err, src = 1 - dst; sprintf(buffer[src], "%s.%d", filename, --maxindex); err = rename(buffer[src], buffer[dst]); if (err != 0) {