*/
void *rspamd_lua_check_udata (lua_State *L, gint pos, const gchar *classname);
+#define RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, pos, classname, type, dest) do { \
+ type **_maybe_ptr = (type **)rspamd_lua_check_udata((L), (pos), (classname)); \
+ if (_maybe_ptr == NULL) { \
+ return luaL_error (L, "%s: invalid arguments; pos = %d; expected = %s", G_STRFUNC, (pos), (classname)); \
+ } \
+ (dest) = *(_maybe_ptr); \
+} while(0)
+
/**
* Safely checks userdata to match specified class
* @param L
gint ret = luaL_error (L, "cannot encrypt data: %s", err->message);
g_error_free (err);
+ if (owned_pk) {
+ rspamd_pubkey_unref (pk);
+ }
+
return ret;
}
}
gint ret = luaL_error (L, "cannot encrypt data: %s", err->message);
g_error_free (err);
+ if (owned_pk) {
+ rspamd_pubkey_unref (pk);
+ }
+
return ret;
}
}
struct rspamd_cryptobox_keypair *kp = NULL;
struct rspamd_cryptobox_pubkey *pk = NULL;
const gchar *filename;
- gchar *data;
+ gchar *data = NULL;
guchar *out = NULL;
struct rspamd_lua_text *res;
gsize len = 0, outlen = 0;
err->message);
g_error_free (err);
munmap (data, len);
+ if (own_pk) {
+ rspamd_pubkey_unref (pk);
+ }
return ret;
}
g_error_free (err);
munmap (data, len);
+ if (own_pk) {
+ rspamd_pubkey_unref (pk);
+ }
+
return ret;
}
}
return 1;
err:
+ if (data) {
+ munmap (data, len);
+ }
if (own_pk) {
rspamd_pubkey_unref (pk);
}
static gint
lua_spf_record_dtor (lua_State *L)
{
- struct spf_resolved *record =
- * (struct spf_resolved **)rspamd_lua_check_udata (L, 1,
- SPF_RECORD_CLASS);
+ struct spf_resolved *record;
+
+ RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+ struct spf_resolved,
+ record);
if (record) {
spf_record_unref (record);
static gint
lua_spf_record_check_ip (lua_State *L)
{
- struct spf_resolved *record =
- * (struct spf_resolved **)rspamd_lua_check_udata (L, 1,
- SPF_RECORD_CLASS);
+ struct spf_resolved *record;
+ RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+ struct spf_resolved,
+ record);
struct rspamd_lua_ip *ip = NULL;
gint nres = 0;
gboolean need_free_ip = FALSE;
static gint
lua_spf_record_get_domain (lua_State *L)
{
- struct spf_resolved *record =
- *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
- SPF_RECORD_CLASS);
+ struct spf_resolved *record;
+ RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+ struct spf_resolved,
+ record);
if (record) {
lua_pushstring (L, record->domain);
static gint
lua_spf_record_get_ttl (lua_State *L)
{
- struct spf_resolved *record =
- *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
- SPF_RECORD_CLASS);
+ struct spf_resolved *record;
+ RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+ struct spf_resolved,
+ record);
if (record) {
lua_pushinteger (L, record->ttl);
static gint
lua_spf_record_get_timestamp (lua_State *L)
{
- struct spf_resolved *record =
- *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
- SPF_RECORD_CLASS);
+ struct spf_resolved *record;
+ RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+ struct spf_resolved,
+ record);
if (record) {
lua_pushnumber (L, record->timestamp);
static gint
lua_spf_record_get_digest (lua_State *L)
{
- struct spf_resolved *record =
- *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
- SPF_RECORD_CLASS);
+ struct spf_resolved *record;
+ RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+ struct spf_resolved,
+ record);
if (record) {
gchar hexbuf[64];
static gint
lua_spf_record_get_elts (lua_State *L)
{
- struct spf_resolved *record =
- *(struct spf_resolved **) rspamd_lua_check_udata (L, 1,
- SPF_RECORD_CLASS);
+ struct spf_resolved *record;
+ RSPAMD_LUA_CHECK_UDATA_PTR_OR_RETURN(L, 1, SPF_RECORD_CLASS,
+ struct spf_resolved,
+ record);
if (record) {
guint i;