]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix various issues found by PVS Studio
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 13 Mar 2019 15:01:18 +0000 (15:01 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 13 Mar 2019 15:01:55 +0000 (15:01 +0000)
https://www.viva64.com/

22 files changed:
PVS-Studio.cmake [new file with mode: 0644]
src/client/rspamc.c
src/fuzzy_storage.c
src/libmime/archives.c
src/libserver/dkim.c
src/libserver/milter.c
src/libserver/rspamd_symcache.c
src/libserver/task.c
src/libutil/http_connection.c
src/libutil/logger.c
src/libutil/map.c
src/libutil/mem_pool.c
src/libutil/multipattern.c
src/libutil/rrd.c
src/libutil/shingles.c
src/lua/lua_common.c
src/lua/lua_config.c
src/lua/lua_html.c
src/lua/lua_http.c
src/lua/lua_thread_pool.c
src/lua/lua_util.c
src/plugins/surbl.c

diff --git a/PVS-Studio.cmake b/PVS-Studio.cmake
new file mode 100644 (file)
index 0000000..6001f33
--- /dev/null
@@ -0,0 +1,547 @@
+# 2006-2008 (c) Viva64.com Team
+# 2008-2018 (c) OOO "Program Verification Systems"
+#
+# Version 12
+# Apache 2.0 license
+
+cmake_minimum_required(VERSION 2.8.12)
+cmake_policy(SET CMP0054 NEW)
+
+if (PVS_STUDIO_AS_SCRIPT)
+    # This code runs at build time.
+    # It executes pvs-studio-analyzer and propagates its return value.
+
+    set(in_cl_params FALSE)
+    set(additional_args)
+
+    foreach (arg ${PVS_STUDIO_COMMAND})
+        if (NOT in_cl_params)
+            if ("${arg}" STREQUAL "--cl-params")
+                set(in_cl_params TRUE)
+            endif ()
+        else ()
+            # A workaround for macOS frameworks (e.g. QtWidgets.framework)
+            # You can test this workaround on this project: https://github.com/easyaspi314/MidiEditor/tree/gba
+            if (APPLE AND "${arg}" MATCHES "^-I(.*)\\.framework$")
+                STRING(REGEX REPLACE "^-I(.*)\\.framework$" "\\1.framework" framework "${arg}")
+                if (IS_ABSOLUTE "${framework}")
+                    get_filename_component(framework "${framework}" DIRECTORY)
+                    list(APPEND additional_args "-iframework")
+                    list(APPEND additional_args "${framework}")
+                endif ()
+            endif ()
+        endif ()
+    endforeach ()
+
+    execute_process(COMMAND ${PVS_STUDIO_COMMAND} ${additional_args}
+            ERROR_VARIABLE error
+            RESULT_VARIABLE result)
+
+    set(stderr_type "")
+
+    if (result)
+        set(stderr_type FATAL_ERROR)
+    endif ()
+
+    if (result OR error)
+        message(${stderr_type} "${error}")
+    endif ()
+
+    return()
+endif ()
+
+if(__PVS_STUDIO_INCLUDED)
+    return()
+endif()
+set(__PVS_STUDIO_INCLUDED TRUE)
+
+set(PVS_STUDIO_SCRIPT "${CMAKE_CURRENT_LIST_FILE}")
+
+function (pvs_studio_log TEXT)
+    if (PVS_STUDIO_DEBUG)
+        message("PVS-Studio: ${TEXT}")
+    endif ()
+endfunction ()
+
+function (pvs_studio_relative_path VAR ROOT FILEPATH)
+    set("${VAR}" "${FILEPATH}" PARENT_SCOPE)
+    if ("${FILEPATH}" MATCHES "^/.*$" OR "${FILEPATH}" MATCHES "^.:/.*$")
+        file(RELATIVE_PATH RPATH "${ROOT}" "${FILEPATH}")
+        if (NOT "${RPATH}" MATCHES "^\\.\\..*$")
+            set("${VAR}" "${RPATH}" PARENT_SCOPE)
+        endif ()
+    endif ()
+endfunction ()
+
+function (pvs_studio_join_path VAR DIR1 DIR2)
+    if ("${DIR2}" MATCHES "^(/|~|.:/).*$" OR "${DIR1}" STREQUAL "")
+        set("${VAR}" "${DIR2}" PARENT_SCOPE)
+    else ()
+        set("${VAR}" "${DIR1}/${DIR2}" PARENT_SCOPE)
+    endif ()
+endfunction ()
+
+macro (pvs_studio_append_flags_from_property CXX C DIR PREFIX)
+    if (NOT "${PROPERTY}" STREQUAL "NOTFOUND" AND NOT "${PROPERTY}" STREQUAL "PROPERTY-NOTFOUND")
+        foreach (PROP ${PROPERTY})
+            pvs_studio_join_path(PROP "${DIR}" "${PROP}")
+
+            if (APPLE AND "${PREFIX}" STREQUAL "-I" AND IS_ABSOLUTE "${PROP}" AND "${PROP}" MATCHES "\\.framework$")
+                get_filename_component(FRAMEWORK "${PROP}" DIRECTORY)
+                list(APPEND "${CXX}" "-iframework")
+                list(APPEND "${CXX}" "${FRAMEWORK}")
+                list(APPEND "${C}" "-iframework")
+                list(APPEND "${C}" "${FRAMEWORK}")
+                pvs_studio_log("framework: ${FRAMEWORK}")
+            elseif (NOT "${PROP}" STREQUAL "")
+                list(APPEND "${CXX}" "${PREFIX}${PROP}")
+                list(APPEND "${C}" "${PREFIX}${PROP}")
+            endif()
+        endforeach ()
+    endif ()
+endmacro ()
+
+macro (pvs_studio_append_standard_flag FLAGS STANDARD)
+    if ("${STANDARD}" MATCHES "^(99|11|14|17)$")
+        if ("${PVS_STUDIO_PREPROCESSOR}" MATCHES "gcc|clang")
+            list(APPEND "${FLAGS}" "-std=c++${STANDARD}")
+        endif ()
+    endif ()
+endmacro ()
+
+function (pvs_studio_set_directory_flags DIRECTORY CXX C)
+    set(CXX_FLAGS "${${CXX}}")
+    set(C_FLAGS "${${C}}")
+
+    get_directory_property(PROPERTY DIRECTORY "${DIRECTORY}" INCLUDE_DIRECTORIES)
+    pvs_studio_append_flags_from_property(CXX_FLAGS C_FLAGS "${DIRECTORY}" "-I")
+
+    get_directory_property(PROPERTY DIRECTORY "${DIRECTORY}" COMPILE_DEFINITIONS)
+    pvs_studio_append_flags_from_property(CXX_FLAGS C_FLAGS "" "-D")
+
+    set("${CXX}" "${CXX_FLAGS}" PARENT_SCOPE)
+    set("${C}" "${C_FLAGS}" PARENT_SCOPE)
+endfunction ()
+
+function (pvs_studio_set_target_flags TARGET CXX C)
+    set(CXX_FLAGS "${${CXX}}")
+    set(C_FLAGS "${${C}}")
+
+    set(prop_incdirs "$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>")
+    list(APPEND CXX_FLAGS "$<$<BOOL:${prop_incdirs}>:-I$<JOIN:${prop_incdirs},$<SEMICOLON>-I>>")
+    list(APPEND C_FLAGS "$<$<BOOL:${prop_incdirs}>:-I$<JOIN:${prop_incdirs},$<SEMICOLON>-I>>")
+
+    set(prop_compdefs "$<TARGET_PROPERTY:${TARGET},COMPILE_DEFINITIONS>")
+    list(APPEND CXX_FLAGS "$<$<BOOL:${prop_compdefs}>:-D$<JOIN:${prop_compdefs},$<SEMICOLON>-D>>")
+    list(APPEND C_FLAGS "$<$<BOOL:${prop_compdefs}>:-D$<JOIN:${prop_compdefs},$<SEMICOLON>-D>>")
+
+    set("${CXX}" "${CXX_FLAGS}" PARENT_SCOPE)
+    set("${C}" "${C_FLAGS}" PARENT_SCOPE)
+endfunction ()
+
+function (pvs_studio_set_source_file_flags SOURCE)
+    set(LANGUAGE "")
+
+    string(TOLOWER "${SOURCE}" SOURCE_LOWER)
+    if ("${LANGUAGE}" STREQUAL "" AND "${SOURCE_LOWER}" MATCHES "^.*\\.(c|cpp|cc|cx|cxx|cp|c\\+\\+)$")
+        if ("${SOURCE}" MATCHES "^.*\\.c$")
+            set(LANGUAGE C)
+        else ()
+            set(LANGUAGE CXX)
+        endif ()
+    endif ()
+
+    if ("${LANGUAGE}" STREQUAL "C")
+        set(CL_PARAMS ${PVS_STUDIO_C_FLAGS} ${PVS_STUDIO_TARGET_C_FLAGS} -DPVS_STUDIO)
+    elseif ("${LANGUAGE}" STREQUAL "CXX")
+        set(CL_PARAMS ${PVS_STUDIO_CXX_FLAGS} ${PVS_STUDIO_TARGET_CXX_FLAGS} -DPVS_STUDIO)
+    endif ()
+
+    set(PVS_STUDIO_LANGUAGE "${LANGUAGE}" PARENT_SCOPE)
+    set(PVS_STUDIO_CL_PARAMS "${CL_PARAMS}" PARENT_SCOPE)
+endfunction ()
+
+function (pvs_studio_analyze_file SOURCE SOURCE_DIR BINARY_DIR)
+    set(PLOGS ${PVS_STUDIO_PLOGS})
+    pvs_studio_set_source_file_flags("${SOURCE}")
+
+    get_filename_component(SOURCE "${SOURCE}" REALPATH)
+
+    get_source_file_property(PROPERTY "${SOURCE}" HEADER_FILE_ONLY)
+    if (PROPERTY)
+        return()
+    endif ()
+
+    pvs_studio_relative_path(SOURCE_RELATIVE "${SOURCE_DIR}" "${SOURCE}")
+    pvs_studio_join_path(SOURCE "${SOURCE_DIR}" "${SOURCE}")
+
+    set(LOG "${BINARY_DIR}/PVS-Studio/${SOURCE_RELATIVE}.plog")
+    get_filename_component(LOG "${LOG}" REALPATH)
+    get_filename_component(PARENT_DIR "${LOG}" DIRECTORY)
+
+    if (EXISTS "${SOURCE}" AND NOT TARGET "${LOG}" AND NOT "${PVS_STUDIO_LANGUAGE}" STREQUAL "")
+        # A workaround to support implicit dependencies for ninja generators.
+        set(depPvsArg)
+        set(depCommandArg)
+        if (CMAKE_VERSION VERSION_GREATER 3.6 AND "${CMAKE_GENERATOR}" STREQUAL "Ninja")
+            pvs_studio_relative_path(relLog "${CMAKE_BINARY_DIR}" "${LOG}")
+            set(depPvsArg --dep-file "${LOG}.d" --dep-file-target "${relLog}")
+            set(depCommandArg DEPFILE "${LOG}.d")
+        endif ()
+
+        # https://public.kitware.com/Bug/print_bug_page.php?bug_id=14353
+        # https://public.kitware.com/Bug/file/5436/expand_command.cmake
+        #
+        # It is a workaround to expand generator expressions.
+        set(cmdline "${PVS_STUDIO_BIN}" analyze
+                --output-file "${LOG}"
+                --source-file "${SOURCE}"
+                ${depPvsArg}
+                ${PVS_STUDIO_ARGS}
+                --cl-params "${PVS_STUDIO_CL_PARAMS}" "${SOURCE}")
+
+        string(REPLACE ";" "$<SEMICOLON>" cmdline "${cmdline}")
+        set(pvscmd "${CMAKE_COMMAND}"
+                -D PVS_STUDIO_AS_SCRIPT=TRUE
+                -D "PVS_STUDIO_COMMAND=${cmdline}"
+                -P "${PVS_STUDIO_SCRIPT}"
+                )
+
+        add_custom_command(OUTPUT "${LOG}"
+                COMMAND "${CMAKE_COMMAND}" -E make_directory "${PARENT_DIR}"
+                COMMAND "${CMAKE_COMMAND}" -E remove_directory "${LOG}"
+                COMMAND ${pvscmd}
+                WORKING_DIRECTORY "${BINARY_DIR}"
+                DEPENDS "${SOURCE}" "${PVS_STUDIO_CONFIG}"
+                IMPLICIT_DEPENDS "${PVS_STUDIO_LANGUAGE}" "${SOURCE}"
+                ${depCommandArg}
+                VERBATIM
+                COMMENT "Analyzing ${PVS_STUDIO_LANGUAGE} file ${SOURCE_RELATIVE}")
+        list(APPEND PLOGS "${LOG}")
+    endif ()
+    set(PVS_STUDIO_PLOGS "${PLOGS}" PARENT_SCOPE)
+endfunction ()
+
+function (pvs_studio_analyze_target TARGET DIR)
+    set(PVS_STUDIO_PLOGS "${PVS_STUDIO_PLOGS}")
+    set(PVS_STUDIO_TARGET_CXX_FLAGS "")
+    set(PVS_STUDIO_TARGET_C_FLAGS "")
+
+    get_target_property(PROPERTY "${TARGET}" SOURCES)
+    pvs_studio_relative_path(BINARY_DIR "${CMAKE_SOURCE_DIR}" "${DIR}")
+    if ("${BINARY_DIR}" MATCHES "^/.*$")
+        pvs_studio_join_path(BINARY_DIR "${CMAKE_BINARY_DIR}" "PVS-Studio/__${BINARY_DIR}")
+    else ()
+        pvs_studio_join_path(BINARY_DIR "${CMAKE_BINARY_DIR}" "${BINARY_DIR}")
+    endif ()
+
+    file(MAKE_DIRECTORY "${BINARY_DIR}")
+
+    pvs_studio_set_directory_flags("${DIR}" PVS_STUDIO_TARGET_CXX_FLAGS PVS_STUDIO_TARGET_C_FLAGS)
+    pvs_studio_set_target_flags("${TARGET}" PVS_STUDIO_TARGET_CXX_FLAGS PVS_STUDIO_TARGET_C_FLAGS)
+
+    if (NOT "${PROPERTY}" STREQUAL "NOTFOUND" AND NOT "${PROPERTY}" STREQUAL "PROPERTY-NOTFOUND")
+        foreach (SOURCE ${PROPERTY})
+            pvs_studio_join_path(SOURCE "${DIR}" "${SOURCE}")
+            pvs_studio_analyze_file("${SOURCE}" "${DIR}" "${BINARY_DIR}")
+        endforeach ()
+    endif ()
+
+    set(PVS_STUDIO_PLOGS "${PVS_STUDIO_PLOGS}" PARENT_SCOPE)
+endfunction ()
+
+set(PVS_STUDIO_RECURSIVE_TARGETS)
+set(PVS_STUDIO_RECURSIVE_TARGETS_NEW)
+
+macro(pvs_studio_get_recursive_targets TARGET)
+    get_target_property(libs "${TARGET}" LINK_LIBRARIES)
+    foreach (lib IN LISTS libs)
+        list(FIND PVS_STUDIO_RECURSIVE_TARGETS "${lib}" index)
+        if (TARGET "${lib}" AND "${index}" STREQUAL -1)
+            get_target_property(target_type "${lib}" TYPE)
+            if (NOT "${target_type}" STREQUAL "INTERFACE_LIBRARY")
+                list(APPEND PVS_STUDIO_RECURSIVE_TARGETS "${lib}")
+                list(APPEND PVS_STUDIO_RECURSIVE_TARGETS_NEW "${lib}")
+                pvs_studio_get_recursive_targets("${lib}")
+            endif ()
+        endif ()
+    endforeach ()
+endmacro()
+
+option(PVS_STUDIO_DISABLE OFF "Disable PVS-Studio targets")
+option(PVS_STUDIO_DEBUG OFF "Add debug info")
+
+# pvs_studio_add_target
+# Target options:
+# ALL                           add PVS-Studio target to default build (default: off)
+# TARGET target                 name of analysis target (default: pvs)
+# ANALYZE targets...            targets to analyze
+# RECURSIVE                     analyze target's dependencies (requires CMake 3.5+)
+# COMPILE_COMMANDS              use compile_commands.json instead of targets (specified by the 'ANALYZE' option) to determine files for analysis
+#                               (set CMAKE_EXPORT_COMPILE_COMMANDS, available only for Makefile and Ninja generators)
+#
+# Output options:
+# OUTPUT                        prints report to stdout
+# LOG path                      path to report (default: ${CMAKE_CURRENT_BINARY_DIR}/PVS-Studio.log)
+# FORMAT format                 format of report
+# MODE mode                     analyzers/levels filter (default: GA:1,2)
+# HIDE_HELP                     do not print help message
+#
+# Analyzer options:
+# PLATFORM name                 linux32/linux64 (default: linux64)
+# PREPROCESSOR name             preprocessor type: gcc/clang (default: auto detected)
+# LICENSE path                  path to PVS-Studio.lic (default: ~/.config/PVS-Studio/PVS-Studio.lic)
+# CONFIG path                   path to PVS-Studio.cfg
+# CFG_TEXT text                 embedded PVS-Studio.cfg
+# KEEP_COMBINED_PLOG            do not delete combined plog file *.pvs.raw for further processing with plog-converter
+#
+# Misc options:
+# DEPENDS targets..             additional target dependencies
+# SOURCES path...               list of source files to analyze
+# BIN path                      path to pvs-studio-analyzer (Unix) or CompilerCommandsAnalyzer.exe (Windows)
+# CONVERTER path                path to plog-converter (Unix) or HtmlGenerator.exe (Windows)
+# C_FLAGS flags...              additional C_FLAGS
+# CXX_FLAGS flags...            additional CXX_FLAGS
+# ARGS args...                  additional pvs-studio-analyzer/CompilerCommandsAnalyzer.exe flags
+function (pvs_studio_add_target)
+    macro (default VAR VALUE)
+        if ("${${VAR}}" STREQUAL "")
+            set("${VAR}" "${VALUE}")
+        endif ()
+    endmacro ()
+
+    set(PVS_STUDIO_SUPPORTED_PREPROCESSORS "gcc|clang|visualcpp")
+    if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
+        set(DEFAULT_PREPROCESSOR "clang")
+    elseif (MSVC)
+        set(DEFAULT_PREPROCESSOR "visualcpp")
+    else ()
+        set(DEFAULT_PREPROCESSOR "gcc")
+    endif ()
+
+    set(OPTIONAL OUTPUT ALL RECURSIVE HIDE_HELP KEEP_COMBINED_PLOG COMPILE_COMMANDS)
+    set(SINGLE LICENSE CONFIG TARGET LOG FORMAT BIN CONVERTER PLATFORM PREPROCESSOR CFG_TEXT)
+    set(MULTI SOURCES C_FLAGS CXX_FLAGS ARGS DEPENDS ANALYZE MODE)
+    cmake_parse_arguments(PVS_STUDIO "${OPTIONAL}" "${SINGLE}" "${MULTI}" ${ARGN})
+
+    if ("${PVS_STUDIO_CONFIG}" STREQUAL "" OR NOT "${PVS_STUDIO_CFG_TEXT}" STREQUAL "")
+        set(PVS_STUDIO_EMPTY_CONFIG ON)
+    else ()
+        set(PVS_STUDIO_EMPTY_CONFIG OFF)
+    endif ()
+
+    default(PVS_STUDIO_CFG_TEXT "analysis-mode=31")
+    default(PVS_STUDIO_CONFIG "${CMAKE_BINARY_DIR}/PVS-Studio.cfg")
+    default(PVS_STUDIO_C_FLAGS "")
+    default(PVS_STUDIO_CXX_FLAGS "")
+    default(PVS_STUDIO_TARGET "pvs")
+    default(PVS_STUDIO_LOG "PVS-Studio.log")
+
+    set(PATHS)
+    if (WIN32)
+        set(ROOT "PROGRAMFILES(X86)")
+        set(ROOT "$ENV{${ROOT}}/PVS-Studio")
+        string(REPLACE \\ / ROOT "${ROOT}")
+
+        if (EXISTS "${ROOT}")
+            set(PATHS "${ROOT}")
+        endif ()
+
+        default(PVS_STUDIO_BIN "CompilerCommandsAnalyzer.exe")
+        default(PVS_STUDIO_CONVERTER "HtmlGenerator.exe")
+    else ()
+        default(PVS_STUDIO_BIN "pvs-studio-analyzer")
+        default(PVS_STUDIO_CONVERTER "plog-converter")
+    endif ()
+
+    find_program(PVS_STUDIO_BIN_PATH "${PVS_STUDIO_BIN}" ${PATHS})
+    set(PVS_STUDIO_BIN "${PVS_STUDIO_BIN_PATH}")
+
+    if (NOT EXISTS "${PVS_STUDIO_BIN}")
+        message(FATAL_ERROR "pvs-studio-analyzer is not found")
+    endif ()
+
+    find_program(PVS_STUDIO_CONVERTER_PATH "${PVS_STUDIO_CONVERTER}" ${PATHS})
+    set(PVS_STUDIO_CONVERTER "${PVS_STUDIO_CONVERTER_PATH}")
+
+    if (NOT EXISTS "${PVS_STUDIO_CONVERTER}")
+        message(FATAL_ERROR "plog-converter is not found")
+    endif ()
+
+    default(PVS_STUDIO_MODE "GA:1,2")
+    default(PVS_STUDIO_PREPROCESSOR "${DEFAULT_PREPROCESSOR}")
+    if (WIN32)
+        default(PVS_STUDIO_PLATFORM "x64")
+    else ()
+        default(PVS_STUDIO_PLATFORM "linux64")
+    endif ()
+
+    string(REPLACE ";" "+" PVS_STUDIO_MODE "${PVS_STUDIO_MODE}")
+
+    if (PVS_STUDIO_EMPTY_CONFIG)
+        set(PVS_STUDIO_CONFIG_COMMAND "${CMAKE_COMMAND}" -E echo "${PVS_STUDIO_CFG_TEXT}" > "${PVS_STUDIO_CONFIG}")
+    else ()
+        set(PVS_STUDIO_CONFIG_COMMAND "${CMAKE_COMMAND}" -E touch "${PVS_STUDIO_CONFIG}")
+    endif ()
+
+    add_custom_command(OUTPUT "${PVS_STUDIO_CONFIG}"
+            COMMAND ${PVS_STUDIO_CONFIG_COMMAND}
+            WORKING_DIRECTORY "${BINARY_DIR}"
+            COMMENT "Generating PVS-Studio.cfg")
+
+    if (NOT "${PVS_STUDIO_PREPROCESSOR}" MATCHES "^${PVS_STUDIO_SUPPORTED_PREPROCESSORS}$")
+        message(FATAL_ERROR "Preprocessor ${PVS_STUDIO_PREPROCESSOR} isn't supported. Available options: ${PVS_STUDIO_SUPPORTED_PREPROCESSORS}.")
+    endif ()
+
+    pvs_studio_append_standard_flag(PVS_STUDIO_CXX_FLAGS "${CMAKE_CXX_STANDARD}")
+    pvs_studio_set_directory_flags("${CMAKE_CURRENT_SOURCE_DIR}" PVS_STUDIO_CXX_FLAGS PVS_STUDIO_C_FLAGS)
+
+    if (NOT "${PVS_STUDIO_LICENSE}" STREQUAL "")
+        pvs_studio_join_path(PVS_STUDIO_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}" "${PVS_STUDIO_LICENSE}")
+        list(APPEND PVS_STUDIO_ARGS --lic-file "${PVS_STUDIO_LICENSE}")
+    endif ()
+
+    list(APPEND PVS_STUDIO_ARGS --cfg "${PVS_STUDIO_CONFIG}"
+            --platform "${PVS_STUDIO_PLATFORM}"
+            --preprocessor "${PVS_STUDIO_PREPROCESSOR}")
+
+    if (NOT "${CMAKE_CXX_COMPILER}" STREQUAL "")
+        list(APPEND PVS_STUDIO_ARGS --cxx "${CMAKE_CXX_COMPILER}")
+    endif ()
+
+    if (NOT "${CMAKE_C_COMPILER}" STREQUAL "")
+        list(APPEND PVS_STUDIO_ARGS --cc "${CMAKE_C_COMPILER}")
+    endif ()
+
+    set(PVS_STUDIO_PLOGS "")
+
+    set(PVS_STUDIO_RECURSIVE_TARGETS_NEW)
+    if (${PVS_STUDIO_RECURSIVE})
+        foreach (TARGET IN LISTS PVS_STUDIO_ANALYZE)
+            list(APPEND PVS_STUDIO_RECURSIVE_TARGETS_NEW "${TARGET}")
+            pvs_studio_get_recursive_targets("${TARGET}")
+        endforeach ()
+    endif ()
+
+    set(inc_path)
+
+    foreach (TARGET ${PVS_STUDIO_ANALYZE})
+        set(DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+        string(FIND "${TARGET}" ":" DELIM)
+        if ("${DELIM}" GREATER "-1")
+            math(EXPR DELIMI "${DELIM}+1")
+            string(SUBSTRING "${TARGET}" "${DELIMI}" "-1" DIR)
+            string(SUBSTRING "${TARGET}" "0" "${DELIM}" TARGET)
+            pvs_studio_join_path(DIR "${CMAKE_CURRENT_SOURCE_DIR}" "${DIR}")
+        else ()
+            get_target_property(TARGET_SOURCE_DIR "${TARGET}" SOURCE_DIR)
+            if (EXISTS "${TARGET_SOURCE_DIR}")
+                set(DIR "${TARGET_SOURCE_DIR}")
+            endif ()
+        endif ()
+        pvs_studio_analyze_target("${TARGET}" "${DIR}")
+        list(APPEND PVS_STUDIO_DEPENDS "${TARGET}")
+
+        if ("${inc_path}" STREQUAL "")
+            set(inc_path "$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>")
+        else ()
+            set(inc_path "${inc_path}$<SEMICOLON>$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>")
+        endif ()
+    endforeach ()
+
+    foreach (TARGET ${PVS_STUDIO_RECURSIVE_TARGETS_NEW})
+        set(DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+        get_target_property(TARGET_SOURCE_DIR "${TARGET}" SOURCE_DIR)
+        if (EXISTS "${TARGET_SOURCE_DIR}")
+            set(DIR "${TARGET_SOURCE_DIR}")
+        endif ()
+        pvs_studio_analyze_target("${TARGET}" "${DIR}")
+        list(APPEND PVS_STUDIO_DEPENDS "${TARGET}")
+    endforeach ()
+
+    set(PVS_STUDIO_TARGET_CXX_FLAGS "")
+    set(PVS_STUDIO_TARGET_C_FLAGS "")
+    foreach (SOURCE ${PVS_STUDIO_SOURCES})
+        pvs_studio_analyze_file("${SOURCE}" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
+    endforeach ()
+
+    if (PVS_STUDIO_COMPILE_COMMANDS)
+        set(COMPILE_COMMANDS_LOG "${PVS_STUDIO_LOG}.pvs.analyzer.raw")
+        if (NOT CMAKE_EXPORT_COMPILE_COMMANDS)
+            message(FATAL_ERROR "You should set CMAKE_EXPORT_COMPILE_COMMANDS to TRUE")
+        endif ()
+        add_custom_command(
+                OUTPUT "${COMPILE_COMMANDS_LOG}"
+                COMMAND "${PVS_STUDIO_BIN}" analyze -i
+                --output-file "${COMPILE_COMMANDS_LOG}.always"
+                ${PVS_STUDIO_ARGS}
+                COMMENT "Analyzing with PVS-Studio"
+                WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
+                DEPENDS "${PVS_STUDIO_CONFIG}"
+        )
+        list(APPEND PVS_STUDIO_PLOGS_LOGS "${COMPILE_COMMANDS_LOG}.always")
+        list(APPEND PVS_STUDIO_PLOGS_DEPENDENCIES "${COMPILE_COMMANDS_LOG}")
+    endif ()
+
+    pvs_studio_relative_path(LOG_RELATIVE "${CMAKE_BINARY_DIR}" "${PVS_STUDIO_LOG}")
+    if (PVS_STUDIO_PLOGS OR PVS_STUDIO_COMPILE_COMMANDS)
+        if (WIN32)
+            string(REPLACE / \\ PVS_STUDIO_PLOGS "${PVS_STUDIO_PLOGS}")
+        endif ()
+        if (WIN32)
+            set(COMMANDS COMMAND type ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_LOGS} > "${PVS_STUDIO_LOG}" 2>nul)
+        else ()
+            set(COMMANDS COMMAND cat ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_LOGS} > "${PVS_STUDIO_LOG}")
+        endif ()
+        set(COMMENT "Generating ${LOG_RELATIVE}")
+        if (NOT "${PVS_STUDIO_FORMAT}" STREQUAL "" OR PVS_STUDIO_OUTPUT)
+            if ("${PVS_STUDIO_FORMAT}" STREQUAL "")
+                set(PVS_STUDIO_FORMAT "errorfile")
+            endif ()
+            list(APPEND COMMANDS
+                    COMMAND "${CMAKE_COMMAND}" -E remove -f "${PVS_STUDIO_LOG}.pvs.raw"
+                    COMMAND "${CMAKE_COMMAND}" -E rename "${PVS_STUDIO_LOG}" "${PVS_STUDIO_LOG}.pvs.raw"
+                    COMMAND "${PVS_STUDIO_CONVERTER}" -t "${PVS_STUDIO_FORMAT}" "${PVS_STUDIO_LOG}.pvs.raw" -o "${PVS_STUDIO_LOG}" -a "${PVS_STUDIO_MODE}"
+                    )
+            if(NOT PVS_STUDIO_KEEP_COMBINED_PLOG)
+                list(APPEND COMMANDS COMMAND "${CMAKE_COMMAND}" -E remove -f "${PVS_STUDIO_LOG}.pvs.raw")
+            endif()
+        endif ()
+    else ()
+        set(COMMANDS COMMAND "${CMAKE_COMMAND}" -E touch "${PVS_STUDIO_LOG}")
+        set(COMMENT "Generating ${LOG_RELATIVE}: no sources found")
+    endif ()
+
+    if (WIN32)
+        string(REPLACE / \\ PVS_STUDIO_LOG "${PVS_STUDIO_LOG}")
+    endif ()
+
+    add_custom_command(OUTPUT "${PVS_STUDIO_LOG}"
+            ${COMMANDS}
+            COMMENT "${COMMENT}"
+            DEPENDS ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_DEPENDENCIES}
+            WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
+
+    if (PVS_STUDIO_ALL)
+        set(ALL "ALL")
+    else ()
+        set(ALL "")
+    endif ()
+
+    if (PVS_STUDIO_OUTPUT)
+        if (PVS_STUDIO_HIDE_HELP AND NOT WIN32)
+            set(COMMANDS COMMAND grep -v " error: Help:" ${PVS_STUDIO_LOG} 1>&2 || exit 0)
+        elseif (WIN32)
+            set(COMMANDS COMMAND type "${PVS_STUDIO_LOG}" 1>&2)
+        else ()
+            set(COMMANDS COMMAND cat "${PVS_STUDIO_LOG}" 1>&2)
+        endif()
+    else ()
+        set(COMMANDS "")
+    endif ()
+
+    add_custom_target("${PVS_STUDIO_TARGET}" ${ALL} ${COMMANDS} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" DEPENDS ${PVS_STUDIO_DEPENDS} "${PVS_STUDIO_LOG}")
+
+    # A workaround to add implicit dependencies of source files from include directories
+    set_target_properties("${PVS_STUDIO_TARGET}" PROPERTIES INCLUDE_DIRECTORIES "${inc_path}")
+endfunction ()
\ No newline at end of file
index 0568692b4906b168e57ba7221a724d5173a9f04c..927097e18dc768b47b76fd4d520ef34b2906ea36 100644 (file)
@@ -680,15 +680,15 @@ add_options (GQueue *opts)
 
                if (kv == NULL || kv[1] == NULL) {
                        ADD_CLIENT_HEADER (opts, *hdr, "");
-
-                       if (kv) {
-                               g_strfreev (kv);
-                       }
                }
                else {
                        ADD_CLIENT_HEADER (opts, kv[0], kv[1]);
                }
 
+               if (kv) {
+                       g_strfreev (kv);
+               }
+
                hdr ++;
        }
 }
@@ -1006,9 +1006,9 @@ rspamc_counters_sort (const ucl_object_t **o1, const ucl_object_t **o2)
                                        order2 = ucl_object_toint (elt2);
                                }
                        }
