forked from github/server
fix a previously undetected bug in str_strlcpy.
This commit is contained in:
parent
a597d06484
commit
3be5211a53
|
@ -0,0 +1,19 @@
|
||||||
|
local path = 'scripts'
|
||||||
|
if config.install then
|
||||||
|
path = config.install .. '/' .. path
|
||||||
|
end
|
||||||
|
package.path = package.path .. ';' .. path .. '/?.lua;' .. path .. '/?/init.lua'
|
||||||
|
require 'eressea'
|
||||||
|
require 'eressea.xmlconf' -- read xml data
|
||||||
|
|
||||||
|
local rules = {}
|
||||||
|
if config.rules then
|
||||||
|
rules = require('eressea.' .. config.rules)
|
||||||
|
eressea.log.info('loaded ' .. #rules .. ' modules for ' .. config.rules)
|
||||||
|
else
|
||||||
|
eressea.log.warning('no rule modules loaded, specify a game in eressea.ini or with -r')
|
||||||
|
end
|
||||||
|
|
||||||
|
eressea.read_game(get_turn() .. '.dat')
|
||||||
|
init_reports()
|
||||||
|
write_reports()
|
|
@ -78,7 +78,7 @@ size_t str_strlcpy(char *dst, const char *src, size_t len)
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
if (len != 0)
|
if (len != 0)
|
||||||
*d = '\0'; /* NUL-terminate dst */
|
*d = '\0'; /* NUL-terminate dst */
|
||||||
while (*s++);
|
return (d - dst); /* count does not include NUL */
|
||||||
}
|
}
|
||||||
|
|
||||||
return (s - src - 1); /* count does not include NUL */
|
return (s - src - 1); /* count does not include NUL */
|
||||||
|
@ -285,6 +285,7 @@ void sbs_strcat(struct sbstring *sbs, const char *str)
|
||||||
len = sbs->size - (sbs->end - sbs->begin);
|
len = sbs->size - (sbs->end - sbs->begin);
|
||||||
len = str_strlcpy(sbs->end, str, len);
|
len = str_strlcpy(sbs->end, str, len);
|
||||||
sbs->end += len;
|
sbs->end += len;
|
||||||
|
assert(sbs->begin + sbs->size >= sbs->end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbs_strcpy(struct sbstring *sbs, const char *str)
|
void sbs_strcpy(struct sbstring *sbs, const char *str)
|
||||||
|
@ -294,23 +295,27 @@ void sbs_strcpy(struct sbstring *sbs, const char *str)
|
||||||
len = sbs->size - 1;
|
len = sbs->size - 1;
|
||||||
}
|
}
|
||||||
sbs->end = sbs->begin + len;
|
sbs->end = sbs->begin + len;
|
||||||
|
assert(sbs->begin + sbs->size >= sbs->end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbs_cut(sbstring *sbp, int bytes)
|
void sbs_cut(sbstring *sbs, int bytes)
|
||||||
{
|
{
|
||||||
if (bytes > 0) {
|
if (bytes > 0) {
|
||||||
size_t len = sbs_length(sbp) - bytes;
|
size_t len = sbs_length(sbs) - bytes;
|
||||||
memmove(sbp->begin, sbp->begin + bytes, len + 1);
|
memmove(sbs->begin, sbs->begin + bytes, len + 1);
|
||||||
sbp->end = sbp->begin + len;
|
sbs->end = sbs->begin + len;
|
||||||
}
|
}
|
||||||
else if (bytes < 0) {
|
else if (bytes < 0) {
|
||||||
size_t len = sbs_length(sbp) + bytes;
|
size_t len = sbs_length(sbs) + bytes;
|
||||||
sbp->end = sbp->begin + len;
|
sbs->end = sbs->begin + len;
|
||||||
}
|
}
|
||||||
|
assert(sbs->begin + sbs->size >= sbs->end);
|
||||||
|
assert(sbs->end[0] == '\0');
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t sbs_length(const struct sbstring *sbs)
|
size_t sbs_length(const struct sbstring *sbs)
|
||||||
{
|
{
|
||||||
|
assert(sbs->begin + sbs->size >= sbs->end);
|
||||||
return sbs->end - sbs->begin;
|
return sbs->end - sbs->begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,16 +115,21 @@ static void test_str_strlcpy(CuTest * tc)
|
||||||
|
|
||||||
memset(buffer, 0x7f, sizeof(buffer));
|
memset(buffer, 0x7f, sizeof(buffer));
|
||||||
|
|
||||||
CuAssertIntEquals(tc, 4, (int)str_strlcpy(buffer, "herp", 4));
|
CuAssertIntEquals(tc, 4, (int)str_strlcpy(buffer, "herp", 8));
|
||||||
CuAssertStrEquals(tc, "her", buffer);
|
|
||||||
|
|
||||||
CuAssertIntEquals(tc, 4, (int)str_strlcpy(buffer, "herp", 8)); /*-V666 */
|
|
||||||
CuAssertStrEquals(tc, "herp", buffer);
|
CuAssertStrEquals(tc, "herp", buffer);
|
||||||
CuAssertIntEquals(tc, 0x7f, buffer[5]);
|
CuAssertIntEquals(tc, 0x7f, buffer[5]);
|
||||||
|
|
||||||
CuAssertIntEquals(tc, 8, (int)str_strlcpy(buffer, "herpderp", 8));
|
CuAssertIntEquals(tc, 3, (int)str_strlcpy(buffer, "herp", 4));
|
||||||
|
CuAssertStrEquals(tc, "her", buffer);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, 7, (int)str_strlcpy(buffer, "herpderp", 8));
|
||||||
CuAssertStrEquals(tc, "herpder", buffer);
|
CuAssertStrEquals(tc, "herpder", buffer);
|
||||||
CuAssertIntEquals(tc, 0x7f, buffer[8]);
|
CuAssertIntEquals(tc, 0x7f, buffer[8]);
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, 8, (int)str_strlcpy(buffer, "herpderp", 16));
|
||||||
|
CuAssertStrEquals(tc, "herpderp", buffer);
|
||||||
|
CuAssertIntEquals(tc, 0x7f, buffer[9]);
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,6 +167,30 @@ static void test_sbstring(CuTest * tc)
|
||||||
CuAssertStrEquals(tc, "123456789012345", sbs.begin);
|
CuAssertStrEquals(tc, "123456789012345", sbs.begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_sbs_strcat(CuTest * tc)
|
||||||
|
{
|
||||||
|
char buffer[8];
|
||||||
|
sbstring sbs;
|
||||||
|
|
||||||
|
sbs_init(&sbs, buffer, sizeof(buffer));
|
||||||
|
sbs_strcat(&sbs, "AB");
|
||||||
|
CuAssertStrEquals(tc, "AB", sbs.begin);
|
||||||
|
sbs_strcat(&sbs, "CD");
|
||||||
|
CuAssertStrEquals(tc, "ABCD", sbs.begin);
|
||||||
|
|
||||||
|
sbs_init(&sbs, buffer, sizeof(buffer));
|
||||||
|
sbs_strcat(&sbs, "12345678901234567890");
|
||||||
|
CuAssertStrEquals(tc, "1234567", sbs.begin);
|
||||||
|
sbs_strcat(&sbs, "12345678901234567890");
|
||||||
|
CuAssertStrEquals(tc, "1234567", sbs.begin);
|
||||||
|
|
||||||
|
sbs_init(&sbs, buffer, sizeof(buffer));
|
||||||
|
sbs_strncat(&sbs, "12345678901234567890", 4);
|
||||||
|
CuAssertStrEquals(tc, "1234", sbs.begin);
|
||||||
|
sbs_strncat(&sbs, "12345678901234567890", 4);
|
||||||
|
CuAssertStrEquals(tc, "1234123", sbs.begin);
|
||||||
|
}
|
||||||
|
|
||||||
CuSuite *get_strings_suite(void)
|
CuSuite *get_strings_suite(void)
|
||||||
{
|
{
|
||||||
CuSuite *suite = CuSuiteNew();
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
@ -175,5 +204,6 @@ CuSuite *get_strings_suite(void)
|
||||||
SUITE_ADD_TEST(suite, test_str_strlcpy);
|
SUITE_ADD_TEST(suite, test_str_strlcpy);
|
||||||
SUITE_ADD_TEST(suite, test_str_itoa);
|
SUITE_ADD_TEST(suite, test_str_itoa);
|
||||||
SUITE_ADD_TEST(suite, test_sbstring);
|
SUITE_ADD_TEST(suite, test_sbstring);
|
||||||
|
SUITE_ADD_TEST(suite, test_sbs_strcat);
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue