at_count = at_count + 1
-- Adjust found position to be relative to start of url_text
local absolute_pos = search_from + found - 1
+ -- Defensive check: ensure position is within bounds (should always be true due to url_len check)
+ if absolute_pos > url_len then
+ return exports.REJECT -- Position overflow, should not happen
+ end
if at_count == 1 then
first_at_pos = absolute_pos
end
/* Forward declaration for Lua consultation */
static enum rspamd_url_lua_filter_result
-rspamd_url_lua_consult(rspamd_mempool_t *pool,
- const char *url_str,
+rspamd_url_lua_consult(const char *url_str,
gsize len,
unsigned int flags,
lua_State *L);
else if (p - c > max_email_user) {
/* Oversized user field - consult Lua filter (fixes #5731) */
enum rspamd_url_lua_filter_result lua_decision =
- rspamd_url_lua_consult(NULL, c, p - c, *flags, (lua_State *) lua_state);
+ rspamd_url_lua_consult(c, p - c, *flags, (lua_State *) lua_state);
if (lua_decision == RSPAMD_URL_LUA_FILTER_REJECT) {
/* REJECT: Lua says this is garbage, abort parsing */
/* Multiple @ signs detected - consult Lua */
enum rspamd_url_lua_filter_result lua_decision =
- rspamd_url_lua_consult(NULL, c, p - c, *flags, (lua_State *) lua_state);
+ rspamd_url_lua_consult(c, p - c, *flags, (lua_State *) lua_state);
if (lua_decision == RSPAMD_URL_LUA_FILTER_REJECT) {
/* REJECT: Too suspicious, abort */
/**
* Consult Lua filter when C parser encounters suspicious/ambiguous URL patterns
* This is called DURING parsing when C is unsure how to proceed
- * @param pool Memory pool
* @param url_str URL string fragment being examined
* @param len Length of the fragment
* @param flags Current URL parsing flags
* @return enum rspamd_url_lua_filter_result
*/
static enum rspamd_url_lua_filter_result
-rspamd_url_lua_consult(rspamd_mempool_t *pool,
- const char *url_str,
+rspamd_url_lua_consult(const char *url_str,
gsize len,
unsigned int flags,
lua_State *L)