-
-                       g_strfreev (args);
                }
+
+               g_strfreev (args);
        }
 
        return (inverse ? (order2 - order1) : (order1 - order2));
@@ -2008,7 +2008,7 @@ main (gint argc, gchar **argv, gchar **env)
        g_queue_free_full (kwattrs, g_free);
 
        /* Wait for children processes */
-       cur = g_list_first (children);
+       cur = children ? g_list_first (children) : NULL;
        ret = 0;
 
        while (cur) {
index 7fdce82ae704844d8cf3a7fc62ed46c3cf86cc88..2054633ade426b3d84152217b14e337e8fd6dbc1 100644 (file)
@@ -599,6 +599,7 @@ rspamd_fuzzy_send_update_mirror (struct rspamd_fuzzy_storage_ctx *ctx,
        conn->mirror = m;
 
        if (conn->up == NULL) {
+               g_free (conn);
                msg_err ("cannot select upstream for %s", m->name);
                return;
        }
@@ -608,6 +609,7 @@ rspamd_fuzzy_send_update_mirror (struct rspamd_fuzzy_storage_ctx *ctx,
                        SOCK_STREAM, TRUE);
 
        if (conn->sock == -1) {
+               g_free (conn);
                msg_err ("cannot connect upstream for %s", m->name);
                rspamd_upstream_fail (conn->up, TRUE);
                return;
index f546570a99db91fef41d07e3b4fcee165285933f..b846707618d2dcc36f2defe734177cbe6956109c 100644 (file)
@@ -1146,12 +1146,14 @@ rspamd_7zip_read_coders_info (struct rspamd_task *task,
                                        return NULL;
                                }
 
-                               folder_nstreams = g_alloca (sizeof (int) * num_folders);
+                               folder_nstreams = g_malloc (sizeof (int) * num_folders);
 
                                for (i = 0; i < num_folders && p != NULL && p < end; i++) {
                                        p = rspamd_7zip_read_folder (task, p, end, arch,
                                                        &folder_nstreams[i], &num_digests);
                                }
+
+                               g_free (folder_nstreams);
                        }
                        break;
                case kCodersUnPackSize:
@@ -1499,6 +1501,7 @@ rspamd_7zip_read_files_info (struct rspamd_task *task,
                                        if (fend == NULL || fend - p == 0) {
                                                /* Crap instead of fname */
                                                msg_debug_archive ("bad 7zip name; %s", G_STRLOC);
+                                               goto end;
                                        }
 
                                        res = rspamd_7zip_ucs2_to_utf8 (task, p, fend);
index 9692d1b932f1b7a686baa25e708c7db684bb9c20..8100f8ee3d9a60fa101f965188e482a53a3a4a88 100644 (file)
@@ -2664,6 +2664,7 @@ rspamd_dkim_sign_key_load (const gchar *key, gsize len,
                if (stat (key, &st) != 0) {
                        g_set_error (err, dkim_error_quark (), DKIM_SIGERROR_KEYFAIL,
                                        "cannot stat key file: '%s' %s", key, strerror (errno));
+                       g_free (nkey);
 
                        return NULL;
                }
@@ -2674,6 +2675,7 @@ rspamd_dkim_sign_key_load (const gchar *key, gsize len,
                if (map == NULL) {
                        g_set_error (err, dkim_error_quark (), DKIM_SIGERROR_KEYFAIL,
                                        "cannot map key file: '%s' %s", key, strerror (errno));
+                       g_free (nkey);
 
                        return NULL;
                }
index 236a4bf750a05195339ad60491b67ae5d0d16b2c..fcdbcae6c0779448288fb0f1daf7601a0386cec2 100644 (file)
@@ -1301,7 +1301,7 @@ rspamd_milter_del_header (struct rspamd_milter_session *session,
        value.len = 0;
 
        return rspamd_milter_send_action (session, RSPAMD_MILTER_CHGHEADER,
-                       idx, name, value);
+                       idx, name, &value);
 }
 
 void
@@ -1935,7 +1935,7 @@ rspamd_milter_send_task_results (struct rspamd_milter_session *session,
                                }
                        }
 
-                       rspamd_milter_set_reply (session, rcode, xcode, reply);
+                       rspamd_milter_set_reply (session, xcode, rcode, reply);
                }
                break;
        case METRIC_ACTION_SOFT_REJECT:
@@ -1949,7 +1949,7 @@ rspamd_milter_send_task_results (struct rspamd_milter_session *session,
                                        sizeof (RSPAMD_MILTER_TEMPFAIL_MESSAGE) - 1);
                }
 
-               rspamd_milter_set_reply (session, rcode, xcode, reply);
+               rspamd_milter_set_reply (session, xcode, rcode, reply);
                break;
 
        case METRIC_ACTION_REWRITE_SUBJECT:
index 3cfb15408128d0dd2d6c1906baf784e701ecdfb5..64e451f7a0882265a31ba3072b3d4c2ffd860ae0 100644 (file)
@@ -1580,7 +1580,6 @@ rspamd_symcache_make_checkpoint (struct rspamd_task *task,
        checkpoint->pass = RSPAMD_CACHE_PASS_INIT;
        task->checkpoint = checkpoint;
 
-       task->result = task->result;
 
        return checkpoint;
 }
index 30bccb81b2f61e74b5282ba20eaedffcb1abb17d..c4e69c9742f627719cd5197b3178460c49d18fdd 100644 (file)
@@ -1231,7 +1231,7 @@ rspamd_task_write_ialist (struct rspamd_task *task,
        struct rspamd_email_address *addr;
        gint i, nchars = 0, cur_chars;
 
-       if (lim <= 0) {
+       if (addrs && lim <= 0) {
                lim = addrs->len;
        }
 
index dc3bfa9c093a3ae2258826a7ae4d5234319a0fed..42b934d2a338a529250d421b04d1e7a4b3872fca 100644 (file)
@@ -722,10 +722,15 @@ rspamd_http_simple_client_helper (struct rspamd_http_connection *conn)
        priv = conn->priv;
        ssl = priv->ssl;
        priv->ssl = NULL;
-       request_method = priv->msg->method;
-       /* Preserve host for keepalive */
-       prev_host = priv->msg->host;
-       priv->msg->host = NULL;
+
+       /* Preserve data */
+       if (priv->msg) {
+               request_method = priv->msg->method;
+               /* Preserve host for keepalive */
+               prev_host = priv->msg->host;
+               priv->msg->host = NULL;
+       }
+
        rspamd_http_connection_reset (conn);
        priv->ssl = ssl;
 
@@ -1988,12 +1993,6 @@ rspamd_http_connection_write_message_common (struct rspamd_http_connection *conn
                                                        ""
                                                        "\r\n", ENCRYPTED_VERSION, bodylen);
                                }
-
-                               preludelen = rspamd_snprintf (repbuf, sizeof (repbuf), "%s\r\n"
-                                               "Content-Length: %z\r\n"
-                                               "Content-Type: %s\r\n"
-                                               "\r\n", ENCRYPTED_VERSION, bodylen,
-                                               mime_type);
                        }
                        else {
                                preludelen = rspamd_snprintf (repbuf, sizeof (repbuf),
index 45e99f8ae48df5c329514990135d3a4ae6d1c06c..7eb00f3fa12a140105b854228341aec0666ec180 100644 (file)
@@ -925,7 +925,7 @@ file_log_function (const gchar *module, const gchar *id,
        gchar *m;
        gdouble now;
 
-       struct iovec iov[5];
+       struct iovec iov[6];
        gulong r = 0, mr = 0;
        guint64 cksum;
        size_t mlen, mremain;
index d4687e433dc7c02f72b52a92201770bf3d47f3dd..0f7ff4f489cbbadf08e5f73f220fb9dce0d24371 100644 (file)
@@ -2685,7 +2685,7 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg,
                        }
                }
 
-               if (map->backends->len == 0) {
+               if (!map->backends || map->backends->len == 0) {
                        msg_err_config ("map has no urls to be loaded: no valid backends");
                        goto err;
                }
index 2f39a116db1f246c2fe750bbba461d6f6bccb6a7..a519013d111bdf2a0489afe87e8e33cfcbaffef7 100644 (file)
@@ -490,9 +490,9 @@ void *
 rspamd_mempool_alloc0 (rspamd_mempool_t * pool, gsize size)
 {
        void *pointer = rspamd_mempool_alloc (pool, size);
-       if (pointer) {
-               memset (pointer, 0, size);
-       }
+
+       memset (pointer, 0, size);
+
        return pointer;
 }
 
@@ -500,9 +500,9 @@ void *
 rspamd_mempool_alloc0_tmp (rspamd_mempool_t * pool, gsize size)
 {
        void *pointer = rspamd_mempool_alloc_tmp (pool, size);
-       if (pointer) {
-               memset (pointer, 0, size);
-       }
+
+       memset (pointer, 0, size);
+
        return pointer;
 }
 
@@ -510,9 +510,8 @@ void *
 rspamd_mempool_alloc0_shared (rspamd_mempool_t * pool, gsize size)
 {
        void *pointer = rspamd_mempool_alloc_shared (pool, size);
-       if (pointer) {
-               memset (pointer, 0, size);
-       }
+
+       memset (pointer, 0, size);
        return pointer;
 }
 
@@ -800,7 +799,6 @@ rspamd_mempool_stat (rspamd_mempool_stat_t * st)
                st->shared_chunks_allocated = mem_pool_stat->shared_chunks_allocated;
                st->bytes_allocated = mem_pool_stat->bytes_allocated;
                st->chunks_allocated = mem_pool_stat->chunks_allocated;
-               st->shared_chunks_allocated = mem_pool_stat->shared_chunks_allocated;
                st->chunks_freed = mem_pool_stat->chunks_freed;
                st->oversized_chunks = mem_pool_stat->oversized_chunks;
        }
index 2681705124ab29409a643a19027240c5a0f19b5b..5f5724a0c4437ecd25ef33403b4774839a4ca938 100644 (file)
@@ -209,7 +209,6 @@ rspamd_multipattern_pattern_filter (const gchar *pattern, gsize len,
                        g_free (tmp);
                }
                else if (flags & RSPAMD_MULTIPATTERN_RE) {
-                       ret = malloc (len + 1);
                        ret = rspamd_str_regexp_escape (pattern, len, dst_len, gl_flags |
                                        RSPAMD_REGEXP_ESCAPE_RE);
                }
index 95d78c7f5b2b1c94963afe8533e6e719d55e553c..d17e823e67c9eae2b2e3aa9703fee2df2f8a964c 100644 (file)
@@ -228,12 +228,6 @@ rspamd_rrd_check_file (const gchar *filename, gboolean need_data, GError **err)
                close (fd);
                return FALSE;
        }
-       if (memcmp (head.version, RRD_VERSION, sizeof (head.version)) != 0) {
-               g_set_error (err,
-                               rrd_error_quark (), EINVAL, "rrd head error: invalid version");
-               close (fd);
-               return FALSE;
-       }
        if (head.float_cookie != RRD_FLOAT_COOKIE) {
                g_set_error (err,
                                rrd_error_quark (), EINVAL, "rrd head error: another architecture "
@@ -409,16 +403,12 @@ rspamd_rrd_open_common (const gchar *filename, gboolean completed, GError **err)
 
        file = g_malloc0 (sizeof (struct rspamd_rrd_file));
 
-       if (file == NULL) {
-               g_set_error (err, rrd_error_quark (), ENOMEM, "not enough memory");
-               return NULL;
-       }
-
        /* Open file */
        fd = rspamd_rrd_open_exclusive (filename);
        if (fd == -1) {
                g_set_error (err,
                        rrd_error_quark (), errno, "rrd open error: %s", strerror (errno));
+               g_free (file);
                return FALSE;
        }
 
@@ -426,6 +416,7 @@ rspamd_rrd_open_common (const gchar *filename, gboolean completed, GError **err)
                g_set_error (err,
                        rrd_error_quark (), errno, "rrd stat error: %s", strerror (errno));
                rspamd_file_unlock (fd, FALSE);
+               g_free (file);
                close (fd);
                return FALSE;
        }
index 70aa5fe78682217ea3e9588dc47fe09dc4b4b2db..4affb16c30308a302bb45f8edec0ab69dac6810e 100644 (file)
@@ -184,6 +184,10 @@ rspamd_shingles_from_text (GArray *input,
 
                                                g_free (hashes);
 
+                                               if (pool != NULL) {
+                                                       g_free (res);
+                                               }
+
                                                return NULL;
                                        }
 
index 737455a3cca60ed921aa503b2aa1fd1063f1324d..cff684aad01d85fc1f8ca28c82a90b4ff5d66c1e 100644 (file)
@@ -1940,7 +1940,6 @@ rspamd_lua_execute_lua_subprocess (lua_State *L,
                msg_err ("call to subprocess failed: %v", tb);
                /* Indicate error */
                wlen = (1ULL << 63) + tb->len;
-               g_string_free (tb, TRUE);
 
                r = write (cbdata->sp[1], &wlen, sizeof (wlen));
                if (r == -1) {
@@ -1951,6 +1950,7 @@ rspamd_lua_execute_lua_subprocess (lua_State *L,
                if (r == -1) {
                        msg_err ("write failed: %s", strerror (errno));
                }
+               g_string_free (tb, TRUE);
 
                lua_pop (L, 1);
        }
@@ -2205,9 +2205,9 @@ lua_worker_spawn_process (lua_State *L)
 
        if (rspamd_socketpair (cbdata->sp, TRUE) == -1) {
                msg_err ("cannot spawn socketpair: %s", strerror (errno));
-               g_free (cbdata);
                luaL_unref (L, LUA_REGISTRYINDEX, cbdata->func_cbref);
                luaL_unref (L, LUA_REGISTRYINDEX, cbdata->cb_cbref);
+               g_free (cbdata);
 
                return 0;
        }
index e846fd4d7531adf77bb5a6be8ba4ef00cc9815f3..91c648e6fd1506004a733cdacb5a169678cb1df4 100644 (file)
@@ -3900,13 +3900,19 @@ lua_config_init_subsystem (lua_State *L)
                                                        cfg);
                                }
                                else {
+                                       g_strfreev (parts);
+
                                        return luaL_error (L, "no event base specified");
                                }
                        }
                        else {
+                               g_strfreev (parts);
+
                                return luaL_error (L, "invalid param: %s", parts[i]);
                        }
                }
