gsize r = 0;
if (str) {
- r = rspamd_strlcpy (outbuf, str, len);
+ r = rspamd_strlcpy (outbuf, str, len + 1);
}
return r;
if ((gdouble)(glong)num == num) {
inum = num;
- r = rspamd_snprintf (outbuf, len, "%l", inum);
+ r = rspamd_snprintf (outbuf, len + 1, "%l", inum);
}
else {
- r = rspamd_snprintf (outbuf, len, "%f", num);
+ r = rspamd_snprintf (outbuf, len + 1, "%f", num);
}
return r;
gboolean val = lua_toboolean (L, pos);
gsize r = 0;
- r = rspamd_strlcpy (outbuf, val ? "true" : "false", len);
+ r = rspamd_strlcpy (outbuf, val ? "true" : "false", len + 1);
return r;
}
{
gint r;
- if (!lua_getmetatable (L, pos)) {
+ if (!lua_getmetatable (L, pos) || len == 0) {
return 0;
}
return 0;
}
- r = rspamd_snprintf (outbuf, len, "%s(%p)", lua_tostring (L, -1),
+ r = rspamd_snprintf (outbuf, len + 1, "%s(%p)", lua_tostring (L, -1),
lua_touserdata (L, pos));
lua_pop (L, 3);
return r;
}
-#define MOVE_BUF(d, remain, r) if ((remain) - (r) == 0) break; (d) += (r); (remain) -= (r)
+#define MOVE_BUF(d, remain, r) \
+ (d) += (r); (remain) -= (r); \
+ if ((remain) == 0) { lua_pop (L, 1); break; }
static gsize
lua_logger_out_table (lua_State *L, gint pos, gchar *outbuf, gsize len)
gboolean first = TRUE;
gint i;
- if (!lua_istable (L, pos)) {
+ if (!lua_istable (L, pos) || remain == 0) {
return 0;
}
lua_pushvalue (L, pos);
- r = rspamd_snprintf (d, remain, "{");
+ r = rspamd_snprintf (d, remain + 1, "{");
remain -= r;
d += r;
}
if (!first) {
- r = rspamd_snprintf (d, remain, ", ");
+ r = rspamd_snprintf (d, remain + 1, ", ");
MOVE_BUF(d, remain, r);
}
- r = rspamd_snprintf (d, remain, "[%d] = ", i);
+ r = rspamd_snprintf (d, remain + 1, "[%d] = ", i);
MOVE_BUF(d, remain, r);
r = lua_logger_out_type (L, -1, d, remain);
MOVE_BUF(d, remain, r);
}
/* Get string keys (pairs) */
- for (lua_pushnil (L); lua_next (L, -2) && remain > 0; lua_pop (L, 1)) {
+ for (lua_pushnil (L); lua_next (L, -2); lua_pop (L, 1)) {
/* 'key' is at index -2 and 'value' is at index -1 */
if (lua_type (L, -2) == LUA_TNUMBER) {
}
if (!first) {
- r = rspamd_snprintf (d, remain, ", ");
+ r = rspamd_snprintf (d, remain + 1, ", ");
MOVE_BUF(d, remain, r);
}
- r = rspamd_snprintf (d, remain, "[%s] = ",
+ r = rspamd_snprintf (d, remain + 1, "[%s] = ",
lua_tostring (L, -2));
MOVE_BUF(d, remain, r);
r = lua_logger_out_type (L, lua_gettop (L), d, remain);
lua_pop (L, 1);
- r = rspamd_snprintf (d, remain, "}");
+ r = rspamd_snprintf (d, remain + 1, "}");
d += r;
return (d - outbuf);
gint type;
gsize r = 0;
+ if (len == 0) {
+ return 0;
+ }
+
type = lua_type (L, pos);
switch (type) {
} state = copy_char;
d = logbuf;
- remain = sizeof (logbuf);
+ remain = sizeof (logbuf) - 1;
s = lua_tostring (L, 1);
c = s;
}
if (is_string) {
- lua_pushlstring (L, logbuf, sizeof (logbuf) - remain);
+ lua_pushlstring (L, logbuf, sizeof (logbuf) - remain - 1);
return 1;
}
else {