+
+               g_strfreev (parts);
        }
        else {
                return luaL_error (L, "invalid arguments");
index 63839c2866bd28fbd3541a306a489160899439dc..1b5828564bccfc25dcea5d2df6157a4220e1d076 100644 (file)
@@ -249,9 +249,6 @@ lua_html_has_property (lua_State *L)
                else if (strcmp (propname, "unbalanced") == 0) {
                        ret = hc->flags & RSPAMD_HTML_FLAG_UNBALANCED;
                }
-               else if (strcmp (propname, "unbalanced") == 0) {
-                       ret = hc->flags & RSPAMD_HTML_FLAG_UNBALANCED;
-               }
                else if (strcmp (propname, "data_urls") == 0) {
                        ret = hc->flags & RSPAMD_HTML_FLAG_HAS_DATA_URLS;
                }
index 72eec70ad339c7b6e285dff23198cd654f6520a6..e518e6dab7fc5b4b738982dc1a5f9544be9c779a 100644 (file)
@@ -752,6 +752,10 @@ lua_http_request (lua_State *L)
                                                        rspamd_fstring_free (body);
                                                }
 
+                                               if (mime_type) {
+                                                       g_free (mime_type);
+                                               }
+
                                                return luaL_error (L, "invalid body argument: %s",
                                                                lua_typename (L, lua_type (L, -1)));
                                        }
index ec9bfbe6f8da2f4ae0b90e5d3bc1f8b66dfbf320..d10f64579aabbc01dce3902d1c7f7697fd05180d 100644 (file)
@@ -305,7 +305,7 @@ lua_resume_thread_internal_full (struct thread_entry *thread_entry,
                }
                else {
                        tb = rspamd_lua_get_traceback_string (thread_entry->lua_state);
-                       if (thread_entry->error_callback) {
+                       if (tb && thread_entry->error_callback) {
                                thread_entry->error_callback (thread_entry, ret, tb->str);
                        }
                        else if (thread_entry->task) {
index d78e230e773ac4a14337a822270c9b333ec7e1fc..dad8c336b1fce0793cc16c3ff133bdb579b062d8 100644 (file)
@@ -1177,7 +1177,7 @@ lua_util_tokenize_text (lua_State *L)
 {
        LUA_TRACE_POINT;
        const gchar *in = NULL;
-       gsize len, pos, ex_len, i;
+       gsize len = 0, pos, ex_len, i;
        GList *exceptions = NULL, *cur;
        struct rspamd_lua_text *t;
        struct rspamd_process_exception *ex;
@@ -2243,6 +2243,8 @@ lua_util_gzip_decompress (lua_State *L)
                return luaL_error (L, "invalid arguments");
        }
 
+       sz = t->len;
+
        memset (&strm, 0, sizeof (strm));
        /* windowBits +16 to decode gzip, zlib 1.2.0.4+ */
        rc = inflateInit2 (&strm, MAX_WBITS + 16);
index 316ca7f6222f097598332a9253955ead451d188e..d2632cb8129b27dcdb59e12953e928d856f110a5 100644 (file)
@@ -1864,9 +1864,6 @@ surbl_test_tags (struct rspamd_task *task, struct redirector_param *param,
                tld.len = url->tldlen;
 
                ftld = rspamd_mempool_ftokdup (task->task_pool, &tld);
-       }
-
-       if (tag) {
                /* We know results for this URL */
 
                DL_FOREACH (tag, cur) {