diff --git a/core/include/dap_common.h b/core/include/dap_common.h index 4dc1f451bd37f8c1be95b62397a803b670c0e1eb..614e69c5c2e13811c53a6f7ac760e1d7d4f14e30 100755 --- a/core/include/dap_common.h +++ b/core/include/dap_common.h @@ -115,6 +115,7 @@ #endif #define UNUSED_ARG __attribute__((__unused__)) +#define LAST_ERROR_MAX 256 // TODO pipelines fix to enable this macros /*#ifndef likely @@ -139,18 +140,20 @@ #endif #ifdef __cplusplus -#define DAP_CAST_PTR(t,v) reinterpret_cast<t*>(v) +#define DAP_CAST(t,v) reinterpret_cast<t>(v) +#define DAP_CAST_PTR(t,v) DAP_CAST(t*,v) #else -#define DAP_CAST_PTR(t,v) (t*)(v) +#define DAP_CAST(t,v) v +#define DAP_CAST_PTR(t,v) v #endif #define HASH_LAST(head) ( (head) ? ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail) : NULL ); -extern const char *c_error_memory_alloc; -extern const char *c_error_sanity_check; -void dap_delete_multy(int a_count, ...); -uint8_t *dap_serialize_multy(uint8_t *a_data, uint64_t a_size, int a_count, ...); -int dap_deserialize_multy(const uint8_t *a_data, uint64_t a_size, int a_count, ...); +extern const char *c_error_memory_alloc, *c_error_sanity_check, doof; +/* Don't use these function directly! Rather use the corresponding macro's */ +void dap_delete_multy(size_t, ...); +uint8_t *dap_serialize_multy(uint8_t *a_data, uint64_t a_size, ...); +int dap_deserialize_multy(const uint8_t *a_data, uint64_t a_size, ...); #if DAP_SYS_DEBUG #include <assert.h> @@ -202,57 +205,75 @@ static inline void *s_vm_extend(const char *a_rtn_name, int a_rtn_line, void *a_ #ifdef DAP_USE_RPMALLOC #include "rpmalloc.h" #endif -#define DAP_MALLOC(p) malloc(p) -#define DAP_FREE(p) free(p) -#define DAP_CALLOC(p, s) ({ size_t s1 = (size_t)(s); s1 > 0 ? calloc(p, s1) : DAP_CAST_PTR(void, NULL); }) -#define DAP_ALMALLOC(p, s) ({ size_t s1 = (size_t)(s); s1 > 0 ? _dap_aligned_alloc(p, s1) : DAP_CAST_PTR(void, NULL); }) -#define DAP_ALREALLOC(p, s) ({ size_t s1 = (size_t)(s); s1 > 0 ? _dap_aligned_realloc(p, s1) : DAP_CAST_PTR(void, NULL); }) +#define DAP_TYPE_SIZE(p) (intmax_t)sizeof( *(__typeof__(p)){ 0 } ) +#define DAP_MALLOC(s) ({ intmax_t _s = (intmax_t)(s); _s > 0 ? malloc(_s) : NULL; }) +#define DAP_FREE(p) free((void*)(p)) +#define DAP_CALLOC(n, s) ({ intmax_t _s = (intmax_t)(s), _n = (intmax_t)(n); _s > 0 && _n > 0 ? calloc(_n, _s) : NULL; }) +#define DAP_REALLOC(p, s) ({ intmax_t _s = (intmax_t)(s); _s >= DAP_TYPE_SIZE(p) ? realloc(p, _s) : NULL; }) +#define DAP_ALMALLOC(a, s) ({ intmax_t _s = (intmax_t)(s), _a = (intmax_t)(a); _s > 0 && _a >= 0 ? _dap_aligned_alloc(_a, _s) : NULL; }) +#define DAP_ALREALLOC(p, s) ({ intmax_t _s = (intmax_t)(s); _s >= DAP_TYPE_SIZE(p) ? _dap_aligned_realloc(p, _s) : NULL; }) #define DAP_ALFREE(p) _dap_aligned_free(p) #define DAP_PAGE_ALMALLOC(p) _dap_page_aligned_alloc(p) #define DAP_PAGE_ALFREE(p) _dap_page_aligned_free(p) -#define DAP_NEW(t) DAP_CAST_PTR(t, malloc(sizeof(t))) -#define DAP_NEW_SIZE(t, s) ({ size_t s1 = (size_t)(s); s1 > 0 ? DAP_CAST_PTR(t, malloc(s1)) : DAP_CAST_PTR(t, NULL); }) +#define DAP_NEW(t) DAP_CAST_PTR( t, malloc(sizeof(t)) ) +#define DAP_NEW_SIZE(t, s) ({ intmax_t _s = (intmax_t)(s); _s >= (intmax_t)(sizeof(t)) ? DAP_CAST_PTR(t, malloc(_s)) : NULL; }) /* Auto memory! Do not inline! Do not modify the size in-call! */ -#define DAP_NEW_STACK(t) DAP_CAST_PTR(t, alloca(sizeof(t))) -#define DAP_NEW_STACK_SIZE(t, s) DAP_CAST_PTR(t, (size_t)(s) > 0 ? alloca((size_t)(s)) : NULL) +#define DAP_NEW_STACK(t) &(t){ } +#define DAP_NEW_STACK_SIZE(t, s) DAP_CAST_PTR( t, (intmax_t)(s) >= (intmax_t)(sizeof(t)) && (intmax_t)(s) < (1 << 15) ? alloca((intmax_t)(s)) : NULL ) /* ... */ -#define DAP_NEW_Z(t) DAP_CAST_PTR(t, calloc(1, sizeof(t))) -#define DAP_NEW_Z_SIZE(t, s) ({ size_t s1 = (size_t)(s); s1 > 0 ? DAP_CAST_PTR(t, calloc(1, s1)) : DAP_CAST_PTR(t, NULL); }) -#define DAP_NEW_Z_COUNT(t, c) ({ size_t c1 = (size_t)(c); c1 > 0 ? DAP_CAST_PTR(t, calloc(c1, sizeof(t))) : DAP_CAST_PTR(t, NULL); }) -#define DAP_REALLOC(p, s) ({ size_t s1 = (size_t)(s); s1 > 0 ? realloc(p, s1) : ({ DAP_DEL_Z(p); DAP_CAST_PTR(void, NULL); }); }) -#define DAP_REALLOC_COUNT(p, c) ({ size_t s1 = sizeof(*(p)); size_t c1 = (size_t)(c); c1 > 0 ? realloc(p, c1 * s1) : ({ DAP_DEL_Z(p); DAP_CAST_PTR(void, NULL); }); }) +#define DAP_NEW_Z(t) DAP_CAST_PTR( t, calloc(1, sizeof(t)) ) +#define DAP_NEW_Z_SIZE(t, s) DAP_CAST_PTR( t, DAP_CALLOC(1, s) ) +#define DAP_NEW_Z_COUNT(t, c) DAP_CAST_PTR( t, DAP_CALLOC(c, sizeof(t)) ) +#define DAP_REALLOC_COUNT(p, c) DAP_CAST_PTR( t, DAP_REALLOC(p, (c) * DAP_TYPE_SIZE(p)) ) #define DAP_DELETE(p) free((void*)(p)) -#define DAP_DELETE_COUNT(p,c) for (size_t c1 = p ? (size_t)(c) : 0; c1; DAP_DELETE(p[--c1])); -#define DAP_DUP(p) ({ void *p1 = (uintptr_t)(p) != 0 ? calloc(1, sizeof(*(p))) : NULL; p1 ? memcpy(p1, (p), sizeof(*(p))) : DAP_CAST_PTR(void, NULL); }) -#define DAP_DUP_SIZE(p, s) ({ size_t s1 = (p) ? (size_t)(s) : 0; void *p1 = (p) && (s1 > 0) ? calloc(1, s1) : NULL; p1 ? memcpy(p1, (p), s1) : DAP_CAST_PTR(void, NULL); }) +#define DAP_DEL_Z(p) do { DAP_FREE(p); (p) = NULL; } while (0); +#define DAP_DEL_ARRAY(p, c) for ( intmax_t _c = p ? (intmax_t)(c) : 0; _c > 0; DAP_DELETE(p[--_c]) ); +#define DAP_DUP_SIZE(p, s) ({ intmax_t _s = (intmax_t)(s); __typeof__(p) _p = ( (uintptr_t)(p) && _s >= DAP_TYPE_SIZE(p) ) ? DAP_CAST(__typeof__(p), calloc(1, _s)) : NULL; _p ? DAP_CAST(__typeof__(p), memcpy(_p, (p), _s)) : NULL; }) +#define DAP_DUP(p) ({ __typeof__(p) _p = (uintptr_t)(p) ? calloc(1, sizeof(*(p))) : NULL; if (_p) *_p = *(p); _p; }) + #endif -#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N -#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) -#define DAP_DEL_MULTY(...) dap_delete_multy(VA_NARGS(__VA_ARGS__), __VA_ARGS__) - -#define DAP_DEL_Z(a) do if (a) { DAP_DELETE(a); (a) = NULL; } while (0); -// a - pointer to alloc -// t - type return pointer -// s - size to alloc -// c - count element -// val - return value if error -// ... what need free if error, if nothing write NULL -#define DAP_NEW_Z_RET(a, t, ...) do { if (!(a = DAP_NEW_Z(t))) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return; } } while (0); -#define DAP_NEW_Z_RET_VAL(a, t, ret_val, ...) do { if (!(a = DAP_NEW_Z(t))) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return ret_val; } } while (0); -#define DAP_NEW_Z_SIZE_RET(a, t, s, ...) do { if (!(a = DAP_NEW_Z_SIZE(t, s))) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return; } } while (0); -#define DAP_NEW_Z_SIZE_RET_VAL(a, t, s, ret_val, ...) do { if (!(a = DAP_NEW_Z_SIZE(t, s))) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return ret_val; } } while (0); -#define DAP_NEW_Z_COUNT_RET(a, t, c, ...) do { if (!(a = DAP_NEW_Z_COUNT(t, c))) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return; } } while (0); -#define DAP_NEW_Z_COUNT_RET_VAL(a, t, c, ret_val, ...) do { if (!(a = DAP_NEW_Z_COUNT(t, c))) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return ret_val; } } while (0); - -#define dap_return_if_pass(expr) dap_return_if_pass_err(expr,c_error_sanity_check) -#define dap_return_val_if_pass(expr,val) dap_return_val_if_pass_err(expr,val,c_error_sanity_check) -#define dap_return_if_pass_err(expr,err_str) {if(expr) {_log_it(__FUNCTION__, __LINE__, LOG_TAG, L_WARNING, "%s", err_str); return;}} -#define dap_return_val_if_pass_err(expr,val,err_str) {if(expr) {_log_it(__FUNCTION__, __LINE__, LOG_TAG, L_WARNING, "%s", err_str); return (val);}} -#define dap_return_if_fail(expr) dap_return_if_pass(!(expr)); -#define dap_return_val_if_fail(expr,val) dap_return_val_if_pass(!(expr),val) -#define dap_return_if_fail_err(expr,err_str) dap_return_if_pass_err(!(expr),err_str) -#define dap_return_val_if_fail_err(expr,val,err_str) dap_return_val_if_pass_err(!(expr),val,err_str) +#define DOOF_PTR (void*)&doof +#define DAP_NARGS_PTRS(...) ( sizeof( (void*[]){NULL, ##__VA_ARGS__} ) / sizeof(void*) - 1 ) +#define DAP_DEL_MULTY(...) dap_delete_multy(DAP_NARGS_PTRS(__VA_ARGS__), ##__VA_ARGS__) +#define DAP_VA_SERIALIZE(data, size, ...) dap_serialize_multy(data, size, ##__VA_ARGS__, DOOF_PTR) +#define DAP_VA_SERIALIZE_NEW(size, ...) DAP_VA_SERIALIZE(NULL, size, __VA_ARGS__) +#define DAP_VA_DESERIALIZE(data, size, ...) dap_deserialize_multy(data, size, ##__VA_ARGS__, DOOF_PTR) + +#define DAP_NEW_Z_RET_VAL_IF_FAIL(t, r, ...) ({ \ + t *_p = DAP_NEW_Z(t); if (!_p) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return r; } _p; \ +}) +#define DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(t, s, r, ...) ({ \ + t *_p = DAP_NEW_Z_SIZE(t, s); if (!_p) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return r; } _p; \ +}) +#define DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(t, c, r, ...) ({ \ + t *_p = DAP_NEW_Z_COUNT(t, c); if (!_p) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return r; } _p; \ +}) +#define DAP_DUP_SIZE_RET_VAL_IF_FAIL(p, s, r, ...) ({ \ + void *_p = DAP_DUP_SIZE(p, s); if (!_p) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return r; } _p; \ +}) +#define DAP_REALLOC_RET_VAL_IF_FAIL(p, s, r, ...) ({ \ + void *_p = DAP_REALLOC(p, s); if (!_p) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return r; } _p; \ +}) +#define DAP_REALLOC_COUNT_RET_VAL_IF_FAIL(p, c, r, ...) ({ \ + void *_p = DAP_REALLOC_COUNT(p, c); if (!_p) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(__VA_ARGS__); return r; } _p; \ +}) + +#define DAP_NEW_Z_RET_IF_FAIL(t, ...) DAP_NEW_Z_RET_VAL_IF_FAIL(t, , __VA_ARGS__) +#define DAP_NEW_Z_SIZE_RET_IF_FAIL(t, s, ...) DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(t, s, , __VA_ARGS__) +#define DAP_NEW_Z_COUNT_RET_IF_FAIL(t, c, ...) DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(t, c, , __VA_ARGS__) +#define DAP_DUP_SIZE_RET_IF_FAIL(p, s, ...) DAP_DUP_SIZE_RET_VAL_IF_FAIL(p, s, , __VA_ARGS__) +#define DAP_REALLOC_RET_IF_FAIL(p, s, ...) DAP_REALLOC_RET_VAL_IF_FAIL(p, s, , __VA_ARGS__) +#define DAP_REALLOC_COUNT_RET_IF_FAIL(p, c, ...) DAP_REALLOC_COUNT_RET_VAL_IF_FAIL(p, c, , __VA_ARGS__) + +#define dap_return_val_if_pass_err(e, r, s) do { if (e) { _log_it(__FUNCTION__, __LINE__, LOG_TAG, L_WARNING, "%s", s); return r; } } while(0); +#define dap_return_val_if_fail_err(e, r, s) dap_return_val_if_pass_err(!(e), r, s) +#define dap_return_val_if_pass(e, r) dap_return_val_if_pass_err(e, r, c_error_sanity_check) +#define dap_return_val_if_fail(e, r) dap_return_val_if_fail_err(e, r, c_error_sanity_check) +#define dap_return_if_pass_err(e, s) dap_return_val_if_pass_err(e, , s) +#define dap_return_if_fail_err(e, s) dap_return_val_if_fail_err(e, , s) +#define dap_return_if_pass(e) dap_return_if_pass_err(e, c_error_sanity_check) +#define dap_return_if_fail(e) dap_return_if_fail_err(e, c_error_sanity_check) #ifndef __cplusplus #define DAP_IS_ALIGNED(p) !((uintptr_t)DAP_CAST_PTR(void, p) % _Alignof(typeof(p))) @@ -306,6 +327,10 @@ DAP_STATIC_INLINE uint64_t dap_page_rounddown(uint64_t a) { return a & ( ~(dap_pagesize() - 1) ); } +typedef union dap_error_str { + const char s[LAST_ERROR_MAX]; +} dap_error_str_t; + #ifdef DAP_OS_WINDOWS #define SIZE_64KB ( 1 << 16 ) DAP_STATIC_INLINE uint64_t dap_64k_rounddown(uint64_t a) { @@ -345,7 +370,7 @@ DAP_STATIC_INLINE void *_dap_aligned_alloc( uintptr_t alignment, uintptr_t size DAP_STATIC_INLINE void *_dap_aligned_realloc( uintptr_t alignment, void *bptr, uintptr_t size ) { - uintptr_t ptr = (uintptr_t) DAP_REALLOC( bptr, size + (alignment * 2) + sizeof(void *) ); + uintptr_t ptr = (uintptr_t) DAP_REALLOC((uint8_t*)bptr, size + (alignment * 2) + sizeof(void *) ); if ( !ptr ) return (void *)ptr; @@ -865,8 +890,8 @@ DAP_INLINE uint64_t dap_hex_to_uint(const char *arr, short size) { extern char *g_sys_dir_path; //int dap_common_init( const char * a_log_file ); -int dap_common_init( const char *console_title, const char *a_log_file, const char *a_log_dirpath ); -int wdap_common_init( const char *console_title, const wchar_t *a_wlog_file); +int dap_common_init( const char *console_title, const char *a_log_file ); +int wdap_common_init( const char *console_title, const wchar_t *a_wlog_file ); typedef enum { @@ -1003,9 +1028,12 @@ void *l_ptr; #define dump_it(v,s,l) #endif -char *dap_strerror(long long err); +dap_error_str_t dap_strerror_(long long err); +#define dap_strerror(e) dap_strerror_(e).s + #ifdef DAP_OS_WINDOWS -char *dap_str_ntstatus(DWORD err); +dap_error_str_t dap_str_ntstatus_(DWORD err); +#define dap_str_ntstatus(e) dap_str_ntstatus_(e).s #endif void dap_log_level_set(enum dap_log_level ll); enum dap_log_level dap_log_level_get(void); @@ -1014,7 +1042,12 @@ void dap_set_log_tag_width(size_t width); const char * dap_get_appname(); void dap_set_appname(const char * a_appname); -char *dap_itoa(long long i); +#define INT_DIGITS 19 /* enough for 64 bit integer */ +typedef union dap_maxint_str { + const char s[INT_DIGITS + 2]; +} dap_maxint_str_t; +dap_maxint_str_t dap_itoa_(long long i); +#define dap_itoa(i) (char*)dap_itoa_(i).s unsigned dap_gettid(); @@ -1039,7 +1072,7 @@ void dap_interval_timer_deinit(); static inline void *dap_mempcpy(void *a_dest, const void *a_src, size_t n) { - return ((byte_t *)memcpy(a_dest, a_src, n)) + n; + return n ? (byte_t*)memcpy(a_dest, a_src, n) + n : a_dest; } DAP_STATIC_INLINE int dap_is_letter(char c) { return dap_ascii_isalpha(c); } @@ -1106,18 +1139,21 @@ int exec_silent(const char *a_cmd); DAP_STATIC_INLINE int dap_stream_node_addr_from_str(dap_stream_node_addr_t *a_addr, const char *a_addr_str) { - if (!a_addr || !a_addr_str){ - return -1; - } - if (sscanf(a_addr_str, NODE_ADDR_FP_STR, NODE_ADDR_FPS_ARGS(a_addr)) == 4) - return 0; - if (sscanf(a_addr_str, "0x%016" DAP_UINT64_FORMAT_x, &a_addr->uint64) == 1) - return 0; - return -1; + if (!a_addr || !a_addr_str) + return -2; + return sscanf(a_addr_str, NODE_ADDR_FP_STR, NODE_ADDR_FPS_ARGS(a_addr)) == 4 + || sscanf(a_addr_str, "0x%016" DAP_UINT64_FORMAT_x, (uint64_t*)a_addr) == 1 + || sscanf(a_addr_str, "0x%016" DAP_UINT64_FORMAT_X, (uint64_t*)a_addr) == 1 + ? 0 : -1; } DAP_STATIC_INLINE bool dap_stream_node_addr_is_blank(dap_stream_node_addr_t *a_addr) { return !a_addr->uint64; } -const char *dap_stream_node_addr_to_str_static(dap_stream_node_addr_t a_address); +#define DAP_NODE_ADDR_LEN 23 +typedef union dap_node_addr_str { + const char s[DAP_NODE_ADDR_LEN]; +} dap_node_addr_str_t; +dap_node_addr_str_t dap_stream_node_addr_to_str_static_(dap_stream_node_addr_t a_address); +#define dap_stream_node_addr_to_str_static(a) dap_stream_node_addr_to_str_static_(a).s void dap_common_enable_cleaner_log(size_t a_timeout, size_t a_max_size); diff --git a/core/include/dap_config.h b/core/include/dap_config.h index 2e60bdf465a98dd77454962ff6cb6cd6c95e2f55..b42d960e46a4d3a6e1a0db132a3d9dac425b0d60 100644 --- a/core/include/dap_config.h +++ b/core/include/dap_config.h @@ -46,7 +46,7 @@ const char *dap_config_get_item_str_default(dap_config_t *a_config, const char * char *dap_config_get_item_str_path_default(dap_config_t *a_config, const char *a_section, const char *a_item_name, const char *a_default); const char** dap_config_get_array_str(dap_config_t *a_config, const char *a_section, const char *a_item_name, uint16_t *array_length); char **dap_config_get_item_str_path_array(dap_config_t *a_config, const char *a_section, const char *a_item_name, uint16_t *array_length); -void dap_config_get_item_str_path_array_free(char **paths_array, uint16_t *array_length); +void dap_config_get_item_str_path_array_free(char **paths_array, uint16_t array_length); double dap_config_get_item_double_default(dap_config_t *a_config, const char *a_section, const char *a_item_name, double a_default); int dap_config_stream_addrs_parse(dap_config_t *a_cfg, const char *a_config, const char *a_section, dap_stream_node_addr_t **a_addrs, uint16_t *a_addrs_count); diff --git a/core/include/dap_file_utils.h b/core/include/dap_file_utils.h index 237815d51b697c4de28e7d7ea6346b3454421e28..965803002e10017b584f28c975ca1b6a5c39aa5d 100755 --- a/core/include/dap_file_utils.h +++ b/core/include/dap_file_utils.h @@ -129,8 +129,8 @@ void dap_subs_free(dap_list_name_directories_t *subs_list); /* * Reads an entire file into allocated memory, with error checking. */ -bool dap_file_get_contents(const char *filename, char **contents, size_t *length); - +//bool dap_file_get_contents(const char *filename, char **contents, size_t *length); +char *dap_file_get_contents2(const char *filename, size_t *length); /* * Creates a path from a series of elements using @separator as the * separator between elements. At the boundary between two elements, @@ -169,6 +169,7 @@ char *dap_build_filename (const char *first_element, ...); */ char* dap_canonicalize_filename(const char *filename, const char *relative_to); +char* dap_canonicalize_path(const char *a_filename, const char *a_path); /* * Gets the current directory * Returns: (type filename) (transfer full): the current directory diff --git a/core/include/dap_math_ops.h b/core/include/dap_math_ops.h index 9ff44cd5ef9e95264aa9bf737bc29851ef23b019..af8397bb000ad0ae804c055fc2360129ab1155a8 100755 --- a/core/include/dap_math_ops.h +++ b/core/include/dap_math_ops.h @@ -470,7 +470,7 @@ static inline int SUM_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t* overflow_flag=SUM_128_128(carry_in_128,a_256_bit.hi,&intermediate_value); overflow_flag_intermediate=SUM_128_128(intermediate_value,b_256_bit.hi,&intermediate_value); c_256_bit->hi = intermediate_value; - overflow_flag=overflow_flag||overflow_flag_intermediate; + overflow_flag |= overflow_flag_intermediate; #else uint256_t tmp = uint256_0; overflow_flag=SUM_128_128(a_256_bit.lo,b_256_bit.lo,&tmp.lo); @@ -484,7 +484,7 @@ static inline int SUM_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t* overflow_flag_bis=SUM_128_128(intermediate_value,b_256_bit.hi,&tmp.hi); c_256_bit->hi = tmp.hi; c_256_bit->lo = tmp.lo; - overflow_flag=overflow_flag||overflow_flag_bis; + overflow_flag |= overflow_flag_bis; #endif return overflow_flag; } diff --git a/core/include/dap_tsd.h b/core/include/dap_tsd.h index 5b972f814477ad9e613d358a5e3c251e5cf97630..304f38fa3a1924451ebd6c6fe8ce4969242b6633 100644 --- a/core/include/dap_tsd.h +++ b/core/include/dap_tsd.h @@ -40,7 +40,7 @@ dap_list_t *dap_tsd_find_all(byte_t *a_data, size_t a_data_size, uint16_t a_type #define dap_tsd_get_object(a,typeconv) ( a->size >= sizeof(typeconv) ? ((typeconv*) a->data) : (typeconv *) {0}) #define _dap_tsd_get_scalar(tsd,dest) ({ tsd->size >= sizeof(*dest) ? memcpy(dest, tsd->data, sizeof(*dest)) : NULL; *dest; }) -#define _dap_tsd_get_object(tsd,desttype) ( tsd->size >= sizeof(desttype) ? DAP_CAST_PTR(desttype,tsd->data) : DAP_CAST_PTR(desttype, NULL) ) +#define _dap_tsd_get_object(tsd,desttype) ( tsd->size >= sizeof(desttype) ? (desttype*)tsd->data : NULL ) #define DAP_TSD_CORRUPTED_STRING "<CORRUPTED STRING>" // NULL-terminated string diff --git a/core/src/dap_common.c b/core/src/dap_common.c index 8b8401ca623a46935c883ad5c346d6d530fed892..b1cd1d83c354b9fd7c79fa0c9fd8c5822d183aee 100755 --- a/core/src/dap_common.c +++ b/core/src/dap_common.c @@ -50,8 +50,6 @@ #define DAP_LOG_USE_SPINLOCK 0 #define DAP_LOG_HISTORY 1 -#define LAST_ERROR_MAX 255 - #define LOG_TAG "dap_common" typedef void (*print_callback) (unsigned a_off, const char *a_fmt, va_list va); @@ -77,10 +75,11 @@ const uint256_t uint256_max = {.hi = uint128_max, .lo = uint128_max}; const uint512_t uint512_0 = {}; -const char *c_error_memory_alloc = "Memory allocation error"; -const char *c_error_sanity_check = "Sanity check error"; +const char *c_error_memory_alloc = "Memory allocation error", + *c_error_sanity_check = "Sanity check error", + doof = 0; -static const char *s_log_level_tag[ 16 ] = { +static const char *s_log_level_tag[ ] = { " [DBG] ", // L_DEBUG = 0 " [INF] ", // L_INFO = 1, " [ * ] ", // L_NOTICE = 2, @@ -103,7 +102,7 @@ static const char *s_log_level_tag[ 16 ] = { #endif }; -const char *s_ansi_seq_color[ 16 ] = { +const char *s_ansi_seq_color[ ] = { "\x1b[0;37;40m", // L_DEBUG = 0 "\x1b[1;32;40m", // L_INFO = 2, @@ -127,10 +126,10 @@ const char *s_ansi_seq_color[ 16 ] = { #endif }; -static unsigned int s_ansi_seq_color_len[16] = {0}; +static unsigned int s_ansi_seq_color_len[ sizeof(s_ansi_seq_color) / sizeof(char*) ] = { }; -#ifdef _WIN32 - WORD log_level_colors[ 16 ] = { +#ifdef DAP_OS_WINDOWS + WORD log_level_colors[ ] = { 7, // L_DEBUG 10, // L_INFO 2, // L_NOTICE @@ -153,9 +152,7 @@ static unsigned int s_ansi_seq_color_len[16] = {0}; static volatile bool s_log_term_signal = false; char* g_sys_dir_path = NULL; -static char s_log_file_path[MAX_PATH] = {'\0'}, - s_log_dir_path[MAX_PATH] = {'\0'}, - s_log_tag_fmt_str[10] = {'\0'}; +static char s_log_file_path[MAX_PATH + 1], s_log_tag_fmt_str[10]; static enum dap_log_level s_dap_log_level = L_DEBUG; static FILE *s_log_file = NULL; @@ -168,7 +165,7 @@ static void print_it_none (unsigned a_off, const char *a_fmt, va_list va){} static void print_it_alog (unsigned a_off, const char *a_fmt, va_list va); #endif -#define LOG_FORMAT_LEN 4096 +#define LOG_FORMAT_LEN 2048 #define LOG_BUF_SIZE 32768 static print_callback s_print_callback = print_it_none; @@ -239,7 +236,7 @@ void dap_log_set_external_output(LOGGER_EXTERNAL_OUTPUT output, void *param) } } -static char* s_appname = NULL; +static char s_appname[32]; DAP_STATIC_INLINE int s_update_log_time(char *a_datetime_str) { time_t t = time(NULL); @@ -261,7 +258,7 @@ void dap_log_level_set( enum dap_log_level a_ll ) { */ const char * dap_get_appname() { - return s_appname?s_appname: "dap"; + return *s_appname ? s_appname : "dap"; } /** @@ -271,8 +268,7 @@ const char * dap_get_appname() */ void dap_set_appname(const char * a_appname) { - s_appname = dap_strdup(a_appname); - + dap_strncpy(s_appname, a_appname, sizeof(s_appname) - 1); } enum dap_log_level dap_log_level_get( void ) { @@ -299,19 +295,11 @@ void dap_set_log_tag_width(size_t a_width) { * @param int a_count - count deleted args * @param void* a_to_delete */ -void dap_delete_multy(int a_count, ...) +void dap_delete_multy(size_t a_count, ...) { - if (a_count <= 0) { - log_it(L_ERROR, "Wrong count in DAP_DELETE macros, maybe many args?"); - return; - } va_list l_args_list; va_start(l_args_list, a_count); - while (a_count > 0) { - void *l_to_delete = va_arg(l_args_list, void*); - DAP_DEL_Z(l_to_delete); - a_count--; - } + for ( void *l_cur; a_count-- && (( l_cur = va_arg(l_args_list, void*) ), 1); DAP_DELETE(l_cur) ); va_end(l_args_list); } @@ -322,27 +310,31 @@ void dap_delete_multy(int a_count, ...) * @param a_count - args count, should be even * @return pointer if pass, else NULL */ -uint8_t *dap_serialize_multy(uint8_t *a_data, uint64_t a_size, int a_count, ...) +uint8_t *dap_serialize_multy(uint8_t *a_data, uint64_t a_size, ...) { - dap_return_val_if_pass(!a_size || a_count % 2, NULL); - - uint8_t *l_ret = a_data; - // allocate memory, if need - if (!l_ret) - DAP_NEW_Z_SIZE_RET_VAL(l_ret, uint8_t, a_size, NULL, NULL); - uint64_t l_shift_mem = 0; + dap_return_val_if_pass( !a_size, NULL ); + uint8_t *l_ret = a_data ? a_data : DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, a_size, NULL), + *l_pos = l_ret, + *l_end = l_pos + a_size; + uint64_t l_size = 0; va_list l_args; - va_start(l_args, a_count); - for (int i = 0; i < a_count / 2; ++i) { - uint8_t *l_arg = va_arg(l_args, uint8_t *); - uint64_t l_size = va_arg(l_args, uint64_t); - memcpy(l_ret + l_shift_mem, l_arg, l_size); - l_shift_mem += l_size; - } - if (l_shift_mem != a_size) { - log_it(L_WARNING, "Error size in the object serialize. %"DAP_UINT64_FORMAT_U" != %"DAP_UINT64_FORMAT_U"", l_shift_mem, a_size); + va_start(l_args, a_size); + for (uint8_t *l_arg; ( l_arg = va_arg(l_args, uint8_t*) ) != DOOF_PTR; ) { + l_size = va_arg(l_args, uint64_t); + if (!l_arg || !l_size) + continue; + else if (l_pos + l_size > l_end) + break; + l_pos = dap_mempcpy(l_pos, l_arg, l_size); } va_end(l_args); + l_size = (uint64_t)(l_pos - l_ret); + if ( l_size != a_size ) { + log_it(L_ERROR, "Serialized data size mismatch"); + if (!a_data) + DAP_DELETE(l_ret); + l_ret = NULL; + } return l_ret; } @@ -353,28 +345,26 @@ uint8_t *dap_serialize_multy(uint8_t *a_data, uint64_t a_size, int a_count, ...) * @param a_count - args count, should be even, memory NOT allocating * @return 0 if pass, other if error */ -int dap_deserialize_multy(const uint8_t *a_data, uint64_t a_size, int a_count, ...) +int dap_deserialize_multy(const uint8_t *a_data, uint64_t a_size, ...) { - dap_return_val_if_pass(!a_size || a_count % 2, -1); + dap_return_val_if_pass(!a_data || !a_size, -1); - uint64_t l_shift_mem = 0; + uint64_t l_size = 0, l_shift = 0; va_list l_args; - va_start(l_args, a_count); - for (int i = 0; i < a_count / 2; ++i) { - uint8_t *l_arg = va_arg(l_args, uint8_t *); - uint64_t l_size = va_arg(l_args, uint64_t); - if (l_shift_mem + l_size > a_size) { - log_it(L_ERROR, "Error size in the object deserialize. %"DAP_UINT64_FORMAT_U" > %"DAP_UINT64_FORMAT_U"", l_shift_mem + l_size, a_size); + va_start(l_args, a_size); + for (uint8_t *l_arg; ( l_arg = va_arg(l_args, uint8_t*) ) != DOOF_PTR; ) { + l_size = va_arg(l_args, uint64_t); + if (l_shift + l_size > a_size) { + log_it(L_ERROR, "Objects sizes exeed total buffer size: %"DAP_UINT64_FORMAT_U" > %"DAP_UINT64_FORMAT_U"", l_shift + l_size, a_size); va_end(l_args); return -2; } - memcpy(l_arg, a_data + l_shift_mem, l_size); - l_shift_mem += l_size; - } - if (l_shift_mem != a_size) { - log_it(L_WARNING, "Error size in the object deserialize. %"DAP_UINT64_FORMAT_U" != %"DAP_UINT64_FORMAT_U"", l_shift_mem, a_size); + memcpy(l_arg, a_data + l_shift, l_size); + l_shift += l_size; } va_end(l_args); + if (l_shift < a_size) + log_it(L_WARNING, "Unprocessed %"DAP_UINT64_FORMAT_U" bytes after deserialization", a_size - l_shift); return 0; } @@ -392,19 +382,16 @@ static int s_dap_log_open(const char *a_log_file_path, bool a_new) { * @param a_log_dirpath const char *: path to log directory. Saved in s_log_dir_path variable. For example. C:\\Users\\Public\\Document\\cellframe-node\\var\\log * @return int. (0 if succcess, -1 if error) */ -int dap_common_init( const char *a_console_title, const char *a_log_file_path, const char *a_log_dirpath) { +int dap_common_init( const char UNUSED_ARG *a_console_title, const char *a_log_file_path ) { // init randomer srand( (unsigned int)time(NULL) ); - (void) a_console_title; strncpy( s_log_tag_fmt_str, "[%s]\t",sizeof (s_log_tag_fmt_str)); for (int i = 0; i < 16; ++i) s_ansi_seq_color_len[i] =(unsigned int) strlen(s_ansi_seq_color[i]); if ( a_log_file_path && a_log_file_path[0] ) { if (s_dap_log_open(a_log_file_path, false)) return -1; - if (a_log_dirpath != s_log_dir_path) - dap_stpcpy(s_log_dir_path, a_log_dirpath); if (a_log_file_path != s_log_file_path) dap_stpcpy(s_log_file_path, a_log_file_path); } @@ -448,7 +435,7 @@ static void print_it(unsigned a_off, const char *a_fmt, va_list va) { va_copy(va_file, va); s_print_callback(a_off, a_fmt, va); if (!s_log_file) { - if (dap_common_init(dap_get_appname(), s_log_file_path, s_log_dir_path) || !s_log_file) { + if ( dap_common_init(dap_get_appname(), s_log_file_path ) || !s_log_file) { va_end(va_file); return; } @@ -478,7 +465,7 @@ void _log_it(const char * func_name, int line_num, const char *a_log_tag, enum d } } #endif - static _Thread_local char s_format[LOG_FORMAT_LEN] = { '\0' }; + char s_format[LOG_FORMAT_LEN] = { '\0' }; unsigned offset = s_ansi_seq_color_len[a_ll]; memcpy(s_format, s_ansi_seq_color[a_ll], offset); offset += s_update_log_time(s_format + offset); @@ -774,10 +761,10 @@ char *dap_log_get_item(time_t a_start_time, int a_limit) * @brief log_error Error log * @return */ -char *dap_strerror(long long err) { - static _Thread_local char s_error[LAST_ERROR_MAX] = {'\0'}; +dap_error_str_t dap_strerror_(long long err) { + dap_error_str_t l_ret = { }; + char *s_error = (char*)&l_ret; #ifdef DAP_OS_WINDOWS - *s_error = '\0'; DWORD l_len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, err, MAKELANGID (LANG_ENGLISH, SUBLANG_DEFAULT), s_error, LAST_ERROR_MAX, NULL); if (l_len) @@ -787,52 +774,50 @@ char *dap_strerror(long long err) { if ( strerror_r(err, s_error, LAST_ERROR_MAX) ) #endif snprintf(s_error, LAST_ERROR_MAX, "Unknown error code %lld", err); - return s_error; + return l_ret; } #ifdef DAP_OS_WINDOWS -char *dap_str_ntstatus(DWORD err) { - static _Thread_local char s_nterror[LAST_ERROR_MAX] = {'\0'}; +dap_error_str_t dap_str_ntstatus_(DWORD err) { + dap_error_str_t l_ret = { }; + char *s_nterror = (char*)&l_ret; HMODULE ntdll = GetModuleHandle("ntdll.dll"); if (!ntdll) - return log_it(L_CRITICAL, "NtDll error \"%s\"", dap_strerror(GetLastError())), s_nterror; - *s_nterror = '\0'; + return log_it(L_CRITICAL, "NtDll error \"%s\"", dap_strerror(GetLastError())), l_ret; DWORD l_len = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, ntdll, err, MAKELANGID (LANG_ENGLISH, SUBLANG_DEFAULT), s_nterror, LAST_ERROR_MAX, NULL); return ( l_len ? *(s_nterror + l_len - 1) = '\0' - : snprintf(s_nterror, LAST_ERROR_MAX, "Unknown error code %lld", err) ), s_nterror; + : snprintf(s_nterror, LAST_ERROR_MAX, "Unknown error code %lld", err) ), l_ret; } #endif #if 1 -#define INT_DIGITS 19 /* enough for 64 bit integer */ /** * @brief itoa The function converts an integer num to a string equivalent and places the result in a string * @param[in] i number * @return */ -char *dap_itoa(long long i) +dap_maxint_str_t dap_itoa_(long long i) { /* Room for INT_DIGITS digits, - and '\0' */ - static _Thread_local char buf[INT_DIGITS + 2]; - char *p = buf + INT_DIGITS + 1; /* points to terminating '\0' */ + char buf[INT_DIGITS + 2], *p = buf + INT_DIGITS + 1; /* points to terminating '\0' */ if (i >= 0) { do { *--p = '0' + (i % 10); i /= 10; } while (i != 0); - return p; - } - else { /* i < 0 */ + } else { /* i < 0 */ do { *--p = '0' - (i % 10); i /= 10; } while (i != 0); *--p = '-'; } - return p; + dap_maxint_str_t l_ret = { }; + memcpy(&l_ret, p, (size_t)(buf + sizeof(buf) - p - 1)); + return l_ret; } #endif @@ -989,8 +974,7 @@ static const char l_possible_chars[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop */ void dap_random_string_fill(char *str, size_t length) { for(size_t i = 0; i < length; i++) - str[i] = l_possible_chars[ - rand() % (sizeof(l_possible_chars) - 1)]; + str[i] = l_possible_chars[rand() % (sizeof(l_possible_chars) - 1)]; } /** @@ -1563,11 +1547,13 @@ void dap_common_enable_cleaner_log(size_t a_timeout, size_t a_max_size){ #ifdef __cplusplus extern "C" { #endif -const char *dap_stream_node_addr_to_str_static(dap_stream_node_addr_t a_address) + + +dap_node_addr_str_t dap_stream_node_addr_to_str_static_(dap_stream_node_addr_t a_address) { - static _Thread_local char s_buf[23] = { '\0' }; - snprintf(s_buf, sizeof(s_buf), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(a_address)); - return s_buf; + dap_node_addr_str_t l_ret = { }; + snprintf((char*)&l_ret, sizeof(l_ret), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(a_address)); + return l_ret; } #ifdef __cplusplus } diff --git a/core/src/dap_config.c b/core/src/dap_config.c index 08ea8c1ded7ddb80bcabb8b5f2e8b9c3851118c7..d3848f3622449e606ee40f065b2e4b373b5c4f3e 100644 --- a/core/src/dap_config.c +++ b/core/src/dap_config.c @@ -295,7 +295,7 @@ dap_config_t *dap_config_open(const char* a_file_path) { return NULL; } log_it(L_DEBUG, "Looking for config name %s...", a_file_path); - char l_path[MAX_PATH] = { '\0' }; + char l_path[MAX_PATH + 1] = ""; int l_pos = dap_strncmp(a_file_path, s_configs_path, strlen(s_configs_path) - 4) ? snprintf(l_path, MAX_PATH, "%s/%s.cfg", s_configs_path, a_file_path) : snprintf(l_path, MAX_PATH, "%s.cfg", a_file_path); @@ -445,10 +445,12 @@ const char *dap_config_get_item_str_default(dap_config_t *a_config, const char * return l_item->val.val_str; case DAP_CONFIG_ITEM_ARRAY: return *l_item->val.val_arr; - case DAP_CONFIG_ITEM_DECIMAL: - return dap_itoa(l_item->val.val_int); case DAP_CONFIG_ITEM_BOOL: return l_item->val.val_bool ? "true" : "false"; + case DAP_CONFIG_ITEM_DECIMAL: { + static _Thread_local char s_ret[sizeof(dap_maxint_str_t)]; + return (const char*)memcpy(s_ret, dap_itoa(l_item->val.val_int), sizeof(dap_maxint_str_t)); + } default: log_it(L_ERROR, "Parameter \"%s\" '%c' is not string", l_item->name, l_item->type); return a_default; @@ -456,14 +458,12 @@ const char *dap_config_get_item_str_default(dap_config_t *a_config, const char * } char *dap_config_get_item_str_path_default(dap_config_t *a_config, const char *a_section, const char *a_item_name, const char *a_default) { - dap_config_item_t *l_item = dap_config_get_item(a_config, a_section, a_item_name); - if (!l_item) + const char *l_val = dap_config_get_item_str(a_config, a_section, a_item_name); + if (!l_val) return dap_strdup(a_default); - if (l_item->type != DAP_CONFIG_ITEM_STRING) { - log_it(L_ERROR, "Parameter \"%s\" '%c' is not string", l_item->name, l_item->type); - return dap_strdup(a_default); - } - char *l_dir = dap_path_get_dirname(a_config->path), *l_ret = dap_canonicalize_filename(l_item->val.val_str, l_dir); + if ( dap_path_is_absolute(l_val) ) + return dap_strdup(l_val); + char *l_dir = dap_path_get_dirname(a_config->path), *l_ret = dap_canonicalize_path(l_val, l_dir); //log_it(L_DEBUG, "Config-path item: %s: composed from %s and %s", l_ret, l_item->val.val_str, l_dir); return DAP_DELETE(l_dir), l_ret; } @@ -478,7 +478,7 @@ const char **dap_config_get_array_str(dap_config_t *a_config, const char *a_sect log_it(L_WARNING, "Parameter \"%s\" '%c' is not array", l_item->name, l_item->type); if (array_length) *array_length = 1; - static _Thread_local const char* s_ret = NULL; + static _Thread_local const char* s_ret; return s_ret = dap_config_get_item_str(a_config, a_section, a_item_name), &s_ret; } if (array_length) @@ -487,25 +487,21 @@ const char **dap_config_get_array_str(dap_config_t *a_config, const char *a_sect } char **dap_config_get_item_str_path_array(dap_config_t *a_config, const char *a_section, const char *a_item_name, uint16_t *array_length) { - if (!array_length) + if ( !array_length ) return NULL; - const char ** conf_relative = dap_config_get_array_str(a_config, a_section, a_item_name, array_length); - char ** addrs_relative = DAP_NEW_Z_COUNT(char*, *array_length); - for (int i = 0; i < *array_length; ++i) - { - char * l_cfgpath = dap_path_get_dirname(a_config->path); - addrs_relative[i] = dap_canonicalize_filename(conf_relative[i], l_cfgpath); - DAP_DELETE(l_cfgpath); + const char **l_paths_cfg = dap_config_get_array_str(a_config, a_section, a_item_name, array_length); + if ( !l_paths_cfg || !*array_length ) + return NULL; + char *l_cfg_path = dap_path_get_dirname(a_config->path), **l_paths = DAP_NEW_Z_COUNT(char*, *array_length); + for (int i = 0; i < *array_length; ++i) { + l_paths[i] = dap_path_is_absolute(l_paths_cfg[i]) ? dap_strdup(l_paths_cfg[i]) : dap_canonicalize_path(l_paths_cfg[i], l_cfg_path); } - return addrs_relative; + return DAP_DELETE(l_cfg_path), l_paths; } -void dap_config_get_item_str_path_array_free(char **paths_array, uint16_t *array_length) { - if (!array_length) - return; - for (int i = 0; i < *array_length; ++i) - DAP_DEL_Z(paths_array[i]); - DAP_DEL_Z(paths_array); +void dap_config_get_item_str_path_array_free(char **paths_array, uint16_t array_length) { + DAP_DEL_ARRAY(paths_array, array_length); + DAP_DELETE(paths_array); } double dap_config_get_item_double_default(dap_config_t *a_config, const char *a_section, const char *a_item_name, double a_default) { @@ -547,7 +543,7 @@ int dap_config_stream_addrs_parse(dap_config_t *a_cfg, const char *a_config, con const char **l_nodes_addrs = dap_config_get_array_str(a_cfg, a_config, a_section, a_addrs_count); if (*a_addrs_count) { log_it(L_DEBUG, "Start parse stream addrs in cofnig %s section %s", a_config, a_section); - DAP_NEW_Z_COUNT_RET_VAL(*a_addrs, dap_stream_node_addr_t, *a_addrs_count, -2, NULL); + *a_addrs = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_stream_node_addr_t, *a_addrs_count, -2); for (uint16_t i = 0; i < *a_addrs_count; ++i) { if (dap_stream_node_addr_from_str(*a_addrs + i, l_nodes_addrs[i])) { log_it(L_ERROR, "Incorrect format of %s address \"%s\", fix net config and restart node", a_section, l_nodes_addrs[i]); diff --git a/core/src/dap_file_utils.c b/core/src/dap_file_utils.c index c7085846fce8ac4809e3fd387c631caeaa236c11..4f5641f113fa8b30808734261d081f65b6a02cbb 100755 --- a/core/src/dap_file_utils.c +++ b/core/src/dap_file_utils.c @@ -46,6 +46,7 @@ #ifdef DAP_OS_WINDOWS #include <windows.h> #include <io.h> +#define realpath(abs_path, rel_path) _fullpath((rel_path), (abs_path), PATH_MAX) #endif #include "dap_common.h" @@ -166,14 +167,12 @@ bool dap_dir_test(const char * a_dir_path) int dap_mkdir_with_parents(const char *a_dir_path) { // validation of a pointer - if(a_dir_path == NULL || a_dir_path[0] == '\0') { + if (!a_dir_path || !*a_dir_path) { errno = EINVAL; return -1; } - char path[strlen(a_dir_path) + 1]; - memset(path, '\0', strlen(a_dir_path) + 1); - memcpy(path, a_dir_path, strlen(a_dir_path)); - char *p; + char path[strlen(a_dir_path) + 1], *p; + dap_strncpy(path, a_dir_path, sizeof(path) - 1); // skip the root component if it is present, i.e. the "/" in Unix or "C:\" in Windows #ifdef DAP_OS_WINDOWS if(((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z')) @@ -299,19 +298,12 @@ char* dap_path_get_basename(const char *a_file_name) */ bool dap_path_is_absolute(const char *a_file_name) { - dap_return_val_if_fail(a_file_name != NULL, false); - - if(DAP_IS_DIR_SEPARATOR(a_file_name[0])) - return true; - #ifdef DAP_OS_WINDOWS - // Recognize drive letter on native Windows - if (dap_ascii_isalpha(a_file_name[0]) && - a_file_name[1] == ':' && DAP_IS_DIR_SEPARATOR (a_file_name[2])) - return true; + return dap_strlen(a_file_name) > 2 + && dap_ascii_isalpha(a_file_name[0]) && a_file_name[1] == ':' && DAP_IS_DIR_SEPARATOR (a_file_name[2]); +#else + return a_file_name && ( DAP_IS_DIR_SEPARATOR(*a_file_name) || !dap_strncmp(a_file_name, "~/", 2) ); #endif - - return false; } /** @@ -395,7 +387,6 @@ const char *dap_path_skip_root (const char *file_name) */ char* dap_path_get_dirname(const char *a_file_name) { - log_it(L_DEBUG,"dap_path_get_dirname(a_file_name=\"%s\")", a_file_name); char *l_base; size_t l_len; @@ -464,7 +455,7 @@ char* dap_path_get_dirname(const char *a_file_name) { l_len = (uint32_t) strlen (a_file_name) + 1; l_base = DAP_NEW_SIZE (char, l_len + 1); - strcpy (l_base, a_file_name); + strncpy (l_base, a_file_name, l_len - 1); l_base[l_len-1] = DAP_DIR_SEPARATOR; l_base[l_len] = 0; return l_base; @@ -484,7 +475,6 @@ char* dap_path_get_dirname(const char *a_file_name) l_base = DAP_NEW_SIZE(char, l_len + 1); memcpy(l_base, a_file_name, l_len); l_base[l_len] = 0; - log_it(L_DEBUG,"l_base=%s",l_base); return l_base; } @@ -571,6 +561,7 @@ const char* dap_path_get_ext(const char *a_filename) return NULL ; } +#if 0 static bool get_contents_stdio(const char *filename, FILE *f, char **contents, size_t *length) { char buf[4096]; @@ -767,7 +758,46 @@ bool dap_file_get_contents(const char *filename, char **contents, size_t *length return dap_get_contents_posix(filename, contents, length); #endif } +#endif +char *dap_file_get_contents2(const char *a_filename, size_t *length) +{ + dap_return_val_if_fail(length, NULL); + if ( !dap_file_test(a_filename) ) + return log_it(L_ERROR, "File \"%s\" not found", a_filename), NULL; + int l_err = 0; + FILE *f = fopen(a_filename, "rb"); + if (!f) { +#ifdef DAP_OS_WINDOWS + l_err = GetLastError(); +#else + l_err = errno; +#endif + return log_it(L_ERROR, "Can't open file \"%s\", error %d: %s", a_filename, l_err, dap_strerror(l_err)), NULL; + } + off_t l_size = fseeko(f, 0, SEEK_END) ? ftello(f) : -1; + char *l_buffer = NULL; + if (l_size <= 0) { + log_it(L_ERROR, "Can't get file %s size or file is empty", a_filename); + l_err = -3; + } else if (!( l_buffer = DAP_NEW_Z_SIZE(char, l_size)) ) { + log_it(L_CRITICAL, "%s", c_error_memory_alloc); + l_err = -4; + } else { + rewind(f); + if ( fread(l_buffer, 1, l_size, f) < (size_t)l_size ) { + log_it(L_ERROR, "Can't read full file %s", a_filename); + l_err = -5; + } + } + fclose(f); + if (l_err) { + DAP_DEL_Z(l_buffer); + *length = 0; + } else + *length = l_size; + return l_err ? ( DAP_DELETE(l_buffer), NULL ) : l_buffer; +} @@ -1124,8 +1154,118 @@ char* dap_build_filename(const char *first_element, ...) * Returns: (type filename) (transfer full): a newly allocated string with the * canonical file path */ +char* dap_canonicalize_path(const char *a_filename, const char *a_path) { + if (!a_path) + a_path = ""; + if (!a_filename) + a_filename = ""; + char *path = dap_strdup_printf("%s/%s", a_path, a_filename); + size_t i = 0, j = 0, k = 0; + + //Replace backslashes with forward slashes + while (path[i] != '\0') { + //Forward slash or backslash separator found? + if (path[i] == '/' || path[i] == '\\') { + path[k++] = '/'; + while (path[i] == '/' || path[i] == '\\') + i++; + } else + path[k++] = path[i++]; + } + path[k] = '\0'; + + i = j = k = 0; + + do { + //Forward slash separator found + if ( path[i] == '/' || path[i] == '\0' ) { + //"." element found? + if ( (i - j) == 1 && path[j] == '.' ) { + //Check whether the pathname is empty + if (!k) { + if (path[i] == '\0') + path[k++] = '.'; + else if (path[i] == '/' && path[i + 1] == '\0') { + strcpy(path + k, "./"); + k += 2; + } + } else if (k > 1) { + //Remove the final slash if necessary + if ( path[i] == '\0' ) + k--; + } + } + //".." element found? + else if ( (i - j) == 2 && !strncmp(path + j, "..", 2) ) { + //Check whether the pathname is empty + if (!k) { + strcpy(path + k, ".."); + k += 2; + //Append a slash if necessary + if (path[i] == '/') + path[k++] = '/'; + } else if (k > 1) { + //Search the path for the previous slash + for (j = 1; j < k; ++j) { + if ( path[k - j - 1] == '/' ) + break; + } + //Slash separator found? + if (j < k) { + if (!strncmp(path + k - j, "..", 2)) { + strcpy(path + k, ".."); + k += 2; + } else + k -= (j + 1); + + //Append a slash if necessary + if ((k == 0 && path[0] == '/') || path[i] == '/') + path[k++] = '/'; + } else { //No slash separator found? + if (k == 3 && !strncmp (path, "..", 2)) { + strcpy(path + k, ".."); + k += 2; + //Append a slash if necessary + if (path[i] == '/') + path[k++] = '/'; + } else if (path[i] == '\0') { + *path = '.'; + k = 1; + } else if (path[i] == '/' && path[i + 1] == '\0') { + strcpy(path + k, "./"); + k = 2; + } else + k = 0; + } + } + } else { + //Copy directory name + memmove (path + k, path + j, i - j); + //Advance write pointer + k += i - j; + + //Append a slash if necessary + if (path[i] == '/') + path[k++] = '/'; + } + + //Move to the next token + while (path[i] == '/') + i++; + j = i; + } else if (!k) + for ( ; path[i] == '.' || path[i] == '/'; ++i, ++j); + } while (path[i++] != '\0'); + path[k] = '\0'; + return path; +} + char* dap_canonicalize_filename(const char *filename, const char *relative_to) { + char buf[MAX_PATH + 1]; + snprintf(buf, sizeof(buf), "%s/%s", relative_to, filename); + return realpath(buf, NULL); +#if 0 char *canon, *input, *output, *after_root, *output_start; dap_return_val_if_fail(relative_to == NULL || dap_path_is_absolute (relative_to), NULL); @@ -1238,6 +1378,7 @@ char* dap_canonicalize_filename(const char *filename, const char *relative_to) *output = '\0'; return canon; +#endif } @@ -1598,9 +1739,9 @@ static bool s_tar_file_add(int a_outfile, const char *a_fname, const char *a_fpa union tar_buffer l_buffer; if(!a_outfile) return false; - char *l_filebuf = NULL; size_t l_filelen = 0; - if(dap_file_get_contents(a_fpath, &l_filebuf, &l_filelen)) { + char *l_filebuf = dap_file_get_contents2(a_fpath, &l_filelen); + if(l_filebuf) { struct stat l_stat_info; int remaining = l_filelen; // how much is left to write // fill header diff --git a/core/src/dap_json_rpc_errors.c b/core/src/dap_json_rpc_errors.c index 57d95256f265b1da0337551c45652c6297f69286..c0c9e4dc8094858ee169271277c3225f0f244b60 100644 --- a/core/src/dap_json_rpc_errors.c +++ b/core/src/dap_json_rpc_errors.c @@ -57,7 +57,7 @@ int dap_json_rpc_error_add(json_object* a_json_arr_reply, int a_code_error, cons { va_list args; va_start(args, msg); - const char *l_msg = dap_strdup_vprintf(msg, args); + char *l_msg = dap_strdup_vprintf(msg, args); va_end(args); if (!a_json_arr_reply || !json_object_is_type(a_json_arr_reply, json_type_array)) { diff --git a/core/src/dap_list.c b/core/src/dap_list.c index 50b753218d4a5331c3ce5e12002f0a4d5ad91470..223e3399108cf09ebf4c96f19763952a6a3fdd72 100755 --- a/core/src/dap_list.c +++ b/core/src/dap_list.c @@ -73,8 +73,7 @@ dap_list_t *dap_list_append(dap_list_t *a_list, void *a_data) { if(!a_data) return a_list; - dap_list_t *l_el = NULL; - DAP_NEW_Z_RET_VAL(l_el, dap_list_t, a_list, NULL); + dap_list_t *l_el = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_list_t, a_list); l_el->data = a_data; return ({ DL_APPEND(a_list, l_el); a_list; }); } @@ -105,11 +104,8 @@ dap_list_t *dap_list_append(dap_list_t *a_list, void *a_data) */ dap_list_t *dap_list_prepend(dap_list_t *a_list, void *a_data) { -// sanity check dap_return_val_if_pass(!a_data, a_list); -//func work - dap_list_t *l_el = NULL; - DAP_NEW_Z_RET_VAL(l_el, dap_list_t, a_list, NULL); + dap_list_t *l_el = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_list_t, a_list); l_el->data = a_data; return ({ DL_PREPEND(a_list, l_el); a_list; }); } @@ -130,8 +126,7 @@ dap_list_t *dap_list_insert(dap_list_t *a_list, void* a_data, uint64_t a_positio { if (!a_position) return dap_list_prepend(a_list, a_data); - dap_list_t *l_el = NULL; - DAP_NEW_Z_RET_VAL(l_el, dap_list_t, a_list, NULL); + dap_list_t *l_el = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_list_t, a_list); dap_list_t *l_pos = dap_list_nth(a_list, a_position); l_el->data = a_data; return ({ DL_PREPEND_ELEM(a_list, l_pos, l_el); a_list; }); diff --git a/core/src/dap_math_convert.c b/core/src/dap_math_convert.c index 3695ad1ed44bf33ac286f490aa857fd72d44f365..113253952995d2ab07ea892c19990e8e88d7716f 100644 --- a/core/src/dap_math_convert.c +++ b/core/src/dap_math_convert.c @@ -393,9 +393,8 @@ uint256_t dap_uint256_scan_decimal(const char *a_str_decimal) return log_it(L_WARNING, "Incorrect balance format of '%s' - no precision mark", a_str_decimal), uint256_0; - l_pos = l_len - (l_point - l_buf); /* Check number of decimals after dot */ - l_pos--; - if ( (l_pos ) > DATOSHI_DEGREE ) + l_pos = l_len - (l_point - l_buf) - 1; /* Check number of decimals after dot */ + if ( l_pos > DATOSHI_DEGREE ) return log_it(L_WARNING, "Incorrect balance format of '%s' - too much precision", l_buf), uint256_0; /* "123.456" -> "123456" */ @@ -474,7 +473,9 @@ char *dap_uint256_decimal_to_char(uint256_t a_decimal){ //dap_chain_balance_to_c const char *dap_uint256_decimal_to_round_char(uint256_t a_uint256, uint8_t a_round_position, bool is_round) { - return dap_uint256_char_to_round_char(dap_uint256_decimal_to_char(a_uint256), a_round_position, is_round); + char *l_uint256_str = dap_uint256_decimal_to_char(a_uint256); + const char *l_ret = dap_uint256_char_to_round_char(l_uint256_str, a_round_position, is_round); + return DAP_DELETE(l_uint256_str), l_ret; } const char *dap_uint256_char_to_round_char(char* a_str_decimal, uint8_t a_round_pos, bool is_round) @@ -482,10 +483,8 @@ const char *dap_uint256_char_to_round_char(char* a_str_decimal, uint8_t a_round_ _Thread_local static char s_buf[DATOSHI_POW256 + 3]; char *l_dot_pos = strchr(a_str_decimal, '.'), *l_res = s_buf; int l_len = strlen(a_str_decimal); - if (!l_dot_pos || a_round_pos >= DATOSHI_DEGREE || ( l_len - (l_dot_pos - a_str_decimal) <= a_round_pos )) { - memcpy(l_res, a_str_decimal, l_len + 1); - return l_res; - } + if (!l_dot_pos || a_round_pos >= DATOSHI_DEGREE || ( l_len - (l_dot_pos - a_str_decimal) <= a_round_pos )) + return memcpy(l_res, a_str_decimal, l_len + 1); int l_new_len = (l_dot_pos - a_str_decimal) + a_round_pos + 1; *l_res = '0'; diff --git a/core/src/dap_strfuncs.c b/core/src/dap_strfuncs.c index b0ca9f809ef384f6cf6c98497a0576be911e13e9..0ceee9dae9b11a6a73326a31fe3e23d95a08a59e 100755 --- a/core/src/dap_strfuncs.c +++ b/core/src/dap_strfuncs.c @@ -43,29 +43,14 @@ bool dap_isstralnum(const char *c) */ char* dap_strcat2(const char* s1, const char* s2) { - size_t size1 = 0; - size_t size2 = 0; - if (!s1) - size1 = 0; - else - size1 = strlen(s1); - if (!s2) - size2 = 0; - else - size2 = strlen(s2); - - char* result = malloc(size1 + size2 + 1); - - if(result == NULL) - { - exit(EXIT_FAILURE); - } - - memcpy(result, s1, size1); - memcpy(result+size1, s2, size2); - free((void*)s1); - result[size1 + size2] = '\0'; - return result; + size_t size1 = s1 ? strlen(s1) : 0, size2 = s2 ? strlen(s2) : 0; + char *l_ret = (char*)s1; + if (size2) { + l_ret = DAP_REALLOC_RET_VAL_IF_FAIL((char*)s1, size1 + size2 + 1, (char*)s1); + char *l_pos = (char*)dap_mempcpy(l_ret + size1, s2, size2); + *l_pos = '\0'; + } + return l_ret; } @@ -200,8 +185,7 @@ int128_t dap_strtoi128(const char *p, char **endp, int base) */ char *dap_utoa128(char *dest, uint128_t v, int base) { - char buf[129]; - char *p = buf + 128; + char buf[129], *p = buf + 128; const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; *p = '\0'; @@ -302,7 +286,7 @@ int dap_strncmp(const char *a_str1, const char *a_str2, size_t a_n) char* dap_strdup(const char *a_str) { - return a_str ? DAP_DUP_SIZE(a_str, strlen(a_str) + 1) : NULL; + return a_str ? DAP_DUP_SIZE((char*)a_str, strlen(a_str) + 1) : NULL; } /** @@ -718,8 +702,7 @@ char **dap_str_appv(char **a_dst, char **a_src, size_t *a_count) { return a_dst; } l_count = l_count_dst + l_count_src + 1; - char **l_res = DAP_REALLOC_COUNT(a_dst, l_count); - char **l_src = a_src; + char **l_res = DAP_REALLOC_COUNT(a_dst, l_count), **l_src = a_src, **l_new; while (l_src && l_count_src--) { if (**l_src) l_res[l_count_dst++] = *l_src; @@ -730,8 +713,10 @@ char **dap_str_appv(char **a_dst, char **a_src, size_t *a_count) { l_src++; } l_res[l_count_dst] = NULL; - if (l_count > l_count_dst + 1) - l_res = DAP_REALLOC_COUNT(l_res, l_count_dst + 1); + if (l_count > l_count_dst + 1) { + l_new = DAP_REALLOC_COUNT_RET_VAL_IF_FAIL(l_res, l_count_dst + 1, NULL, l_res); + l_res = l_new; + } if (a_count) *a_count = l_count_dst; return l_res; @@ -827,8 +812,7 @@ char* dap_strchug(char *a_string) dap_return_val_if_fail(a_string != NULL, NULL); - for(l_start = (unsigned char*) a_string; *l_start && dap_ascii_isspace(*l_start); l_start++) - ; + for (l_start = (unsigned char*) a_string; *l_start && dap_ascii_isspace(*l_start); l_start++); memmove(a_string, l_start, strlen((char *) l_start) + 1); diff --git a/core/src/dap_string.c b/core/src/dap_string.c index 21932fabef758fef8bdfb03f3d82d66b9de38f23..beb4a1588b7e18571d0a3d2cba3f8b3c4bdb22d1 100755 --- a/core/src/dap_string.c +++ b/core/src/dap_string.c @@ -857,7 +857,7 @@ void dap_string_append_vprintf(dap_string_t *string, const char *format, va_list memcpy(string->str + string->len, buf, len + 1); string->len += len; } else { - len = sprintf(l_buf, l_oom, __func__ ); + len = snprintf(l_buf, sizeof(buf), l_oom, __func__ ); if ( (string->str = DAP_NEW_SIZE(char, sizeof(l_buf ))) ) memcpy(string->str, l_buf , len); } @@ -878,7 +878,6 @@ void dap_string_append_vprintf(dap_string_t *string, const char *format, va_list */ void dap_string_prepend_vprintf(dap_string_t *a_string, const char *a_format, va_list a_args) { - const char l_oom [] = { "Out of memory@%s!" }; char *buf, l_buf[128]; size_t len; diff --git a/core/src/unix/dap_process_memory.c b/core/src/unix/dap_process_memory.c index dc14f0b32c99e0b292a6d9ef393ab654750e423d..7bd6a13c17711b8ba6a7500a15458d3979603503 100755 --- a/core/src/unix/dap_process_memory.c +++ b/core/src/unix/dap_process_memory.c @@ -58,7 +58,7 @@ dap_process_memory_t get_proc_mem_current(void) dap_process_memory_t get_proc_mem_by_pid(pid_t pid) { - char buf[126] = {0}; - sprintf(buf, "/proc/%d/status", pid); + char buf[64]; + snprintf(buf, sizeof(buf), "/proc/%d/status", pid); return _get_process_memory(buf); } diff --git a/core/src/unix/linux/dap_network_monitor.c b/core/src/unix/linux/dap_network_monitor.c index ec6ddaac872d612c8399d83603d066cb5932a1d4..a52c7d32e6cd03065da82a16fb7efda7c88dd536 100755 --- a/core/src/unix/linux/dap_network_monitor.c +++ b/core/src/unix/linux/dap_network_monitor.c @@ -136,7 +136,7 @@ static void _ip_addr_msg_handler(struct nlmsghdr *nlh, /* fill result */ result->addr.ip = htonl(*((uint32_t *)RTA_DATA(rth))); - strcpy(result->addr.s_ip, inet_str); + strncpy(result->addr.s_ip, inet_str, MAX_IP_STR_LEN); if_indextoname(ifa->ifa_index, result->addr.interface_name); } } diff --git a/core/test/dap_common_test.c b/core/test/dap_common_test.c index 95e581fbca99af8e8323759c21ff74c7f3595a19..c89d0f46e43a7b21430a7059a9613422640815f3 100755 --- a/core/test/dap_common_test.c +++ b/core/test/dap_common_test.c @@ -56,11 +56,12 @@ DAP_STATIC_INLINE void s_randombytes(unsigned char *a_array, uint64_t a_len) static void s_test_put_int() { dap_print_module_name("dap_common"); - const int INT_VAL = 10; - const char * EXPECTED_RESULT = "10"; - char * result_arr = dap_itoa(INT_VAL); - dap_assert(strcmp(result_arr, EXPECTED_RESULT) == 0, - "Check string result from itoa"); + + const long long ten = 10, minus_twenty = -20, maxv = LLONG_MAX, minv = LLONG_MIN; + const char ten_str[] = "10", minus_twenty_str[] = "-20", maxv_str[] = "9223372036854775807", minv_str[] = "-9223372036854775808"; + char *res_ten = dap_itoa(ten), *res_minus_20 = dap_itoa(minus_twenty), *res_maxv = dap_itoa(maxv), *res_minv = dap_itoa(minv); + dap_assert(!strcmp(res_ten, ten_str) && !strcmp(minus_twenty_str, res_minus_20) + && !strcmp(maxv_str, res_maxv) && !strcmp(minv_str, res_minv), "Check string result from itoa"); } DAP_STATIC_INLINE void s_overflow_add_custom(void *a_array_a, void *a_array_b, uint64_t a_pos, s_data_type a_type) @@ -1077,12 +1078,7 @@ static void s_test_overflow_diff_types_boundary_max(unsigned long long *l_a, uns static void s_test_overflow_diff_types_boundary() { - unsigned long long - *l_a = NULL, - *l_b = NULL; - DAP_NEW_Z_COUNT_RET(l_a, unsigned long long, 2, NULL); - l_b = l_a + 1; - + unsigned long long l_a[2], *l_b = l_a + 1; dap_print_module_name("dap_overflow_add_diff_types_boundary_min"); *l_b = 0; s_test_overflow_diff_types_boundary_min(l_a, l_b); @@ -1180,38 +1176,27 @@ static void s_test_overflow_diff_types_boundary() (*(signed char *)l_b) = dap_maxval((signed char)0); s_test_overflow_diff_types_boundary_max(l_a, l_b); dap_assert(true, "b = max"); - - DAP_DELETE(l_a); } static void s_test_overflow_diff_types_rand(uint64_t a_times) { dap_print_module_name("dap_overflow_add_diff_types_rand"); - unsigned long long - *l_a = NULL, - *l_b = NULL; - DAP_NEW_Z_COUNT_RET(l_a, unsigned long long, 2, NULL); - l_b = l_a + 1; + unsigned long long l_a[2], *l_b = l_a + 1; for (uint64_t i = 0; i < a_times; ++i) { - s_randombytes((unsigned char *)l_a, sizeof(l_a) * 2); + s_randombytes((unsigned char*)l_a, sizeof(l_a) * 2); s_test_overflow_diff_types(l_a, l_b); } char l_msg[100]; - sprintf(l_msg, "ADD SUB MUL %"DAP_UINT64_FORMAT_U" times", a_times); + snprintf(l_msg, sizeof(l_msg), "ADD SUB MUL %"DAP_UINT64_FORMAT_U" times", a_times); dap_assert(true, l_msg); - DAP_DELETE(l_a); } static void s_test_benchmark_overflow_one(uint64_t a_times, benchmark_callback a_custom_func, benchmark_callback a_builtin_func) { char l_msg[120] = {0}; int l_cur_1 = 0, l_cur_2 = 0, l_custom = 0, l_builtin = 0; - unsigned char - *l_chars_array_a = NULL, - *l_chars_array_b = NULL; - DAP_NEW_Z_SIZE_RET(l_chars_array_a, unsigned char, s_array_size, NULL); - DAP_NEW_Z_SIZE_RET(l_chars_array_b, unsigned char, s_array_size, l_chars_array_a); - + unsigned char l_chars_array_a[s_array_size + 1], l_chars_array_b[s_array_size + 1]; + l_chars_array_a[s_array_size] = l_chars_array_b[s_array_size] = '\0'; for (s_data_type t = 0; t < TYPE_COUNT; ++t) { // if (t == TYPE_CHAR || t == TYPE_INT || t == TYPE_LONG_LONG || t == TYPE_UCHAR || t == TYPE_ULONG_LONG) { l_custom = 0; @@ -1234,7 +1219,6 @@ static void s_test_benchmark_overflow_one(uint64_t a_times, benchmark_callback a benchmark_mgs_time(l_msg, l_builtin); // } } - DAP_DEL_MULTY(l_chars_array_a, l_chars_array_b); } static void s_test_benchmark_overflow(uint64_t a_times) diff --git a/crypto/include/dap_cert.h b/crypto/include/dap_cert.h index a2f7f0a7bc2005daff15a8a3b3b550cf0e443cf1..e2d12de38f89f77f00455ac9f5742ea9b458cf35 100755 --- a/crypto/include/dap_cert.h +++ b/crypto/include/dap_cert.h @@ -39,7 +39,7 @@ typedef enum dap_cert_metadata_type { DAP_CERT_META_DATETIME_PERIOD, DAP_CERT_META_SIGN, DAP_CERT_META_CUSTOM -} dap_cert_metadata_type_t; +} DAP_PACKED dap_cert_metadata_type_t; typedef struct dap_cert_metadata { const char *key; diff --git a/crypto/include/dap_enc_base58.h b/crypto/include/dap_enc_base58.h index 9a497d3cf61e5f1dc93231fd2c7c8945be0ba58f..308cf89d857cae803c5bd22bcd00ceb5ef04aab9 100755 --- a/crypto/include/dap_enc_base58.h +++ b/crypto/include/dap_enc_base58.h @@ -48,7 +48,12 @@ DAP_INLINE char *dap_enc_base58_encode_hash_to_str(dap_chain_hash_fast_t *a_in_h return dap_enc_base58_encode_to_str(a_in_hash->raw, sizeof(dap_chain_hash_fast_t)); } -const char *dap_enc_base58_encode_hash_to_str_static(const dap_chain_hash_fast_t *a_in_hash); +typedef union dap_enc_b58_hash_str { + const char s[ DAP_ENC_BASE58_ENCODE_SIZE(sizeof(dap_chain_hash_fast_t)) ]; +} dap_enc_b58_hash_str_t; + +dap_enc_b58_hash_str_t dap_enc_base58_encode_hash_to_str_static_(const dap_chain_hash_fast_t *a_in_hash); +#define dap_enc_base58_encode_hash_to_str_static(hash) dap_enc_base58_encode_hash_to_str_static_(hash).s // convert from "0xA21F1E865B6740A28E8708798ECF25D2C0AA596DF5EB1FD724186B6AD7FF2199" to "Bura1HFrKsqbdytEXQVrxpbovtvLhR1VbrJs65JBx3gc" char* dap_enc_base58_from_hex_str_to_str(const char *a_in_str); diff --git a/crypto/include/dap_enc_base64.h b/crypto/include/dap_enc_base64.h index 84bdca0a551c25269a42e94ad2bf20e613c783b3..2c167db5f206b486ec7e626d82f38d009c92a880 100755 --- a/crypto/include/dap_enc_base64.h +++ b/crypto/include/dap_enc_base64.h @@ -34,7 +34,8 @@ extern "C" { /* * Calculates encode size from input size */ -#define DAP_ENC_BASE64_ENCODE_SIZE(in_size) (size_t)(((4 * in_size / 3) + 3) & ~3) +#define DAP_ENC_BASE64_ENCODE_SIZE(in_size) (size_t)(((4 * (in_size) / 3) + 3) & ~3) +#define DAP_ENC_BASE64_DECODE_SIZE(in_size) (size_t)((in_size) * 3 / 4) size_t dap_enc_base64_decode(const char * in, size_t in_size, void * out, dap_enc_data_type_t standard); size_t dap_enc_base64_encode(const void * in, size_t in_size, char * out, dap_enc_data_type_t standard); diff --git a/crypto/include/dap_guuid.h b/crypto/include/dap_guuid.h index 93690960620db5b93c99b06957996a98864c6b6d..44cb53e08baab7b30ceb880366e1ff55d059a871 100644 --- a/crypto/include/dap_guuid.h +++ b/crypto/include/dap_guuid.h @@ -33,6 +33,10 @@ typedef union dap_guuid { uint128_t raw; } DAP_ALIGN_PACKED dap_guuid_t; +typedef union dap_guuid_str { + const char s[ 2 * sizeof(uint128_t) + 3 ]; +} dap_guuid_str_t; + static inline dap_guuid_t dap_guuid_new() { uint128_t l_ret = dap_uuid_generate_uint128(); @@ -43,5 +47,6 @@ DAP_STATIC_INLINE dap_guuid_t dap_guuid_compose(uint64_t a_net_id, uint64_t a_se { return (dap_guuid_t){ .net_id = a_net_id, .srv_id = a_service_id }; } -const char *dap_guuid_to_hex_str(dap_guuid_t a_guuid); +dap_guuid_str_t dap_guuid_to_hex_str_(dap_guuid_t a_guuid); +#define dap_guuid_to_hex_str(guid) dap_guuid_to_hex_str_(guid).s dap_guuid_t dap_guuid_from_hex_str(const char *a_hex_str, bool *success); diff --git a/crypto/src/dap_cert.c b/crypto/src/dap_cert.c index 9044414eea734c8d56c2a1514e1bacfa3199afe8..ac269286e4a826fe63ee13165a8d7a5ea13621df 100755 --- a/crypto/src/dap_cert.c +++ b/crypto/src/dap_cert.c @@ -80,7 +80,7 @@ int dap_cert_init() // TODO deinit too for (uint16_t i=0; i < l_ca_folders_size; i++) { dap_cert_add_folder(l_ca_folders[i]); } - dap_config_get_item_str_path_array_free(l_ca_folders, &l_ca_folders_size); + dap_config_get_item_str_path_array_free(l_ca_folders, l_ca_folders_size); return 0; } @@ -342,7 +342,7 @@ dap_cert_t *dap_cert_find_by_name(const char *a_cert_name) if (l_ret) break; } - dap_config_get_item_str_path_array_free(l_ca_folders, &l_ca_folders_size); + dap_config_get_item_str_path_array_free(l_ca_folders, l_ca_folders_size); } } if (!l_ret) @@ -368,37 +368,21 @@ dap_list_t *dap_cert_get_all_mem() */ dap_cert_t * dap_cert_new(const char * a_name) { - dap_cert_t * l_ret = DAP_NEW_Z(dap_cert_t); - if (!l_ret) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return NULL; - } - l_ret->_pvt = DAP_NEW_Z(dap_cert_pvt_t); - if(!l_ret->_pvt) { - log_it(L_ERROR, "Memory allocation error in %s, line %d", __PRETTY_FUNCTION__, __LINE__); - DAP_DELETE(l_ret); - return NULL; - } - snprintf(l_ret->name,sizeof(l_ret->name),"%s",a_name); + dap_cert_t *l_ret = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_cert_t, NULL); + l_ret->_pvt = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_cert_pvt_t, NULL, l_ret); + strncpy(l_ret->name, a_name, sizeof(l_ret->name) - 1); return l_ret; } int dap_cert_add(dap_cert_t *a_cert) { - if (!a_cert) - return -2; + dap_return_val_if_fail(a_cert, -1); dap_cert_item_t *l_cert_item = NULL; HASH_FIND_STR(s_certs, a_cert->name, l_cert_item); - if (l_cert_item) { - log_it(L_WARNING, "Certificate with name %s already present in memory", a_cert->name); - return -1; - } - l_cert_item = DAP_NEW_Z(dap_cert_item_t); - if (!l_cert_item) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return -2; - } - snprintf(l_cert_item->name, sizeof(l_cert_item->name), "%s", a_cert->name); + if (l_cert_item) + return log_it(L_WARNING, "Certificate with name %s already present in memory", a_cert->name), -2; + l_cert_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_cert_item_t, -3); + dap_strncpy(l_cert_item->name, a_cert->name, sizeof(l_cert_item->name) - 1); l_cert_item->cert = a_cert; HASH_ADD_STR(s_certs, name, l_cert_item); return 0; @@ -431,17 +415,14 @@ void dap_cert_delete(dap_cert_t * a_cert) static int s_make_cert_path(const char *a_cert_name, const char *a_folder_path, bool a_check_access, char *a_cert_path) { - size_t l_cert_path_length = strlen(a_cert_name) + strlen(a_folder_path) + strlen("/.dcert") + 1; - if (l_cert_path_length > MAX_PATH) { - log_it(L_ERROR, "Path size %zu exeeds maximum", l_cert_path_length); + int l_ret = snprintf(a_cert_path, MAX_PATH, "%s/%s.dcert", a_folder_path, a_cert_name); + if (l_ret < 0) { + *a_cert_path = '\0'; return -1; - } - snprintf(a_cert_path, l_cert_path_length, "%s/%s.dcert", a_folder_path, a_cert_name); - if (a_check_access && access(a_cert_path, F_OK) == -1) { - log_it (L_ERROR, "File %s does not exist", a_cert_path); - return -2; - } - return 0; + } else + return a_check_access && access(a_cert_path, F_OK) == -1 + ? ( log_it (L_ERROR, "File %s does not exist", a_cert_path), -2 ) + : 0; } /** @@ -453,15 +434,13 @@ static int s_make_cert_path(const char *a_cert_name, const char *a_folder_path, */ dap_cert_t *dap_cert_add_file(const char *a_cert_name, const char *a_folder_path) { - char l_cert_path[MAX_PATH]; - if (s_make_cert_path(a_cert_name, a_folder_path, true, l_cert_path)) - return NULL; - return dap_cert_file_load(l_cert_path); + char l_cert_path[MAX_PATH + 1]; + return s_make_cert_path(a_cert_name, a_folder_path, true, l_cert_path) ? NULL : dap_cert_file_load(l_cert_path); } int dap_cert_delete_file(const char *a_cert_name, const char *a_folder_path) { - char l_cert_path[MAX_PATH]; + char l_cert_path[MAX_PATH + 1]; int ret = s_make_cert_path(a_cert_name, a_folder_path, true, l_cert_path); return ret ? ret : remove(l_cert_path); } @@ -476,7 +455,7 @@ int dap_cert_delete_file(const char *a_cert_name, const char *a_folder_path) */ int dap_cert_save_to_folder(dap_cert_t *a_cert, const char *a_file_dir_path) { - char l_cert_path[MAX_PATH]; + char l_cert_path[MAX_PATH + 1]; int ret = s_make_cert_path(a_cert->name, a_file_dir_path, false, l_cert_path); return ret ? ret : dap_cert_file_save(a_cert, l_cert_path); } @@ -496,14 +475,11 @@ dap_pkey_t *dap_cert_to_pkey(dap_cert_t *a_cert) int dap_cert_get_pkey_hash(dap_cert_t *a_cert, dap_hash_fast_t *a_out_hash) { dap_return_val_if_fail(a_cert && a_cert->enc_key && a_cert->enc_key->pub_key_data && - a_cert->enc_key->pub_key_data_size && a_out_hash , -1); - size_t l_pub_key_size; + a_cert->enc_key->pub_key_data_size && a_out_hash, -1); + size_t l_pub_key_size = 0; uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(a_cert->enc_key, &l_pub_key_size); - if (!l_pub_key || !l_pub_key_size) - return -2; - dap_hash_fast(l_pub_key, l_pub_key_size, a_out_hash); - DAP_DELETE(l_pub_key); - return 0; + int l_ret = !dap_hash_fast(l_pub_key, l_pub_key_size, a_out_hash); + return DAP_DELETE(l_pub_key), l_ret; } /** @@ -661,17 +637,11 @@ dap_cert_metadata_t *dap_cert_new_meta(const char *a_key, dap_cert_metadata_type log_it(L_WARNING, "Incorrect arguments for dap_cert_new_meta()"); return NULL; } - size_t l_meta_item_size = sizeof(dap_cert_metadata_t) + a_value_size + strlen(a_key) + 1; - dap_cert_metadata_t *l_new_meta = DAP_NEW_SIZE(void, l_meta_item_size); - if(!l_new_meta) { - log_it(L_ERROR, "Memory allocation error in %s, line %d", __PRETTY_FUNCTION__, __LINE__); - return NULL; - } + size_t l_keylen = strlen(a_key), l_meta_item_size = sizeof(dap_cert_metadata_t) + a_value_size + l_keylen + 1; + dap_cert_metadata_t *l_new_meta = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_cert_metadata_t, l_meta_item_size, NULL); l_new_meta->length = a_value_size; l_new_meta->type = a_type; - memcpy((void *)l_new_meta->value, a_value, a_value_size); - dap_stpcpy((char *)&l_new_meta->value[a_value_size], a_key); - l_new_meta->key = (const char *)&l_new_meta->value[a_value_size]; + l_new_meta->key = dap_strncpy( (char*)dap_mempcpy(l_new_meta->value, a_value, a_value_size), a_key, l_keylen ); return l_new_meta; } @@ -686,12 +656,10 @@ dap_cert_metadata_t *dap_cert_new_meta(const char *a_key, dap_cert_metadata_type */ void dap_cert_add_meta(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_type_t a_type, void *a_value, size_t a_value_size) { - if (!a_cert) { - log_it(L_WARNING, "Certificate pointer to add metadata is NULL"); - return; - } + dap_return_if_fail(a_cert); dap_cert_metadata_t *l_new_meta = dap_cert_new_meta(a_key, a_type, a_value, a_value_size); - dap_binary_tree_t *l_new_root = dap_binary_tree_insert(a_cert->metadata, l_new_meta->key, (void *)l_new_meta); + dap_return_if_fail_err(l_new_meta, "Can't create metadata item"); + dap_binary_tree_t *l_new_root = dap_binary_tree_insert(a_cert->metadata, l_new_meta->key, l_new_meta); if (!a_cert->metadata) { a_cert->metadata = l_new_root; } @@ -708,40 +676,33 @@ void dap_cert_add_meta(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_ */ void dap_cert_add_meta_scalar(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_type_t a_type, uint64_t a_value, size_t a_value_size) { - void *l_value; - byte_t l_tmp8; - uint16_t l_tmp16; - uint32_t l_tmp32; - uint64_t l_tmp64; + void *l_value = NULL; + union { byte_t l_tmp8; uint16_t l_tmp16; uint32_t l_tmp32; uint64_t l_tmp64; } uval = { }; switch (a_type) { case DAP_CERT_META_STRING: case DAP_CERT_META_SIGN: case DAP_CERT_META_CUSTOM: - log_it(L_WARNING, "incoorect metadata type for dap_cert_add_meta_scalar()"); + log_it(L_WARNING, "Incorrect metadata type for dap_cert_add_meta_scalar()"); return; default: switch (a_value_size) { case 1: - l_tmp8 = a_value; - l_value = &l_tmp8; + uval.l_tmp8 = a_value; break; case 2: - l_tmp16 = a_value; - l_value = (void *)&l_tmp16; + uval.l_tmp16 = a_value; break; case 4: - l_tmp32 = a_value; - l_value = (void *)&l_tmp32; + uval.l_tmp32 = a_value; break; case 8: default: - l_tmp64 = a_value; - l_value = (void *)&l_tmp64; + uval.l_tmp64 = a_value; break; } break; } - dap_cert_add_meta(a_cert, a_key, a_type, l_value, a_value_size); + dap_cert_add_meta(a_cert, a_key, a_type, &uval, a_value_size); } /** @@ -941,8 +902,7 @@ dap_enc_key_t *dap_cert_get_keys_from_certs(dap_cert_t **a_certs, size_t a_count return dap_enc_key_dup(a_certs[0]->enc_key); // memory alloc size_t l_keys_count = 0; - dap_enc_key_t **l_keys = NULL; - DAP_NEW_Z_COUNT_RET_VAL(l_keys, dap_enc_key_t *, a_count, NULL, NULL); + dap_enc_key_t *l_keys[a_count]; // func work for(size_t i = a_key_start_index; i < a_count; ++i) { if (a_certs[i]) { @@ -952,9 +912,7 @@ dap_enc_key_t *dap_cert_get_keys_from_certs(dap_cert_t **a_certs, size_t a_count log_it(L_WARNING, "Certs with NULL value"); } } - dap_enc_key_t *l_ret = dap_enc_merge_keys_to_multisign_key(l_keys, l_keys_count); - DAP_DELETE(l_keys); - return l_ret; + return dap_enc_merge_keys_to_multisign_key(l_keys, l_keys_count); } DAP_INLINE const char *dap_cert_get_str_recommended_sign(){ diff --git a/crypto/src/dap_cert_file.c b/crypto/src/dap_cert_file.c index d13a96b954f888a92a28aab8f8a40fc562667364..aeaa0eab8cb81b1768a2c052570e729af3e2e37c 100755 --- a/crypto/src/dap_cert_file.c +++ b/crypto/src/dap_cert_file.c @@ -29,6 +29,7 @@ #include "dap_enc.h" #include "dap_enc_key.h" #include "dap_file_utils.h" +#include "dap_strfuncs.h" #include "dap_cert_file.h" #define LOG_TAG "dap_cert_file" @@ -44,33 +45,34 @@ static const char s_key_inheritor[] = "inheritor"; int dap_cert_file_save(dap_cert_t * a_cert, const char * a_cert_file_path) { char * l_file_dir = dap_path_get_dirname(a_cert_file_path); - dap_mkdir_with_parents(l_file_dir); + int l_err = dap_mkdir_with_parents(l_file_dir); DAP_DELETE(l_file_dir); - - FILE * l_file = fopen(a_cert_file_path,"wb"); - if( l_file ){ - uint32_t l_data_size = 0; - void * l_data = dap_cert_mem_save(a_cert, &l_data_size); - if ( l_data ){ - size_t l_retbytes; - if ( (l_retbytes = fwrite(l_data,1,l_data_size,l_file)) != l_data_size ){ - log_it(L_ERROR, "Can't write %u bytes on disk (processed only %zu)!", l_data_size,l_retbytes); - fclose(l_file); - return -3; - } - fclose(l_file); - DAP_DELETE(l_data); - return 0; - }else{ - log_it(L_ERROR,"Can't serialize certificate in memory"); - fclose(l_file); - remove(a_cert_file_path); - return -4; - } - }else{ - log_it(L_ERROR, "Can't open file '%s' for write: %s", a_cert_file_path, strerror(errno)); - return -2; + if ( l_err ) + return log_it(L_ERROR, "Can't create dir \"%s\"", a_cert_file_path), -1; + FILE *l_file = fopen(a_cert_file_path, "wb"); + if (!l_file) { +#ifdef DAP_OS_WINDOWS + l_err = GetLastError(); +#else + l_err = errno; +#endif + return log_it(L_ERROR, "Can't open file '%s' for write, error %d: \"%s\"", + a_cert_file_path, l_err, dap_strerror(l_err)), -2; + } + uint32_t l_data_size; + byte_t *l_data = dap_cert_mem_save(a_cert, &l_data_size); + if ( !l_data ) { + l_err = -3; + log_it(L_ERROR,"Can't serialize certificate in memory"); + } else if ( l_data_size -= fwrite(l_data, 1, l_data_size, l_file) ) { + l_err = -4; + log_it(L_ERROR, "Can't write cert to disk, unprocessed %u bytes", l_data_size); } + fclose(l_file); + DAP_DELETE(l_data); + if (l_err) + remove(a_cert_file_path); + return l_err; } // balance the binary tree @@ -105,36 +107,42 @@ void s_balance_the_tree(dap_cert_file_aux_t *a_reorder, size_t a_left_idx, size_ */ void dap_cert_deserialize_meta(dap_cert_t *a_cert, const uint8_t *a_data, size_t a_size) { - dap_cert_metadata_t **l_meta_arr = NULL; - size_t l_mem_shift = 0; - size_t l_meta_items_count = 0; - while (l_mem_shift < a_size) { - const char *l_key_str = (const char *)&a_data[l_mem_shift]; - if (!l_key_str) { + dap_cert_metadata_t **l_meta_arr = NULL, **l_newer_arr; + int l_err = 0, q = 0; + uint8_t *l_pos = (uint8_t*)a_data, *l_end = l_pos + a_size; + while (!l_err && l_pos < l_end) { + char *l_key_str = (char*)l_pos; + if (!( l_pos = memchr(l_pos, '\0', (size_t)(l_end - l_pos)) ) || ++l_pos == l_end) { + //l_pos = (uint8_t*)l_key_str; break; } - l_mem_shift += strlen(l_key_str) + 1; - uint32_t l_value_size = le32toh(a_data[l_mem_shift]); - l_mem_shift += sizeof(uint32_t); - dap_cert_metadata_type_t l_meta_type = (dap_cert_metadata_type_t)a_data[l_mem_shift++]; - const uint8_t *l_value = &a_data[l_mem_shift]; - uint16_t l_tmp16; - uint32_t l_tmp32; - uint64_t l_tmp64; - switch (l_meta_type) { + uint32_t l_value_size = le32toh(*l_pos); + if (l_pos + sizeof(uint32_t) + /* sizeof(dap_cert_metadata_type_t) */ + 1 + l_value_size > l_end) { + //l_pos = (uint8_t*)l_key_str; + break; + } + l_pos += sizeof(uint32_t); + dap_cert_metadata_type_t l_meta_type = *(dap_cert_metadata_type_t*)l_pos; + l_pos += /*sizeof(dap_cert_metadata_type_t)*/ 1; + union { uint16_t l_tmp16; uint32_t l_tmp32; uint64_t l_tmp64; } l_tmp = { }; + uint8_t *l_value = l_pos; + switch ( l_meta_type ) { case DAP_CERT_META_STRING: case DAP_CERT_META_SIGN: break; case DAP_CERT_META_CUSTOM: - if(!strcmp(l_key_str, s_key_inheritor)) { + if ( !strcmp(l_key_str, s_key_inheritor) ) { if (a_cert->enc_key->_inheritor) { log_it(L_DEBUG, "Few inheritor records in cert metadata"); + l_err = -2; + break; + } + if (!( a_cert->enc_key->_inheritor = DAP_DUP_SIZE(l_pos, l_value_size) )) { + l_err = -3; break; } - DAP_NEW_Z_SIZE_RET(a_cert->enc_key->_inheritor, byte_t, l_value_size, NULL); a_cert->enc_key->_inheritor_size = l_value_size; - a_cert->enc_key->_inheritor = DAP_DUP_SIZE(a_data + l_mem_shift, a_cert->enc_key->_inheritor_size); - l_mem_shift += l_value_size; + l_pos += l_value_size; continue; } break; @@ -143,45 +151,40 @@ void dap_cert_deserialize_meta(dap_cert_t *a_cert, const uint8_t *a_data, size_t case 1: break; case 2: - l_tmp16 = le16toh(*l_value); - l_value = (const uint8_t *)&l_tmp16; - break; + l_tmp.l_tmp16 = le16toh(*l_value); case 4: - l_tmp32 = le32toh(*l_value); - l_value = (const uint8_t *)&l_tmp32; + l_tmp.l_tmp32 = le32toh(*l_value); break; case 8: default: - l_tmp64 = le64toh(*l_value); - l_value = (const uint8_t *)&l_tmp64; + l_tmp.l_tmp64 = le64toh(*l_value); break; } + l_value = (uint8_t*)&l_tmp; break; } - dap_cert_metadata_t *l_new_meta = dap_cert_new_meta(l_key_str, l_meta_type, (void *)l_value, l_value_size); - if (l_meta_arr == NULL) { - l_meta_arr = DAP_NEW(dap_cert_metadata_t *); - if (!l_meta_arr) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return; - } - } else { - l_meta_arr = DAP_REALLOC_COUNT(l_meta_arr, l_meta_items_count + 1); - if (!l_meta_arr) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return; - } + if (l_err) { + //l_pos = (uint8_t*)l_key_str; + break; } - l_mem_shift += l_value_size; - l_meta_arr[l_meta_items_count++] = l_new_meta; + l_pos += l_value_size; + dap_cert_metadata_t *l_new_meta = dap_cert_new_meta(l_key_str, l_meta_type, l_value, l_value_size); + if ( !l_new_meta ) + break; + if (l_meta_arr) { + l_newer_arr = DAP_REALLOC_COUNT_RET_IF_FAIL(l_meta_arr, q + 1, l_meta_arr); + l_meta_arr = l_newer_arr; + } else + l_meta_arr = DAP_NEW_Z_RET_IF_FAIL(dap_cert_metadata_t*); + l_meta_arr[q++] = l_new_meta; } - if(l_meta_items_count){ - size_t l_reorder_arr[l_meta_items_count]; + if (q) { + size_t l_reorder_arr[q]; dap_cert_file_aux_t l_reorder = {l_reorder_arr, 0}; - s_balance_the_tree(&l_reorder, 0, l_meta_items_count - 1); + s_balance_the_tree(&l_reorder, 0, q - 1); size_t n = l_reorder_arr[0]; - a_cert->metadata = dap_binary_tree_insert(NULL, l_meta_arr[n]->key, (void *)l_meta_arr[n]); - for (size_t i = 1; i < l_meta_items_count; i++) { + a_cert->metadata = dap_binary_tree_insert(NULL, l_meta_arr[n]->key, (void*)l_meta_arr[n]); + for (int i = 1; i < q; ++i) { n = l_reorder_arr[i]; dap_binary_tree_insert(a_cert->metadata, l_meta_arr[n]->key, (void *)l_meta_arr[n]); } @@ -198,14 +201,11 @@ void dap_cert_deserialize_meta(dap_cert_t *a_cert, const uint8_t *a_data, size_t */ uint8_t *dap_cert_serialize_meta(dap_cert_t *a_cert, size_t *a_buflen_out) { - if (!a_cert) { - return NULL; - } - if ( a_cert->enc_key->_inheritor_size) { + dap_return_val_if_fail(a_cert, NULL); + if ( a_cert->enc_key->_inheritor_size) dap_cert_add_meta_custom(a_cert, s_key_inheritor, a_cert->enc_key->_inheritor, a_cert->enc_key->_inheritor_size); - } dap_list_t *l_meta_list = dap_binary_tree_inorder_list(a_cert->metadata); - if (!l_meta_list) { + if ( !l_meta_list ) { return NULL; } dap_list_t *l_meta_list_item = dap_list_first(l_meta_list); @@ -214,10 +214,14 @@ uint8_t *dap_cert_serialize_meta(dap_cert_t *a_cert, size_t *a_buflen_out) while (l_meta_list_item) { dap_cert_metadata_t *l_meta_item = l_meta_list_item->data; size_t l_meta_item_size = sizeof(uint32_t) + 1 + l_meta_item->length + strlen(l_meta_item->key) + 1; - if (l_buf) { - l_buf = DAP_REALLOC(l_buf, l_mem_shift + l_meta_item_size); + if (!l_buf) { + if (!( l_buf = DAP_NEW_Z_SIZE(uint8_t, l_meta_item_size) )) + return dap_list_free(l_meta_list), log_it(L_CRITICAL, "%s", "Insufficient memory"), NULL; } else { - l_buf = DAP_NEW_SIZE(uint8_t, l_meta_item_size); + uint8_t *l_new_buf = DAP_REALLOC(l_buf, l_mem_shift + l_meta_item_size); + if (!l_new_buf) + return DAP_DELETE(l_buf), dap_list_free(l_meta_list), log_it(L_CRITICAL, "%s", "Insufficient memory"), NULL; + l_buf = l_new_buf; } strcpy((char *)&l_buf[l_mem_shift], l_meta_item->key); l_mem_shift += strlen(l_meta_item->key) + 1; @@ -269,84 +273,32 @@ uint8_t *dap_cert_serialize_meta(dap_cert_t *a_cert, size_t *a_buflen_out) */ uint8_t* dap_cert_mem_save(dap_cert_t * a_cert, uint32_t *a_cert_size_out) { - dap_cert_file_hdr_t l_hdr={0}; - uint32_t l_data_offset = 0; - dap_enc_key_t * l_key = a_cert->enc_key; - uint8_t *l_data = NULL; - - size_t l_priv_key_data_size = a_cert->enc_key->priv_key_data_size; - size_t l_pub_key_data_size = a_cert->enc_key->pub_key_data_size; - size_t l_metadata_size = l_key->_inheritor_size; - uint8_t *l_pub_key_data = a_cert->enc_key->pub_key_data_size ? - dap_enc_key_serialize_pub_key(l_key, &l_pub_key_data_size) : - NULL; - uint8_t *l_priv_key_data = a_cert->enc_key->priv_key_data ? - dap_enc_key_serialize_priv_key(l_key, &l_priv_key_data_size) : - NULL; - - uint8_t *l_metadata = dap_cert_serialize_meta(a_cert, &l_metadata_size); - - l_hdr.sign = dap_cert_FILE_HDR_SIGN; - l_hdr.type = dap_cert_FILE_TYPE_PUBLIC; - if ( l_priv_key_data ){ - l_hdr.type = dap_cert_FILE_TYPE_PRIVATE; - //log_it(L_DEBUG,"Private key size %u",l_priv_key_data_size); - } - if (l_pub_key_data){ - //log_it(L_DEBUG,"Public key size %u",l_pub_key_data_size); - }else{ - log_it(L_ERROR,"No public or private key in certificate, nothing to save"); - goto lb_exit; - } - //log_it(L_DEBUG,"Key private data size %u",l_key->_inheritor_size); - - l_hdr.version = dap_cert_FILE_VERSION; - l_hdr.data_size = l_pub_key_data_size; - l_hdr.data_pvt_size = l_priv_key_data_size; - l_hdr.metadata_size = l_metadata_size; - - l_hdr.ts_last_used = l_key->last_used_timestamp; - l_hdr.sign_type = dap_sign_type_from_key_type ( l_key->type ); - - - l_data = DAP_NEW_SIZE(void, sizeof(l_hdr) + DAP_CERT_ITEM_NAME_MAX + l_priv_key_data_size + l_pub_key_data_size + l_metadata_size); - if (!l_data) { - log_it(L_ERROR,"Certificate \"%s\" was not serialized",a_cert->name); - goto lb_exit; - } - - memcpy(l_data +l_data_offset, &l_hdr ,sizeof(l_hdr) ); - l_data_offset += sizeof(l_hdr); - - memcpy(l_data +l_data_offset, a_cert->name, DAP_CERT_ITEM_NAME_MAX );//save cert name - l_data_offset += DAP_CERT_ITEM_NAME_MAX; - - memcpy(l_data +l_data_offset, l_pub_key_data ,l_pub_key_data_size ); - l_data_offset += l_pub_key_data_size; - - if ( l_priv_key_data_size && l_priv_key_data ) { - memcpy(l_data +l_data_offset, l_priv_key_data ,l_priv_key_data_size ); - l_data_offset += l_priv_key_data_size; - } - - if (l_metadata_size) { - memcpy(l_data + l_data_offset, l_metadata, l_metadata_size); - l_data_offset += l_metadata_size; - } -lb_exit: - DAP_DELETE(l_pub_key_data); - if ( l_priv_key_data_size ) { - DAP_DELETE(l_priv_key_data); - } - if ( l_metadata_size ) { - DAP_DELETE(l_metadata); - } - - //log_it(L_NOTICE,"Certificate \"%s\" successfully serialized",a_cert->name); - - if(a_cert_size_out) - *a_cert_size_out = l_data_offset; - return l_data; + dap_enc_key_t *l_key = a_cert->enc_key; + + uint64_t l_priv_key_data_size = a_cert->enc_key->priv_key_data_size, + l_pub_key_data_size = a_cert->enc_key->pub_key_data_size, + l_metadata_size = l_key->_inheritor_size; + + uint8_t *l_pub_key_data = dap_enc_key_serialize_pub_key(l_key, &l_pub_key_data_size), + *l_priv_key_data = dap_enc_key_serialize_priv_key(l_key, &l_priv_key_data_size), + *l_metadata = dap_cert_serialize_meta(a_cert, &l_metadata_size); + if (!l_pub_key_data && !l_priv_key_data) + return log_it(L_ERROR, "Neither pvt, nor pub key in certificate, nothing to do"), DAP_DELETE(l_metadata), NULL; + uint64_t l_total_size = sizeof(dap_cert_file_hdr_t) + DAP_CERT_ITEM_NAME_MAX + l_priv_key_data_size + l_pub_key_data_size + l_metadata_size; + + dap_cert_file_hdr_t l_hdr = { + .sign = dap_cert_FILE_HDR_SIGN, .version = dap_cert_FILE_VERSION, + .type = l_priv_key_data ? dap_cert_FILE_TYPE_PRIVATE : dap_cert_FILE_TYPE_PUBLIC, + .sign_type = dap_sign_type_from_key_type( l_key->type ), + .data_size = l_pub_key_data_size, .data_pvt_size = l_priv_key_data_size, .metadata_size = l_metadata_size, + .ts_last_used = l_key->last_used_timestamp + }; + uint8_t *l_data = DAP_VA_SERIALIZE_NEW(l_total_size, &l_hdr, (uint64_t)sizeof(l_hdr), a_cert->name, (uint64_t)sizeof(a_cert->name), + l_pub_key_data, l_pub_key_data_size, l_priv_key_data, l_priv_key_data_size, + l_metadata, l_metadata_size ); + if (a_cert_size_out) + *a_cert_size_out = l_data ? l_total_size : 0; + return DAP_DEL_MULTY(l_pub_key_data, l_priv_key_data, l_metadata), l_data; } /** @@ -357,27 +309,32 @@ lb_exit: dap_cert_t* dap_cert_file_load(const char * a_cert_file_path) { dap_cert_t * l_ret = NULL; - FILE * l_file = fopen(a_cert_file_path,"rb"); - - if( l_file ){ - fseek(l_file, 0L, SEEK_END); - uint64_t l_file_size = ftell(l_file); - rewind(l_file); - uint8_t * l_data = DAP_NEW_SIZE(uint8_t,l_file_size); - if ( fread(l_data,1,l_file_size,l_file ) != l_file_size ){ - log_it(L_ERROR, "Can't read %"DAP_UINT64_FORMAT_U" bytes from the disk!", l_file_size); - DAP_DELETE (l_data); - goto lb_exit; - }else{ - l_ret = dap_cert_mem_load(l_data,l_file_size); - if (l_ret) - dap_cert_add(l_ret); - } - DAP_DELETE(l_data); + int l_err = 0; + FILE *l_file = fopen(a_cert_file_path, "rb"); + if ( !l_file ) { +#ifdef DAP_OS_WINDOWS + l_err = GetLastError(); +#else + l_err = errno; +#endif + return log_it(L_ERROR, "Can't open cert file '%s', error %d: \"%s\"", a_cert_file_path, l_err, dap_strerror(l_err)), NULL; } -lb_exit: - if( l_file ) - fclose(l_file); + fseeko(l_file, 0L, SEEK_END); + size_t l_file_size = ftello(l_file); + rewind(l_file); + byte_t *l_data = DAP_NEW_Z_SIZE(byte_t, l_file_size); + if ( fread(l_data, 1, l_file_size, l_file) != l_file_size ) { + l_err = -1; + log_it(L_ERROR, "Can't read %"DAP_UINT64_FORMAT_U" bytes from the disk!", l_file_size); + } else if (!( l_ret = dap_cert_mem_load(l_data, l_file_size) )) { + log_it(L_ERROR, "Can't load cert from file"); + l_err = -2; + } else + dap_cert_add( l_ret ); + fclose(l_file); + DAP_DELETE(l_data); + if (l_err) + DAP_DEL_Z(l_ret); return l_ret; } @@ -389,67 +346,51 @@ lb_exit: * @param a_data_size - size of certificate * @return dap_cert_t* */ -dap_cert_t* dap_cert_mem_load(const void * a_data, size_t a_data_size) +dap_cert_t* dap_cert_mem_load(const void *a_data, size_t a_data_size) { - if (!a_data) - return NULL; - dap_cert_t * l_ret = NULL; - const uint8_t * l_data = (const uint8_t *) a_data; - uint32_t l_data_offset = 0; + dap_return_val_if_fail_err(!!a_data, NULL, "No data provided to load cert from"); + dap_return_val_if_fail_err(a_data_size > sizeof(dap_cert_file_hdr_t), NULL, "Inconsistent cert data"); + dap_cert_t *l_ret = NULL; + const uint8_t *l_data = (const uint8_t*)a_data; dap_cert_file_hdr_t l_hdr = *(dap_cert_file_hdr_t*)l_data; - l_data_offset += sizeof(l_hdr); - if (l_hdr.sign != dap_cert_FILE_HDR_SIGN ){ - log_it(L_ERROR, "Wrong cert signature, corrupted header!"); - goto l_exit; + l_data += sizeof(l_hdr); + if ( l_hdr.sign != dap_cert_FILE_HDR_SIGN ) + return log_it(L_ERROR, "Wrong cert signature, corrupted header!"), NULL; + else if ( l_hdr.version < 1 ) + return log_it(L_ERROR, "Unrecognizable certificate version, corrupted file or your software is deprecated"), NULL; + debug_if( dap_enc_debug_more(), L_DEBUG,"sizeof(l_hdr)=%zu " + "l_hdr.data_pvt_size=%"DAP_UINT64_FORMAT_U" " + "l_hdr.data_size=%"DAP_UINT64_FORMAT_U" " + "l_hdr.metadata_size=%"DAP_UINT64_FORMAT_U" " + "a_data_size=%zu ", + sizeof(l_hdr), l_hdr.data_pvt_size, l_hdr.data_size, + l_hdr.metadata_size, a_data_size ); + size_t l_size_req = sizeof(l_hdr) + DAP_CERT_ITEM_NAME_MAX + l_hdr.data_size + l_hdr.data_pvt_size + l_hdr.metadata_size; + + if ( l_size_req > a_data_size ) + return log_it(L_ERROR, "Cert data size exeeds file size, %zu > %zu", l_size_req, a_data_size), NULL; + + char l_name[DAP_CERT_ITEM_NAME_MAX]; + dap_strncpy(l_name, (const char*)l_data, DAP_CERT_ITEM_NAME_MAX - 1); + l_data += DAP_CERT_ITEM_NAME_MAX; + if (!( l_ret = dap_cert_new(l_name) )) + return log_it(L_ERROR, "Can't create cert '%s'", l_name), NULL; + else if (!( l_ret->enc_key = dap_enc_key_new(dap_sign_type_to_key_type(l_hdr.sign_type)) )) + return log_it(L_ERROR, "Can't init new key with sign type %s", + dap_sign_type_to_str(l_hdr.sign_type)), + dap_cert_delete(l_ret), NULL; + l_ret->enc_key->last_used_timestamp = l_hdr.ts_last_used; + + if ( l_hdr.data_size ) { + dap_enc_key_deserialize_pub_key(l_ret->enc_key, l_data, l_hdr.data_size); + l_data += l_hdr.data_size; } - if (l_hdr.version >= 1 ){ - if (dap_enc_debug_more()) { - log_it(L_DEBUG,"sizeof(l_hdr)=%zu " - "l_hdr.data_pvt_size=%"DAP_UINT64_FORMAT_U" " - "l_hdr.data_size=%"DAP_UINT64_FORMAT_U" " - "l_hdr.metadata_size=%"DAP_UINT64_FORMAT_U" " - "a_data_size=%zu ", - sizeof(l_hdr), l_hdr.data_pvt_size, l_hdr.data_size, l_hdr.metadata_size, a_data_size); - } - if ( (sizeof(l_hdr) + l_hdr.data_size+l_hdr.data_pvt_size +l_hdr.metadata_size) > a_data_size ){ - log_it(L_ERROR,"Corrupted cert data, data sections size is smaller than exists on the disk! (%"DAP_UINT64_FORMAT_U" expected, %zu on disk)", - sizeof(l_hdr)+l_hdr.data_pvt_size+l_hdr.data_size+l_hdr.metadata_size, a_data_size); - goto l_exit; - } - - char l_name[DAP_CERT_ITEM_NAME_MAX]; - memcpy(l_name, l_data +l_data_offset, DAP_CERT_ITEM_NAME_MAX );//save cert name - l_data_offset += DAP_CERT_ITEM_NAME_MAX; - - //l_ret = DAP_NEW_Z(dap_cert_t); - l_ret = dap_cert_new(l_name); - l_ret->enc_key = dap_enc_key_new( dap_sign_type_to_key_type( l_hdr.sign_type )); - if(l_ret->enc_key == NULL){ - log_it(L_ERROR,"Can't init new private key with sign type %s", dap_sign_type_to_str(l_hdr.sign_type)); - dap_cert_delete(l_ret); - l_ret = NULL; - goto l_exit; - } - - l_ret->enc_key->last_used_timestamp = l_hdr.ts_last_used; - - if ( l_hdr.data_size > 0 ){ - dap_enc_key_deserialize_pub_key(l_ret->enc_key, l_data + l_data_offset, l_hdr.data_size); - l_data_offset += l_hdr.data_size; - } - if ( l_hdr.data_pvt_size > 0 ){ - dap_enc_key_deserialize_priv_key(l_ret->enc_key, l_data + l_data_offset, l_hdr.data_pvt_size); - l_data_offset += l_hdr.data_pvt_size; - } - if ( l_hdr.metadata_size > 0 ){ - dap_cert_deserialize_meta(l_ret, l_data + l_data_offset, l_hdr.metadata_size); - l_data_offset += l_hdr.metadata_size; - } - dap_enc_key_update(l_ret->enc_key); - //log_it(L_NOTICE,"Successfully loaded certificate %s", l_ret->name); - }else - log_it(L_ERROR,"Unrecognizable certificate version, corrupted file or you have too old software"); - -l_exit: + if ( l_hdr.data_pvt_size ) { + dap_enc_key_deserialize_priv_key(l_ret->enc_key, l_data, l_hdr.data_pvt_size); + l_data += l_hdr.data_pvt_size; + } + if ( l_hdr.metadata_size ) + dap_cert_deserialize_meta(l_ret, l_data, l_hdr.metadata_size); + dap_enc_key_update(l_ret->enc_key); return l_ret; } diff --git a/crypto/src/dap_enc.c b/crypto/src/dap_enc.c index e630662f9ea3719896530198995276213f2b7633..2d0b83c0d44a9626e1c52e3c28cfd4afd83db4e5 100755 --- a/crypto/src/dap_enc.c +++ b/crypto/src/dap_enc.c @@ -78,15 +78,8 @@ bool dap_enc_debug_more() */ size_t dap_enc_code_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, dap_enc_data_type_t type) { - size_t raw_encode_data_size = dap_enc_key_get_enc_size(a_key->type, a_buf_in_size); - if(raw_encode_data_size == 0) { - log_it(L_ERROR, "dap_enc_key_get_enc_size return 0"); - return 0; - } - if(type != DAP_ENC_DATA_TYPE_RAW) { - return (size_t)DAP_ENC_BASE64_ENCODE_SIZE(raw_encode_data_size); - } - return raw_encode_data_size; + size_t l_size = dap_enc_key_get_enc_size(a_key->type, a_buf_in_size); + return type == DAP_ENC_DATA_TYPE_RAW ? l_size : DAP_ENC_BASE64_ENCODE_SIZE(l_size); } /** @@ -97,22 +90,12 @@ size_t dap_enc_code_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, d */ size_t dap_enc_decode_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, dap_enc_data_type_t type) { - size_t raw_decode_data_size = dap_enc_key_get_dec_size(a_key->type, a_buf_in_size); - if(raw_decode_data_size == 0) { - log_it(L_ERROR, "dap_enc_key_get_enc_size return 0"); - return 0; - } - - if(type != DAP_ENC_DATA_TYPE_RAW) { - return (size_t)DAP_ENC_BASE64_ENCODE_SIZE(raw_decode_data_size); - } - return raw_decode_data_size; + size_t l_size = type == DAP_ENC_DATA_TYPE_RAW ? a_buf_in_size : DAP_ENC_BASE64_DECODE_SIZE(a_buf_in_size); + return l_size ? dap_enc_key_get_dec_size(a_key->type, l_size) : 0; } - - /** - * @brief dap_enc_code Encode data with key + * @brief Encode data with key * @param a_key Private key * @param a_buf Input buffer * @param a_buf_size Input buffer size @@ -120,44 +103,35 @@ size_t dap_enc_decode_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, * @param a_buf_out_size_max * @return bytes actualy written in the output buffer */ -size_t dap_enc_code(dap_enc_key_t *a_key,const void * a_buf_in,const size_t a_buf_size, - void * a_buf_out, const size_t a_buf_out_size_max, dap_enc_data_type_t a_data_type_out) +size_t dap_enc_code(dap_enc_key_t *a_key, + const void *a_buf_in, const size_t a_buf_size, + void *a_buf_out, const size_t a_buf_out_size_max, + dap_enc_data_type_t a_data_type_out) { - if(!a_key) { - log_it(L_ERROR, "key in dap_enc_code() is NULL"); - return 0; - } - if(a_key->enc_na) { - if(a_data_type_out == DAP_ENC_DATA_TYPE_RAW) { - return a_key->enc_na(a_key, a_buf_in, a_buf_size, a_buf_out, a_buf_out_size_max); - }else{ - void *l_proc_buf; - l_proc_buf = DAP_NEW_SIZE (void, a_buf_out_size_max ); - size_t l_proc_buf_size = a_key->enc_na(a_key, a_buf_in, a_buf_size, l_proc_buf,a_buf_out_size_max); - if(a_data_type_out == DAP_ENC_DATA_TYPE_B64 || a_data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE) { - if(DAP_ENC_BASE64_ENCODE_SIZE(l_proc_buf_size) <= a_buf_out_size_max) { - size_t l_buf_out_size=dap_enc_base64_encode(l_proc_buf, l_proc_buf_size, a_buf_out, a_data_type_out); - DAP_DELETE(l_proc_buf); - return l_buf_out_size; - } else { - DAP_DELETE(l_proc_buf); - log_it(L_ERROR, "a_buf_out_size_max less than result size"); - return 0; - } - } else { - log_it(L_ERROR, "Unknown dap_enc_data_type"); - DAP_DELETE(l_proc_buf); - return 0; - } - } - } else { - log_it(L_ERROR, "key->enc_na is NULL"); - return 0; + dap_return_val_if_fail_err(a_key && a_key->enc_na && a_buf_in && a_buf_out, 0, "Invalid params"); + size_t l_ret = dap_enc_code_out_size(a_key, a_buf_size, a_data_type_out); + if ( !l_ret || l_ret > a_buf_out_size_max ) + return log_it(L_ERROR, "Insufficient out buffer size: %zu < %zu", a_buf_out_size_max, l_ret), 0; + switch ( a_data_type_out ) { + case DAP_ENC_DATA_TYPE_RAW: + l_ret = a_key->enc_na(a_key, a_buf_in, a_buf_size, a_buf_out, a_buf_out_size_max); + break; + case DAP_ENC_DATA_TYPE_B64: + case DAP_ENC_DATA_TYPE_B64_URLSAFE: { + char *l_tmp_buf = DAP_NEW_Z_SIZE(char, l_ret); + size_t l_tmp_size = a_key->enc_na(a_key, a_buf_in, a_buf_size, l_tmp_buf, l_ret); + l_ret = dap_enc_base64_encode(l_tmp_buf, l_tmp_size, a_buf_out, a_data_type_out); + DAP_DELETE(l_tmp_buf); + } break; + default: + log_it(L_ERROR, "Unknown enc type %d", (int)a_data_type_out); + l_ret = 0; } + return l_ret; } /** - * @brief dap_enc_decode Decode data with key + * @brief Decode data with key * @param key_public Public key * @param buf Input buffer * @param buf_size Input buffer size @@ -165,39 +139,29 @@ size_t dap_enc_code(dap_enc_key_t *a_key,const void * a_buf_in,const size_t a_bu * @param buf_out_max Maximum size of output buffer * @return bytes actualy written in the output buffer */ -size_t dap_enc_decode(dap_enc_key_t *a_key,const void * a_buf_in, const size_t a_buf_in_size, - void * a_buf_out, const size_t a_buf_out_size_max, dap_enc_data_type_t a_data_type_in) +size_t dap_enc_decode(dap_enc_key_t *a_key, + const void *a_buf_in, const size_t a_buf_in_size, + void *a_buf_out, const size_t a_buf_out_size_max, + dap_enc_data_type_t a_data_type_in) { - void *l_proc_buf = NULL; - const void *l_proc_buf_const = NULL; - size_t l_proc_buf_size = 0; - switch(a_data_type_in){ - case DAP_ENC_DATA_TYPE_B64: - case DAP_ENC_DATA_TYPE_B64_URLSAFE: - l_proc_buf=DAP_NEW_SIZE(void,DAP_ENC_BASE64_ENCODE_SIZE(a_buf_in_size)); - l_proc_buf_size= dap_enc_base64_decode((const char*) a_buf_in,a_buf_in_size,l_proc_buf,a_data_type_in); - l_proc_buf_const=l_proc_buf; + dap_return_val_if_fail_err(a_key && a_key->enc_na && a_buf_in && a_buf_out, 0, "Invalid params"); + size_t l_ret = dap_enc_decode_out_size(a_key, a_buf_in_size, a_data_type_in); + if ( !l_ret || l_ret > a_buf_out_size_max ) + return log_it(L_ERROR, "Insufficient out buffer size: %zu < %zu", a_buf_out_size_max, l_ret), 0; + switch ( a_data_type_in ) { + case DAP_ENC_DATA_TYPE_RAW: + l_ret = a_key->dec_na(a_key, a_buf_in, a_buf_in_size, a_buf_out, a_buf_out_size_max); break; - case DAP_ENC_DATA_TYPE_RAW:{ - l_proc_buf_const=a_buf_in; - l_proc_buf_size=a_buf_in_size; - }break; - } - - if(a_key->dec_na) { - if(l_proc_buf_size == 0) { - log_it(L_ERROR, "Buf is null. dap_enc_base64_decode is failed"); - return 0; - } - size_t ret = a_key->dec_na(a_key,l_proc_buf_const,l_proc_buf_size, a_buf_out,a_buf_out_size_max); - - if(a_data_type_in==DAP_ENC_DATA_TYPE_B64 || a_data_type_in == DAP_ENC_DATA_TYPE_B64_URLSAFE) - free(l_proc_buf); - return ret; - } else { - log_it(L_WARNING, "key->dec_na is NULL"); - if(l_proc_buf_size) - free(l_proc_buf); - return 0; + case DAP_ENC_DATA_TYPE_B64: + case DAP_ENC_DATA_TYPE_B64_URLSAFE: { + char *l_tmp_buf = DAP_NEW_Z_SIZE(char, DAP_ENC_BASE64_DECODE_SIZE(a_buf_in_size)); + size_t l_tmp_size = dap_enc_base64_decode(a_buf_in, a_buf_in_size, l_tmp_buf, a_data_type_in); + l_ret = a_key->dec_na(a_key, l_tmp_buf, l_tmp_size, a_buf_out, a_buf_out_size_max); + DAP_DELETE(l_tmp_buf); + } break; + default: + log_it(L_ERROR, "Unknown enc type %d", (int)a_data_type_in); + l_ret = 0; } + return l_ret; } diff --git a/crypto/src/dap_enc_base58.c b/crypto/src/dap_enc_base58.c index a8b5b5141d191a30bcfe1fb13dad19a3af68568c..8d99ab69ec6bc234dfd138af85547901cb073297 100755 --- a/crypto/src/dap_enc_base58.c +++ b/crypto/src/dap_enc_base58.c @@ -250,8 +250,8 @@ char* dap_enc_base58_to_hex_str_from_str(const char *a_in_str) return l_out_str; } -const char *dap_enc_base58_encode_hash_to_str_static(const dap_chain_hash_fast_t *a_in_hash) +dap_enc_b58_hash_str_t dap_enc_base58_encode_hash_to_str_static_(const dap_chain_hash_fast_t *a_in_hash) { - _Thread_local static char s_buf[DAP_ENC_BASE58_ENCODE_SIZE(sizeof(dap_chain_hash_fast_t))] = { '\0' }; - return dap_enc_base58_encode(a_in_hash, sizeof(dap_chain_hash_fast_t), s_buf) ? s_buf : NULL; + dap_enc_b58_hash_str_t l_ret = { }; + return dap_enc_base58_encode(a_in_hash, sizeof(dap_chain_hash_fast_t), (char*)&l_ret), l_ret; } diff --git a/crypto/src/dap_enc_base64.c b/crypto/src/dap_enc_base64.c index 025adafb4ad7bebc4c183a79643b02090d949716..dc3471edd8948206018f31da409e6f4593bcb2cd 100755 --- a/crypto/src/dap_enc_base64.c +++ b/crypto/src/dap_enc_base64.c @@ -284,20 +284,14 @@ char *dap_enc_strdup_to_base64(const char * a_string){ } char * dap_enc_strdup_from_base64(const char * a_string_base64){ - if(!a_string_base64) + if(!a_string_base64 || !*a_string_base64) return NULL; - - size_t l_string_base64_len = strlen(a_string_base64); - if(!l_string_base64_len) + size_t l_string_base64_len = strlen(a_string_base64), l_decoded_len = DAP_ENC_BASE64_DECODE_SIZE(l_string_base64_len); + if(!l_decoded_len) return NULL; - char * l_string = DAP_NEW_Z_SIZE(char, l_string_base64_len * 2); - size_t l_string_len = dap_enc_base64_decode(a_string_base64, l_string_base64_len, l_string, DAP_ENC_DATA_TYPE_B64_URLSAFE); - - if(!l_string_len){ - DAP_DELETE(l_string); - return NULL; - } + char * l_string = DAP_NEW_Z_SIZE(char, l_decoded_len + 1); + l_decoded_len = dap_enc_base64_decode(a_string_base64, l_string_base64_len, l_string, DAP_ENC_DATA_TYPE_B64_URLSAFE); return l_string; } diff --git a/crypto/src/dap_enc_bliss.c b/crypto/src/dap_enc_bliss.c index a5a95f615814add2bdf3d5697f1c5a1e2ef60c27..964bf1b489e0b1665cf1dd3118be7b4f73ed20fd 100755 --- a/crypto/src/dap_enc_bliss.c +++ b/crypto/src/dap_enc_bliss.c @@ -154,12 +154,12 @@ uint8_t *dap_enc_sig_bliss_write_signature(const void *a_sign, size_t *a_buflen_ // func work uint64_t l_buflen = dap_enc_sig_bliss_ser_sig_size(a_sign); uint32_t l_kind = l_sign->kind; - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 10, - &l_buflen, (uint64_t)sizeof(uint64_t), - &l_kind, (uint64_t)sizeof(uint32_t), + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, + &l_buflen, (uint64_t)sizeof(uint64_t), + &l_kind, (uint64_t)sizeof(uint32_t), l_sign->z1, (uint64_t)(p.n * sizeof(int32_t)), l_sign->z2, (uint64_t)(p.n * sizeof(int32_t)), - l_sign->c, (uint64_t)(p.kappa * sizeof(int32_t)) + l_sign->c, (uint64_t)(p.kappa * sizeof(int32_t)) ); // out work (a_buflen_out && l_buf) ? *a_buflen_out = (size_t)l_buflen : 0; @@ -210,7 +210,7 @@ uint8_t *dap_enc_sig_bliss_write_private_key(const void *a_private_key, size_t * // func work uint64_t l_buflen = dap_enc_sig_bliss_ser_private_key_size(a_private_key); uint32_t l_kind = l_private_key->kind; - uint8_t *l_buf = dap_serialize_multy( NULL, l_buflen, 10, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), l_private_key->s1, (uint64_t)(p.n * sizeof(int32_t)), @@ -233,7 +233,7 @@ uint8_t *dap_enc_sig_bliss_write_public_key(const void *a_public_key, size_t *a_ // func work uint64_t l_buflen = dap_enc_sig_bliss_ser_public_key_size(a_public_key); uint32_t l_kind = l_public_key->kind; - uint8_t *l_buf = dap_serialize_multy( NULL, l_buflen, 6, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), l_public_key->a, p.n * (uint64_t)sizeof(int32_t) diff --git a/crypto/src/dap_enc_dilithium.c b/crypto/src/dap_enc_dilithium.c index 87a1ef2c47822e36e52719dabf5adf7adc16bcc9..c80b3805f5fc90a090ae4cc56cf02f60a555a521 100755 --- a/crypto/src/dap_enc_dilithium.c +++ b/crypto/src/dap_enc_dilithium.c @@ -108,7 +108,7 @@ uint8_t *dap_enc_sig_dilithium_write_signature(const void *a_sign, size_t *a_buf dilithium_signature_t *l_sign = (dilithium_signature_t *)a_sign; // func work uint64_t l_buflen = dap_enc_sig_dilithium_ser_sig_size(l_sign); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 8, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_sign->kind, (uint64_t)sizeof(uint32_t), &l_sign->sig_len, (uint64_t)sizeof(uint64_t), @@ -192,7 +192,7 @@ uint8_t *dap_enc_sig_dilithium_write_private_key(const void *a_private_key, size dap_return_val_if_pass(!l_private_key || !dilithium_params_init(&p, l_private_key->kind), NULL); // func work uint64_t l_buflen = dap_enc_sig_dilithium_ser_private_key_size(a_private_key); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 6, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_private_key->kind, (uint64_t)sizeof(uint32_t), l_private_key->data, (uint64_t)p.CRYPTO_SECRETKEYBYTES); @@ -211,7 +211,7 @@ uint8_t *dap_enc_sig_dilithium_write_public_key(const void *a_public_key, size_t dap_return_val_if_pass(!l_public_key || !dilithium_params_init(&p, l_public_key->kind), NULL); // func work uint64_t l_buflen = dap_enc_sig_dilithium_ser_public_key_size(a_public_key); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 6, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_public_key->kind, (uint64_t)sizeof(uint32_t), l_public_key->data, (uint64_t)p.CRYPTO_PUBLICKEYBYTES); diff --git a/crypto/src/dap_enc_ecdsa.c b/crypto/src/dap_enc_ecdsa.c index 4892b24354299608d07f730acedaa3780797ee70..a6ebc9504091a4dafc40793f3f6d08a37413b1d1 100644 --- a/crypto/src/dap_enc_ecdsa.c +++ b/crypto/src/dap_enc_ecdsa.c @@ -77,8 +77,8 @@ void dap_enc_sig_ecdsa_key_new_generate(dap_enc_key_t *a_key, UNUSED_ARG const v // sanity check dap_return_if_pass(!a_key); // memory alloc - DAP_NEW_Z_RET(a_key->priv_key_data, ecdsa_private_key_t, NULL); - DAP_NEW_Z_RET(a_key->pub_key_data, ecdsa_public_key_t, a_key->priv_key_data); + a_key->priv_key_data = DAP_NEW_Z_RET_IF_FAIL(ecdsa_private_key_t); + a_key->pub_key_data = DAP_NEW_Z_RET_IF_FAIL(ecdsa_public_key_t, a_key->priv_key_data); ecdsa_context_t *l_ctx = s_context_create(); if (!l_ctx) { log_it(L_ERROR, "Error creating ECDSA context in generating key pair"); @@ -157,8 +157,7 @@ int dap_enc_sig_ecdsa_verify_sign(struct dap_enc_key *l_key, const void *a_msg, uint8_t *dap_enc_sig_ecdsa_write_public_key(const void *a_public_key, size_t *a_buflen_out) { dap_return_val_if_pass(!a_public_key, NULL); - byte_t *l_buf = NULL; - DAP_NEW_Z_SIZE_RET_VAL(l_buf, byte_t, ECDSA_PKEY_SERIALIZED_SIZE, NULL, NULL); + byte_t *l_buf = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(byte_t, ECDSA_PKEY_SERIALIZED_SIZE, NULL); ecdsa_context_t *l_ctx = s_context_create(); @@ -182,12 +181,11 @@ void *dap_enc_sig_ecdsa_read_public_key(const uint8_t* a_buf, size_t a_buflen) { // sanity check dap_return_val_if_pass(!a_buf || a_buflen != ECDSA_PKEY_SERIALIZED_SIZE, NULL); // memory alloc - ecdsa_public_key_t *l_public_key = NULL; - DAP_NEW_Z_RET_VAL(l_public_key, ecdsa_public_key_t, NULL, NULL); + ecdsa_public_key_t *l_public_key = DAP_NEW_Z_RET_VAL_IF_FAIL(ecdsa_public_key_t, NULL); ecdsa_context_t *l_ctx = s_context_create(); if (!l_ctx || secp256k1_ec_pubkey_parse(l_ctx, l_public_key, a_buf, a_buflen ) != 1) { log_it(L_CRITICAL, "Failed to deserialize pkey"); - DAP_DEL_Z(l_public_key); + DAP_DELETE(l_public_key); } return l_public_key; } @@ -195,8 +193,7 @@ void *dap_enc_sig_ecdsa_read_public_key(const uint8_t* a_buf, size_t a_buflen) { uint8_t *dap_enc_sig_ecdsa_write_signature(const void *a_sign, size_t *a_sign_len) { dap_return_val_if_pass(!a_sign || !a_sign_len, NULL); - byte_t *l_ret = NULL; - DAP_NEW_Z_SIZE_RET_VAL(l_ret, byte_t, sizeof(ecdsa_signature_t), NULL, NULL); + byte_t *l_ret = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(byte_t, sizeof(ecdsa_signature_t), NULL); ecdsa_context_t *l_ctx = s_context_create(); if (!l_ctx || secp256k1_ecdsa_signature_serialize_compact(l_ctx, l_ret, (const ecdsa_signature_t*)a_sign) != 1) { log_it(L_ERROR, "Failed to serialize sign"); @@ -208,9 +205,7 @@ uint8_t *dap_enc_sig_ecdsa_write_signature(const void *a_sign, size_t *a_sign_le void *dap_enc_sig_ecdsa_read_signature(const uint8_t *a_buf, size_t a_buflen) { dap_return_val_if_pass(!a_buf || a_buflen != sizeof(ecdsa_signature_t), NULL); - ecdsa_signature_t *l_ret = NULL; - DAP_NEW_Z_RET_VAL(l_ret, ecdsa_signature_t, NULL, NULL); - + ecdsa_signature_t *l_ret = DAP_NEW_Z_RET_VAL_IF_FAIL(ecdsa_signature_t, NULL); ecdsa_context_t *l_ctx = s_context_create(); if (!l_ctx || secp256k1_ecdsa_signature_parse_compact(l_ctx, l_ret, a_buf) != 1) { log_it(L_ERROR, "Failed to deserialize sign"); diff --git a/crypto/src/dap_enc_falcon.c b/crypto/src/dap_enc_falcon.c index 3c2c28141f3f51a30a34acca3e4f736da5f53ece..51749aeee7b07f07cf96c9be025286acbfb02e6c 100644 --- a/crypto/src/dap_enc_falcon.c +++ b/crypto/src/dap_enc_falcon.c @@ -85,10 +85,10 @@ void dap_enc_sig_falcon_key_new_generate(dap_enc_key_t *a_key, const void *kex_b a_key->pub_key_data_size = sizeof(falcon_public_key_t); a_key->priv_key_data_size = sizeof(falcon_private_key_t); - DAP_NEW_Z_SIZE_RET(l_skey, falcon_private_key_t, a_key->priv_key_data_size, NULL); - DAP_NEW_Z_SIZE_RET(l_pkey, falcon_public_key_t, a_key->pub_key_data_size, l_skey); - DAP_NEW_Z_SIZE_RET(l_skey->data, uint8_t, FALCON_PRIVKEY_SIZE(l_logn), l_skey, l_pkey); - DAP_NEW_Z_SIZE_RET(l_pkey->data, uint8_t, FALCON_PUBKEY_SIZE(l_logn), l_skey->data, l_skey, l_pkey); + l_skey = DAP_NEW_Z_SIZE_RET_IF_FAIL(falcon_private_key_t, a_key->priv_key_data_size); + l_pkey = DAP_NEW_Z_SIZE_RET_IF_FAIL(falcon_public_key_t, a_key->pub_key_data_size, l_skey); + l_skey->data = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, FALCON_PRIVKEY_SIZE(l_logn), l_skey, l_pkey); + l_pkey->data = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, FALCON_PUBKEY_SIZE(l_logn), l_skey->data, l_skey, l_pkey); l_skey->degree = s_falcon_sign_degree; l_skey->kind = s_falcon_kind; @@ -170,7 +170,7 @@ int dap_enc_sig_falcon_get_sign(dap_enc_key_t *a_key, const void *a_msg, const s } if (l_sig_len) - DAP_NEW_Z_SIZE_RET_VAL(l_sig->sig_data, byte_t, l_sig_len, -1, NULL); + l_sig->sig_data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(byte_t, l_sig_len, -1); l_ret = falcon_sign_dyn( &l_rng, @@ -241,7 +241,7 @@ uint8_t *dap_enc_sig_falcon_write_public_key(const void *a_public_key, size_t *a // func work falcon_public_key_t *l_public_key = (falcon_public_key_t *)a_public_key; uint64_t l_buflen = dap_enc_sig_falcon_ser_public_key_size(a_public_key); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 10, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_public_key->degree, (uint64_t)sizeof(uint32_t), &l_public_key->kind, (uint64_t)sizeof(uint32_t), @@ -266,7 +266,7 @@ uint8_t *dap_enc_sig_falcon_write_private_key(const void *a_private_key, size_t // func work falcon_private_key_t *l_private_key = (falcon_private_key_t *)a_private_key; uint64_t l_buflen = dap_enc_sig_falcon_ser_private_key_size(a_private_key); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 10, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_private_key->degree, (uint64_t)sizeof(uint32_t), &l_private_key->kind, (uint64_t)sizeof(uint32_t), @@ -286,11 +286,10 @@ void *dap_enc_sig_falcon_read_private_key(const uint8_t *a_buf, size_t a_buflen) uint64_t l_buflen = 0; uint64_t l_skey_len = a_buflen - sizeof(uint64_t) - sizeof(uint32_t) * 3; - falcon_private_key_t *l_skey = NULL; - DAP_NEW_Z_RET_VAL(l_skey, falcon_private_key_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_skey->data, uint8_t, l_skey_len, NULL, l_skey); + falcon_private_key_t *l_skey = DAP_NEW_Z_RET_VAL_IF_FAIL(falcon_private_key_t, NULL); + l_skey->data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_skey_len, NULL, l_skey); - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 10, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_skey->degree, (uint64_t)sizeof(uint32_t), &l_skey->kind, (uint64_t)sizeof(uint32_t), @@ -320,11 +319,10 @@ void *dap_enc_sig_falcon_read_public_key(const uint8_t *a_buf, size_t a_buflen) uint64_t l_buflen = 0; uint64_t l_pkey_len = a_buflen - sizeof(uint64_t) - sizeof(uint32_t) * 3; - falcon_public_key_t *l_pkey = NULL; - DAP_NEW_Z_RET_VAL(l_pkey, falcon_public_key_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_pkey->data, uint8_t, l_pkey_len, NULL, l_pkey); + falcon_public_key_t *l_pkey = DAP_NEW_Z_RET_VAL_IF_FAIL(falcon_public_key_t, NULL); + l_pkey->data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_pkey_len, NULL, l_pkey); - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 10, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_pkey->degree, (uint64_t)sizeof(uint32_t), &l_pkey->kind, (uint64_t)sizeof(uint32_t), @@ -354,7 +352,7 @@ uint8_t *dap_enc_sig_falcon_write_signature(const void *a_sign, size_t *a_buflen falcon_signature_t *l_sign = (falcon_signature_t*)a_sign; // func work uint64_t l_buflen = dap_enc_sig_falcon_ser_sig_size(a_sign); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 12, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_sign->degree, (uint64_t)sizeof(uint32_t), &l_sign->kind, (uint64_t)sizeof(uint32_t), @@ -375,11 +373,10 @@ void *dap_enc_sig_falcon_read_signature(const uint8_t* a_buf, size_t a_buflen) uint64_t l_buflen = 0; uint64_t l_sig_len = a_buflen - sizeof(uint64_t) * 2 - sizeof(uint32_t) * 3; - falcon_signature_t *l_sign = NULL; - DAP_NEW_Z_RET_VAL(l_sign, falcon_signature_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_sign->sig_data, uint8_t, l_sig_len, NULL, l_sign); + falcon_signature_t *l_sign = DAP_NEW_Z_RET_VAL_IF_FAIL(falcon_signature_t, NULL); + l_sign->sig_data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_sig_len, NULL, l_sign); - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 12, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_sign->degree, (uint64_t)sizeof(uint32_t), &l_sign->kind, (uint64_t)sizeof(uint32_t), diff --git a/crypto/src/dap_enc_key.c b/crypto/src/dap_enc_key.c index d07154bc2c65d14459fce6ec0fae588dc378691a..6d03ea5276f6cceb32701c49cb08769196dbeb81 100755 --- a/crypto/src/dap_enc_key.c +++ b/crypto/src/dap_enc_key.c @@ -633,9 +633,7 @@ uint8_t *dap_enc_key_serialize_sign(dap_enc_key_type_t a_key_type, uint8_t *a_si l_data = s_callbacks[a_key_type].ser_sign(a_sign, a_sign_len); break; default: - dap_return_val_if_pass(!a_sign || !a_sign_len || !(*a_sign_len), NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_data, uint8_t, *a_sign_len, NULL, NULL); - memcpy(l_data, a_sign, *a_sign_len); + dap_return_val_if_fail(a_sign && a_sign_len && *a_sign_len && ( l_data = DAP_DUP_SIZE(a_sign, *a_sign_len) ), NULL); } return l_data; } @@ -670,9 +668,7 @@ uint8_t* dap_enc_key_deserialize_sign(dap_enc_key_type_t a_key_type, uint8_t *a_ *a_sign_len = s_callbacks[a_key_type].deser_sign_size(NULL); break; default: - dap_return_val_if_pass(!a_sign || !(*a_sign_len), NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_data, uint8_t, *a_sign_len, NULL, NULL); - memcpy(l_data, a_sign, *a_sign_len); + dap_return_val_if_fail(a_sign && *a_sign_len && ( l_data = DAP_DUP_SIZE(a_sign, *a_sign_len) ), NULL); } return l_data; } @@ -687,7 +683,7 @@ uint8_t* dap_enc_key_deserialize_sign(dap_enc_key_type_t a_key_type, uint8_t *a_ */ uint8_t* dap_enc_key_serialize_priv_key(dap_enc_key_t *a_key, size_t *a_buflen_out) { - dap_return_val_if_pass(!a_key || !a_key->priv_key_data_size, NULL); + dap_return_val_if_pass(!a_key || !a_key->priv_key_data_size || !a_key->priv_key_data, NULL); uint8_t *l_data = NULL; switch (a_key->type) { case DAP_ENC_KEY_TYPE_SIG_BLISS: @@ -702,10 +698,9 @@ uint8_t* dap_enc_key_serialize_priv_key(dap_enc_key_t *a_key, size_t *a_buflen_o l_data = s_callbacks[a_key->type].ser_priv_key(a_key->priv_key_data, a_buflen_out); break; default: - DAP_NEW_Z_SIZE_RET_VAL(l_data, uint8_t, a_key->priv_key_data_size, NULL, NULL); - memcpy(l_data, a_key->priv_key_data, a_key->priv_key_data_size); + l_data = DAP_DUP_SIZE(a_key->priv_key_data, a_key->priv_key_data_size); if(a_buflen_out) - *a_buflen_out = a_key->priv_key_data_size; + *a_buflen_out = l_data ? a_key->priv_key_data_size : 0; } return l_data; } @@ -720,7 +715,7 @@ uint8_t* dap_enc_key_serialize_priv_key(dap_enc_key_t *a_key, size_t *a_buflen_o uint8_t* dap_enc_key_serialize_pub_key(dap_enc_key_t *a_key, size_t *a_buflen_out) { // sanity check - dap_return_val_if_pass(!a_key || !a_key->pub_key_data, NULL); + dap_return_val_if_pass(!a_key || !a_key->pub_key_data || !a_key->pub_key_data_size, NULL); // func work uint8_t *l_data = NULL; switch (a_key->type) { @@ -737,10 +732,9 @@ uint8_t* dap_enc_key_serialize_pub_key(dap_enc_key_t *a_key, size_t *a_buflen_ou l_data = s_callbacks[a_key->type].ser_pub_key(a_key->pub_key_data, a_buflen_out); break; default: - DAP_NEW_Z_SIZE_RET_VAL(l_data, uint8_t, a_key->pub_key_data_size, NULL, NULL); - memcpy(l_data, a_key->pub_key_data, a_key->pub_key_data_size); + l_data = DAP_DUP_SIZE(a_key->pub_key_data, a_key->pub_key_data_size); if(a_buflen_out) - *a_buflen_out = a_key->pub_key_data_size; + *a_buflen_out = l_data ? a_key->pub_key_data_size : 0; } return l_data; } @@ -789,10 +783,14 @@ int dap_enc_key_deserialize_priv_key(dap_enc_key_t *a_key, const uint8_t *a_buf, } break; default: - DAP_DEL_Z(a_key->priv_key_data); - a_key->priv_key_data_size = a_buflen; - DAP_NEW_Z_SIZE_RET_VAL(a_key->priv_key_data, uint8_t, a_key->priv_key_data_size, -4, NULL); - memcpy(a_key->priv_key_data, a_buf, a_key->priv_key_data_size); + if (!a_key->priv_key_data || a_key->priv_key_data_size != a_buflen) { + void *l_new_key = DAP_REALLOC((byte_t*)a_key->priv_key_data, a_buflen); + if ( !l_new_key ) + return log_it(L_CRITICAL, "%s", c_error_memory_alloc), -1; + a_key->priv_key_data = l_new_key; + a_key->priv_key_data_size = a_buflen; + } + memcpy(a_key->priv_key_data, a_buf, a_buflen); } dap_enc_key_update(a_key); return 0; @@ -844,10 +842,14 @@ int dap_enc_key_deserialize_pub_key(dap_enc_key_t *a_key, const uint8_t *a_buf, } break; default: - DAP_DEL_Z(a_key->pub_key_data); - a_key->pub_key_data_size = a_buflen; - DAP_NEW_Z_SIZE_RET_VAL(a_key->pub_key_data, uint8_t, a_key->pub_key_data_size, -1, NULL); - memcpy(a_key->pub_key_data, a_buf, a_key->pub_key_data_size); + if (!a_key->pub_key_data || a_key->pub_key_data_size != a_buflen) { + void *l_new_pkey = DAP_REALLOC((byte_t*)a_key->pub_key_data, a_buflen); + if ( !l_new_pkey ) + return log_it(L_CRITICAL, "%s", c_error_memory_alloc), -1; + a_key->pub_key_data = l_new_pkey; + a_key->pub_key_data_size = a_buflen; + } + memcpy(a_key->pub_key_data, a_buf, a_buflen); } dap_enc_key_update(a_key); return 0; @@ -867,7 +869,7 @@ uint8_t *dap_enc_key_serialize(dap_enc_key_t *a_key, size_t *a_buflen) uint8_t *l_ser_skey = dap_enc_key_serialize_priv_key(a_key, (size_t *)&l_ser_skey_size); uint8_t *l_ser_pkey = dap_enc_key_serialize_pub_key(a_key, (size_t *)&l_ser_pkey_size); uint64_t l_buflen = sizeof(uint64_t) * 5 + sizeof(int32_t) + l_ser_skey_size + l_ser_pkey_size + a_key->_inheritor_size; - uint8_t *l_ret = dap_serialize_multy(NULL, l_buflen, 18, + uint8_t *l_ret = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_ser_skey_size, (uint64_t)sizeof(uint64_t), &l_ser_pkey_size, (uint64_t)sizeof(uint64_t), @@ -900,7 +902,7 @@ dap_enc_key_t *dap_enc_key_deserialize(const void *buf, size_t a_buf_size) uint64_t l_timestamp = 0, l_ser_skey_size = 0, l_ser_pkey_size = 0, l_ser_inheritor_size = 0, l_buflen = 0; uint8_t *l_ser_skey = NULL, *l_ser_pkey = NULL; // get sizes - int l_res_des = dap_deserialize_multy((const uint8_t *)buf, l_sizes_len, 12, + int l_res_des = DAP_VA_DESERIALIZE(buf, l_sizes_len, &l_buflen, (uint64_t)sizeof(uint64_t), &l_ser_skey_size, (uint64_t)sizeof(uint64_t), &l_ser_pkey_size, (uint64_t)sizeof(uint64_t), @@ -919,22 +921,25 @@ dap_enc_key_t *dap_enc_key_deserialize(const void *buf, size_t a_buf_size) return NULL; } if (l_ser_skey_size) - DAP_NEW_Z_SIZE_RET_VAL(l_ser_skey, uint8_t, l_ser_skey_size, NULL, l_ret); + l_ser_skey = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_ser_skey_size, NULL, l_ret); if (l_ser_pkey_size) - DAP_NEW_Z_SIZE_RET_VAL(l_ser_pkey, uint8_t, l_ser_pkey_size, NULL, l_ser_skey, l_ret); + l_ser_pkey = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_ser_pkey_size, NULL, l_ser_skey, l_ret); if (l_ser_inheritor_size) - DAP_NEW_Z_SIZE_RET_VAL(l_ret->_inheritor, void, l_ser_inheritor_size, NULL, l_ser_pkey, l_ser_skey, l_ret); + l_ret->_inheritor = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(void, l_ser_inheritor_size, NULL, l_ser_pkey, l_ser_skey, l_ret); // deser keys - l_res_des = dap_deserialize_multy((const uint8_t *)(buf + l_sizes_len), (uint64_t)(a_buf_size - l_sizes_len), 6, + l_res_des = DAP_VA_DESERIALIZE( ((uint8_t*)buf) + l_sizes_len, (uint64_t)(a_buf_size - l_sizes_len), l_ser_skey, (uint64_t)l_ser_skey_size, l_ser_pkey, (uint64_t)l_ser_pkey_size, (uint8_t *)l_ret->_inheritor, (uint64_t)l_ser_inheritor_size ); - if (l_res_des || (l_ser_pkey_size && dap_enc_key_deserialize_pub_key(l_ret, l_ser_pkey, l_ser_pkey_size)) || (l_ser_skey_size && dap_enc_key_deserialize_priv_key(l_ret, l_ser_skey, l_ser_skey_size)) ) { - DAP_DEL_MULTY(l_ret->_inheritor, l_ser_pkey, l_ser_skey, l_ret); - log_it(L_ERROR, "Enc_key pub and priv keys deserialisation error"); - return NULL; - } + if (l_res_des + || (l_ser_pkey_size && dap_enc_key_deserialize_pub_key(l_ret, l_ser_pkey, l_ser_pkey_size)) + || (l_ser_skey_size && dap_enc_key_deserialize_priv_key(l_ret, l_ser_skey, l_ser_skey_size)) ) + { + DAP_DEL_MULTY(l_ret->_inheritor, l_ser_pkey, l_ser_skey, l_ret); + log_it(L_ERROR, "Enc_key pub and priv keys deserialisation error"); + return NULL; + } // out work l_ret->last_used_timestamp = l_timestamp; l_ret->_inheritor_size = l_ser_inheritor_size; @@ -966,12 +971,8 @@ dap_enc_key_t *dap_enc_key_dup(dap_enc_key_t *a_key) */ dap_enc_key_t *dap_enc_key_new(dap_enc_key_type_t a_key_type) { -// sanity check dap_return_val_if_pass(DAP_ENC_KEY_TYPE_INVALID == a_key_type, NULL); -// memory alloc - dap_enc_key_t * l_ret = NULL; - DAP_NEW_Z_RET_VAL(l_ret, dap_enc_key_t, NULL, NULL); -// func work + dap_enc_key_t * l_ret = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_enc_key_t, NULL); if(s_callbacks[a_key_type].new_callback){ s_callbacks[a_key_type].new_callback(l_ret); } else { @@ -1124,11 +1125,9 @@ void dap_enc_key_delete(dap_enc_key_t * a_key) */ size_t dap_enc_key_get_enc_size(dap_enc_key_type_t a_key_type, const size_t a_buf_in_size) { - if(s_callbacks[a_key_type].enc_out_size) { - return s_callbacks[a_key_type].enc_out_size(a_buf_in_size); - } - log_it(L_ERROR, "No callback for enc_out_size to %s enc key", dap_enc_get_type_name(a_key_type)); - return 0; + return a_buf_in_size && s_callbacks[a_key_type].enc_out_size + ? s_callbacks[a_key_type].enc_out_size(a_buf_in_size) + : ( log_it(L_ERROR, "No enc_out_size() function for key %s", dap_enc_get_type_name(a_key_type)), 0 ); } /** @@ -1139,25 +1138,19 @@ size_t dap_enc_key_get_enc_size(dap_enc_key_type_t a_key_type, const size_t a_bu */ size_t dap_enc_key_get_dec_size(dap_enc_key_type_t a_key_type, const size_t a_buf_in_size) { - if(s_callbacks[a_key_type].dec_out_size) { - return s_callbacks[a_key_type].dec_out_size(a_buf_in_size); - } - log_it(L_ERROR, "No callback for dec_out_size to %s enc key", dap_enc_get_type_name(a_key_type)); - return 0; + return a_buf_in_size && s_callbacks[a_key_type].dec_out_size + ? s_callbacks[a_key_type].dec_out_size(a_buf_in_size) + : ( log_it(L_ERROR, "No dec_out_size() function for key %s", dap_enc_get_type_name(a_key_type)), 0 ); } const char *dap_enc_get_type_name(dap_enc_key_type_t a_key_type) { - if(a_key_type >= DAP_ENC_KEY_TYPE_NULL && a_key_type <= DAP_ENC_KEY_TYPE_LAST) { - if(s_callbacks[a_key_type].name) { - return s_callbacks[a_key_type].name; - } - } - log_it(L_WARNING, "Name was not set for key type %d", a_key_type); - return "UNDEFINED"; + return a_key_type >= DAP_ENC_KEY_TYPE_NULL && a_key_type <= DAP_ENC_KEY_TYPE_LAST && *s_callbacks[a_key_type].name + ? s_callbacks[a_key_type].name + : ( log_it(L_WARNING, "Name was not set for key type %d", a_key_type), "undefined"); } -dap_enc_key_type_t dap_enc_key_type_find_by_name(const char * a_name){ +dap_enc_key_type_t dap_enc_key_type_find_by_name(const char * a_name){ // TODO: use uthash for(dap_enc_key_type_t i = 0; i <= DAP_ENC_KEY_TYPE_LAST; i++){ const char * l_current_key_name = dap_enc_get_type_name(i); if(l_current_key_name && !strcmp(a_name, l_current_key_name)) @@ -1192,7 +1185,6 @@ size_t dap_enc_calc_signature_unserialized_size(dap_enc_key_t *a_key) #endif default : log_it(L_ERROR, "Can't signature deserialize size calc to %s enc key", dap_enc_get_type_name(a_key->type)); - return 0; } return 0; } diff --git a/crypto/src/dap_enc_kyber.c b/crypto/src/dap_enc_kyber.c index 6263463d6ed49e2cbdeed17959ebec3ee389033d..23c969e9a70055631089cfb085c534940e728966 100644 --- a/crypto/src/dap_enc_kyber.c +++ b/crypto/src/dap_enc_kyber.c @@ -47,18 +47,13 @@ void dap_enc_kyber512_key_generate(dap_enc_key_t *a_key, UNUSED_ARG const void * UNUSED_ARG size_t a_kex_size, UNUSED_ARG const void *a_seed, UNUSED_ARG size_t a_seed_size, UNUSED_ARG size_t a_key_size) { -// input check dap_return_if_pass(!a_key); -// memory alloc - uint8_t *l_skey, *l_pkey; - DAP_NEW_Z_SIZE_RET(l_skey, uint8_t, CRYPTO_SECRETKEYBYTES, NULL); - DAP_NEW_Z_SIZE_RET(l_pkey, uint8_t, CRYPTO_PUBLICKEYBYTES, l_skey); -// crypto calc + uint8_t *l_skey = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, CRYPTO_SECRETKEYBYTES), + *l_pkey = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, CRYPTO_PUBLICKEYBYTES, l_skey); if (crypto_kem_keypair(l_pkey, l_skey)) { DAP_DEL_MULTY(l_pkey, l_skey); return; } -// post func work, change in args only after all pass DAP_DEL_MULTY(a_key->_inheritor, a_key->pub_key_data); a_key->_inheritor = l_skey; a_key->pub_key_data = l_pkey; @@ -95,9 +90,8 @@ size_t dap_enc_kyber512_gen_bob_shared_key (dap_enc_key_t *a_bob_key, const void // sanity check dap_return_val_if_pass(!a_bob_key || !a_alice_pub || !a_cypher_msg || a_alice_pub_size < CRYPTO_PUBLICKEYBYTES, 0); // memory alloc - uint8_t *l_shared_key, *l_cypher_msg; - DAP_NEW_Z_SIZE_RET_VAL(l_shared_key, uint8_t, CRYPTO_BYTES, 0, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_cypher_msg, uint8_t, CRYPTO_CIPHERTEXTBYTES, 0, l_shared_key); + uint8_t *l_shared_key = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, CRYPTO_BYTES, 0), + *l_cypher_msg = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, CRYPTO_CIPHERTEXTBYTES, 0, l_shared_key); // crypto calc if(crypto_kem_enc(l_cypher_msg, l_shared_key, a_alice_pub)) { DAP_DEL_MULTY(l_cypher_msg, l_shared_key); @@ -126,13 +120,10 @@ size_t dap_enc_kyber512_gen_alice_shared_key(dap_enc_key_t *a_alice_key, UNUSED_ // sanity check dap_return_val_if_pass(!a_alice_key || !a_cypher_msg || a_cypher_msg_size < CRYPTO_CIPHERTEXTBYTES, 0); // memory alloc - uint8_t *l_shared_key = NULL; - DAP_NEW_Z_SIZE_RET_VAL(l_shared_key, uint8_t, CRYPTO_BYTES, 0, NULL); + uint8_t *l_shared_key = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, CRYPTO_BYTES, 0); // crypto calc - if (crypto_kem_dec(l_shared_key, a_cypher_msg, a_alice_key->_inheritor) ) { - DAP_DEL_Z(l_shared_key); - return 0; - } + if ( crypto_kem_dec(l_shared_key, a_cypher_msg, a_alice_key->_inheritor) ) + return DAP_DELETE(l_shared_key), 0; // post func work DAP_DEL_Z(a_alice_key->shared_key); a_alice_key->shared_key = l_shared_key; diff --git a/crypto/src/dap_enc_msrln.c b/crypto/src/dap_enc_msrln.c index 037b25d6aa0c975cf070512ce55a9f6ed2e57406..59a2482d6f08a300fb24fb53420d3762e80a4c23 100755 --- a/crypto/src/dap_enc_msrln.c +++ b/crypto/src/dap_enc_msrln.c @@ -58,11 +58,8 @@ void dap_enc_msrln_key_generate(dap_enc_key_t *a_key, UNUSED_ARG const void *a_k { // sanity check dap_return_if_pass(!a_key); -// memory alloc - uint8_t *l_skey, *l_pkey; - DAP_NEW_Z_SIZE_RET(l_skey, uint8_t, MSRLN_PKA_BYTES * sizeof(uint32_t), NULL); - DAP_NEW_Z_SIZE_RET(l_pkey, uint8_t, MSRLN_PKA_BYTES, l_skey); -// crypto calc + uint8_t *l_skey = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, MSRLN_PKA_BYTES * sizeof(int32_t)), + *l_pkey = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, MSRLN_PKA_BYTES, l_skey); PLatticeCryptoStruct PLCS = LatticeCrypto_allocate(); LatticeCrypto_initialize(PLCS, (RandomBytes)randombytes, MSRLN_generate_a, MSRLN_get_error); if (MSRLN_KeyGeneration_A((int32_t *) l_skey, l_pkey, PLCS) != CRYPTO_MSRLN_SUCCESS) { @@ -93,9 +90,8 @@ size_t dap_enc_msrln_gen_bob_shared_key(dap_enc_key_t *a_bob_key, const void *a_ // sanity check dap_return_val_if_pass(!a_bob_key || !a_alice_pub || !a_cypher_msg || a_alice_pub_size != MSRLN_PKA_BYTES, 0); // memory alloc - uint8_t *l_shared_key, *l_cypher_msg; - DAP_NEW_Z_SIZE_RET_VAL(l_shared_key, uint8_t, MSRLN_SHAREDKEY_BYTES, 0, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_cypher_msg, uint8_t, MSRLN_PKB_BYTES, 0, l_shared_key); + uint8_t *l_shared_key = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, MSRLN_SHAREDKEY_BYTES, 0), + *l_cypher_msg = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, MSRLN_PKB_BYTES, 0, l_shared_key); // crypto calc PLatticeCryptoStruct PLCS = LatticeCrypto_allocate(); LatticeCrypto_initialize(PLCS, (RandomBytes)randombytes, MSRLN_generate_a, MSRLN_get_error); @@ -129,8 +125,7 @@ size_t dap_enc_msrln_gen_alice_shared_key(dap_enc_key_t *a_alice_key, const void // sanity check dap_return_val_if_pass(!a_alice_key || !a_alice_priv || !a_cypher_msg || a_cypher_msg_size < MSRLN_PKB_BYTES, 0); // memory alloc - uint8_t *l_shared_key = NULL; - DAP_NEW_Z_SIZE_RET_VAL(l_shared_key, uint8_t, MSRLN_SHAREDKEY_BYTES, 0, NULL); + uint8_t *l_shared_key = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, MSRLN_SHAREDKEY_BYTES, 0); // crypto calc if (MSRLN_SecretAgreement_A(a_cypher_msg, (int32_t *) a_alice_priv, l_shared_key) != CRYPTO_MSRLN_SUCCESS) { DAP_DEL_Z(l_shared_key); diff --git a/crypto/src/dap_enc_multisign.c b/crypto/src/dap_enc_multisign.c index 143a1756c18bf6161af97627277f78a7117f6070..e7914b477e6452d67681867fd159f961e36ff4ab 100755 --- a/crypto/src/dap_enc_multisign.c +++ b/crypto/src/dap_enc_multisign.c @@ -61,11 +61,9 @@ void dap_enc_sig_multisign_key_new_generate(dap_enc_key_t *a_key, const void *a_ void dap_enc_sig_multisign_key_delete(dap_enc_key_t *a_key) { dap_return_if_pass(!a_key); - DAP_DEL_Z(a_key->priv_key_data); - DAP_DEL_Z(a_key->pub_key_data); - a_key->priv_key_data_size = 0; - a_key->pub_key_data_size = 0; - dap_multi_sign_params_delete((dap_multi_sign_params_t *)a_key->_pvt); + DAP_DEL_MULTY(a_key->priv_key_data, a_key->pub_key_data); + a_key->priv_key_data_size = a_key->pub_key_data_size = 0; + dap_multi_sign_params_delete((dap_multi_sign_params_t*)a_key->_pvt); } /** @@ -111,8 +109,8 @@ int dap_enc_sig_multisign_forming_keys(dap_enc_key_t *a_key, const dap_multi_sig l_skey_len += dap_enc_ser_priv_key_size(a_params->keys[i]); l_pkey_len += dap_enc_ser_pub_key_size(a_params->keys[i]); } - DAP_NEW_Z_SIZE_RET_VAL(l_skey, dap_multisign_private_key_t, l_skey_len, -1, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_pkey, dap_multisign_public_key_t, l_pkey_len, -1, l_skey); + l_skey = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_multisign_private_key_t, l_skey_len, -1); + l_pkey = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_multisign_public_key_t, l_pkey_len, -1, l_skey); // func work uint64_t l_mem_bias_skey = 0; uint64_t l_mem_bias_pkey = 0; @@ -153,7 +151,7 @@ uint8_t *dap_enc_sig_multisign_write_signature(const void *a_sign, size_t *a_out uint64_t l_signes_size, l_pkeys_hashes_size; uint64_t l_out_len = s_multi_sign_calc_size(l_sign, &l_signes_size, &l_pkeys_hashes_size) + sizeof(uint64_t) * 3; *a_out_len = l_out_len; - uint8_t *l_ret = dap_serialize_multy(NULL, l_out_len, 20, + uint8_t *l_ret = DAP_VA_SERIALIZE_NEW(l_out_len, &l_out_len, (uint64_t)sizeof(uint64_t), &l_pkeys_hashes_size, (uint64_t)sizeof(uint64_t), &l_signes_size, (uint64_t)sizeof(uint64_t), @@ -176,16 +174,11 @@ uint8_t *dap_enc_sig_multisign_write_signature(const void *a_sign, size_t *a_out */ void *dap_enc_sig_multisign_read_signature(const uint8_t *a_sign, size_t a_sign_len) { -// sanity check uint64_t l_mem_shift = sizeof(uint64_t) * 3 + sizeof(dap_sign_type_t) + sizeof(uint8_t) * 2; dap_return_val_if_pass(!a_sign || a_sign_len < l_mem_shift, NULL); -// func work - dap_multi_sign_t *l_sign = NULL; + dap_multi_sign_t *l_sign = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_multi_sign_t, NULL); uint64_t l_sign_len = 0, l_pkeys_size = 0, l_signes_size = 0, l_pkeys_hashes_size = 0; -// base allocate memory - DAP_NEW_Z_RET_VAL(l_sign, dap_multi_sign_t, NULL, NULL); -// get sizes - int l_res_des = dap_deserialize_multy(a_sign, l_mem_shift, 12, + int l_res_des = DAP_VA_DESERIALIZE(a_sign, l_mem_shift, &l_sign_len, (uint64_t)sizeof(uint64_t), &l_pkeys_hashes_size, (uint64_t)sizeof(uint64_t), &l_signes_size, (uint64_t)sizeof(uint64_t), @@ -199,12 +192,12 @@ void *dap_enc_sig_multisign_read_signature(const uint8_t *a_sign, size_t a_sign_ return NULL; } // addtional allocation memory - DAP_NEW_Z_COUNT_RET_VAL(l_sign->key_seq, uint8_t, l_sign->sign_count, NULL, l_sign); - DAP_NEW_Z_COUNT_RET_VAL(l_sign->meta, dap_multi_sign_meta_t, l_sign->sign_count, NULL, l_sign->key_seq, l_sign); - DAP_NEW_Z_SIZE_RET_VAL(l_sign->key_hashes, dap_hash_fast_t, l_pkeys_hashes_size, NULL, l_sign->meta, l_sign->key_seq, l_sign); - DAP_NEW_Z_SIZE_RET_VAL(l_sign->sign_data, uint8_t, l_signes_size, NULL, l_sign->key_hashes, l_sign->meta, l_sign->key_seq, l_sign); + l_sign->key_seq = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_sign->sign_count, NULL, l_sign); + l_sign->meta = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_multi_sign_meta_t, l_sign->sign_count, NULL, l_sign->key_seq, l_sign); + l_sign->key_hashes = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_hash_fast_t, l_pkeys_hashes_size, NULL, l_sign->meta, l_sign->key_seq, l_sign); + l_sign->sign_data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_signes_size, NULL, l_sign->key_hashes, l_sign->meta, l_sign->key_seq, l_sign); // get data - l_res_des = dap_deserialize_multy(a_sign + l_mem_shift, l_sign_len - l_mem_shift, 8, + l_res_des = DAP_VA_DESERIALIZE(a_sign + l_mem_shift, l_sign_len - l_mem_shift, l_sign->key_seq, (uint64_t)(sizeof(uint8_t) * l_sign->sign_count), l_sign->meta, (uint64_t)(sizeof(dap_multi_sign_meta_t) * l_sign->sign_count), l_sign->key_hashes, (uint64_t)l_pkeys_hashes_size, @@ -232,10 +225,9 @@ dap_multi_sign_params_t *dap_multi_sign_params_make(dap_sign_type_enum_t a_type, // sanity check dap_return_val_if_pass(a_type != SIG_TYPE_MULTI_CHAINED && a_type != SIG_TYPE_MULTI_COMBINED, NULL); // memory alloc - dap_multi_sign_params_t *l_params = NULL; - DAP_NEW_Z_RET_VAL(l_params, dap_multi_sign_params_t, NULL, NULL); - DAP_NEW_Z_COUNT_RET_VAL(l_params->keys, dap_enc_key_t *, a_key_count, NULL, l_params); - DAP_NEW_Z_COUNT_RET_VAL(l_params->key_seq, uint8_t, a_sign_count, NULL, l_params->keys, l_params); + dap_multi_sign_params_t *l_params = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_multi_sign_params_t, NULL); + l_params->keys = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_enc_key_t*, a_key_count, NULL, l_params); + l_params->key_seq = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, a_sign_count, NULL, l_params->keys, l_params); // func work l_params->type.type = a_type; l_params->key_count = a_key_count; @@ -259,7 +251,8 @@ dap_multi_sign_params_t *dap_multi_sign_params_make(dap_sign_type_enum_t a_type, */ void dap_multi_sign_params_delete(dap_multi_sign_params_t *a_params) { - dap_return_if_pass(!a_params); + if (!a_params) + return; for (size_t i = 0; i < a_params->key_count; ++i) { dap_enc_key_delete(a_params->keys[i]); } @@ -276,27 +269,19 @@ void dap_multi_sign_params_delete(dap_multi_sign_params_t *a_params) */ bool dap_multi_sign_hash_data(dap_multi_sign_t *a_sign, const void *a_data, const size_t a_data_size, dap_chain_hash_fast_t *a_hash) { -// sanity check dap_return_val_if_pass(!a_sign, false); -// memory alloc - uint8_t *l_meta_data = NULL; - uint8_t *l_concatenated_hash = NULL; uint32_t l_meta_data_size = sizeof(dap_sign_type_t) + 2 * sizeof(uint8_t) + a_sign->sign_count * sizeof(uint8_t); - DAP_NEW_Z_SIZE_RET_VAL(l_concatenated_hash, uint8_t, 3 * sizeof(dap_chain_hash_fast_t), false, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_meta_data, uint8_t, l_meta_data_size, false, l_concatenated_hash); -// func work - bool l_ret = (bool)dap_serialize_multy(l_meta_data, l_meta_data_size, 8, - &a_sign->type, (uint64_t)sizeof(dap_sign_type_t), - &a_sign->key_count, (uint64_t)sizeof(uint8_t), - &a_sign->sign_count, (uint64_t)sizeof(uint8_t), - a_sign->key_seq, (uint64_t)(a_sign->sign_count * sizeof(uint8_t)) - ); + uint8_t l_meta_data[l_meta_data_size], l_concatenated_hash[ 3 * sizeof(dap_chain_hash_fast_t) ] = { }; + + bool l_ret = !!DAP_VA_SERIALIZE(l_meta_data, l_meta_data_size, + &a_sign->type, (uint64_t)sizeof(dap_sign_type_t), + &a_sign->key_count, (uint64_t)sizeof(uint8_t), + &a_sign->sign_count, (uint64_t)sizeof(uint8_t), + a_sign->key_seq, (uint64_t)(a_sign->sign_count * sizeof(uint8_t))); l_ret ? l_ret &= dap_hash_fast(a_data, a_data_size, (dap_chain_hash_fast_t *)l_concatenated_hash) : 0; // get data hash - l_ret ? l_ret &= dap_hash_fast(l_meta_data, l_meta_data_size, (dap_chain_hash_fast_t *)(l_concatenated_hash + sizeof(dap_chain_hash_fast_t))) : 0; // get metadata hash + l_ret ? l_ret &= dap_hash_fast(l_meta_data, l_meta_data_size, (dap_chain_hash_fast_t*)(l_concatenated_hash + sizeof(dap_chain_hash_fast_t))) : 0; // get metadata hash l_ret ? l_ret &= dap_hash_fast(a_sign->key_hashes, a_sign->key_count * sizeof(dap_chain_hash_fast_t), (dap_chain_hash_fast_t *)(l_concatenated_hash + 2 * sizeof(dap_chain_hash_fast_t))) : 0; // get key_hashes hash l_ret ? l_ret &= dap_hash_fast(l_concatenated_hash, 3 * sizeof(dap_chain_hash_fast_t), a_hash) : 0; // get out hash of calculated hashes -// out work - DAP_DEL_MULTY(l_meta_data, l_concatenated_hash); return l_ret; } @@ -315,9 +300,9 @@ int dap_enc_sig_multisign_get_sign(dap_enc_key_t *a_key, const void *a_msg_in, c dap_return_val_if_pass(!l_params || !l_params->key_count || l_params->type.type != SIG_TYPE_MULTI_CHAINED, -1); // memory alloc dap_multi_sign_t *l_sign = a_sign_out; - DAP_NEW_Z_COUNT_RET_VAL(l_sign->key_hashes, dap_chain_hash_fast_t, l_params->key_count, -6, NULL); - DAP_NEW_Z_COUNT_RET_VAL(l_sign->key_seq, uint8_t, l_params->sign_count, -4, l_sign->key_hashes); - DAP_NEW_Z_COUNT_RET_VAL(l_sign->meta, dap_multi_sign_meta_t, l_params->sign_count, -5, l_sign->key_seq, l_sign->key_hashes); + l_sign->key_hashes = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_chain_hash_fast_t, l_params->key_count, -6); + l_sign->key_seq = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_params->sign_count, -4, l_sign->key_hashes); + l_sign->meta = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_multi_sign_meta_t, l_params->sign_count, -5, l_sign->key_seq, l_sign->key_hashes); // data prepare l_sign->type = l_params->type; l_sign->key_count = l_params->key_count; @@ -398,15 +383,13 @@ int dap_enc_sig_multisign_verify_sign(dap_enc_key_t *a_key, const void *a_msg, c dap_multisign_public_key_t *l_pkeys = a_key->pub_key_data; size_t l_pkey_size = l_sign->meta[i].sign_header.sign_pkey_size; size_t l_sign_size = l_sign->meta[i].sign_header.sign_size; - dap_sign_t *l_step_sign = NULL; + dap_sign_t *l_step_sign = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_sign_t, sizeof(dap_sign_hdr_t) + l_pkey_size + l_sign_size, -1); int l_verified = 0; // get multisign hash data if (!i && !dap_multi_sign_hash_data(l_sign, a_msg, a_msg_size, &l_data_hash)) { log_it (L_ERROR, "Can't create multi-signature hash"); - return -3; + return DAP_DELETE(l_step_sign), -3; } - // create step sign and verify data - DAP_NEW_Z_SIZE_RET_VAL(l_step_sign, dap_sign_t, sizeof(dap_sign_hdr_t) + l_pkey_size + l_sign_size, -1, NULL); l_step_sign->header = l_sign->meta[i].sign_header; memcpy(l_step_sign->pkey_n_sign, l_pkeys->data + l_pkeys_mem_shift, l_pkey_size); memcpy(l_step_sign->pkey_n_sign + l_pkey_size, l_sign->sign_data + l_signs_mem_shift, l_sign_size); diff --git a/crypto/src/dap_enc_newhope.c b/crypto/src/dap_enc_newhope.c index f9aa999a2db6b4a6d1a6931b0bdc55c4518a5cbe..a10e0d746a1c2c86568a129c5dc323e96ea910b0 100644 --- a/crypto/src/dap_enc_newhope.c +++ b/crypto/src/dap_enc_newhope.c @@ -30,7 +30,6 @@ #include <unistd.h> #include "dap_enc_newhope.h" -#include "dap_common.h" #include "rand/dap_rand.h" #include "newhope/newhope_cpapke.h" #include "newhope/newhope_params.h" @@ -67,18 +66,12 @@ void dap_enc_newhope_kem_key_new_generate(dap_enc_key_t *a_key, UNUSED_ARG const UNUSED_ARG size_t a_kex_size, UNUSED_ARG const void *a_seed, UNUSED_ARG size_t a_seed_size, UNUSED_ARG size_t a_key_size) { -// sanity check dap_return_if_pass(!a_key); -// work prepare DAP_NEWHOPE_SIGN_SECURITY newhope_type = NEWHOPE_1024; dap_enc_newhope_pke_set_type(newhope_type); -// memory alloc - uint8_t *l_skey, *l_pkey; - DAP_NEW_Z_SIZE_RET(l_skey, uint8_t, NEWHOPE_CPAPKE_SECRETKEYBYTES, NULL); - DAP_NEW_Z_SIZE_RET(l_pkey, uint8_t, NEWHOPE_CPAPKE_PUBLICKEYBYTES, l_skey); -// crypto calc + uint8_t *l_skey = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, NEWHOPE_CPAPKE_SECRETKEYBYTES), + *l_pkey = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, NEWHOPE_CPAPKE_PUBLICKEYBYTES, l_skey); cpapke_keypair(l_pkey, l_skey); -// post func work DAP_DEL_MULTY(a_key->_inheritor, a_key->pub_key_data); a_key->_inheritor = l_skey; a_key->pub_key_data = l_pkey; @@ -109,9 +102,8 @@ size_t dap_enc_newhope_gen_bob_shared_key(dap_enc_key_t *a_bob_key, const void * // sanity check dap_return_val_if_pass(!a_bob_key || !a_alice_pub || !a_cypher_msg || a_alice_pub_size < NEWHOPE_CPAPKE_PUBLICKEYBYTES, 0) // memory alloc - uint8_t *l_shared_key, *l_cypher_msg; - DAP_NEW_Z_SIZE_RET_VAL(l_shared_key, uint8_t, NEWHOPE_SYMBYTES, 0, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_cypher_msg, uint8_t, NEWHOPE_CPAKEM_CIPHERTEXTBYTES, 0, l_shared_key); + uint8_t *l_shared_key = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, NEWHOPE_SYMBYTES, false), + *l_cypher_msg = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, NEWHOPE_CPAKEM_CIPHERTEXTBYTES, false, l_shared_key); // crypto calc if (crypto_kem_enc(l_cypher_msg, l_shared_key, a_alice_pub)) { DAP_DEL_MULTY(l_cypher_msg, l_shared_key); @@ -131,8 +123,7 @@ size_t dap_enc_newhope_gen_alice_shared_key(dap_enc_key_t *a_alice_key, UNUSED_A // sanity check dap_return_val_if_pass(!a_alice_key || !a_cypher_msg || a_cypher_msg_size < NEWHOPE_CPAKEM_CIPHERTEXTBYTES, 0); // memory alloc - uint8_t *l_shared_key = NULL; - DAP_NEW_Z_SIZE_RET_VAL(l_shared_key, uint8_t, NEWHOPE_SYMBYTES, 0, NULL); + uint8_t *l_shared_key = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, NEWHOPE_SYMBYTES, 0); // crypto calc if (crypto_kem_dec(l_shared_key, a_cypher_msg, a_alice_key->_inheritor)) { DAP_DELETE(l_shared_key); diff --git a/crypto/src/dap_enc_picnic.c b/crypto/src/dap_enc_picnic.c index 0c3e894bc49b974e245a03a44769de373e81439b..57e3f2fe7d2e23bdd8d82c4fd5b066f5df8d9e15 100755 --- a/crypto/src/dap_enc_picnic.c +++ b/crypto/src/dap_enc_picnic.c @@ -110,9 +110,7 @@ int dap_enc_sig_picnic_get_sign(dap_enc_key_t *a_key, const void *a_msg, const s picnic_privatekey_t* sk = a_key->priv_key_data; paramset_t paramset; dap_return_val_if_pass((l_ret = get_param_set(sk->params, ¶mset)) != EXIT_SUCCESS, l_ret); - // memory alloc - signature_t *l_sig = NULL; - DAP_NEW_Z_RET_VAL(l_sig, signature_t, -1, NULL); + signature_t *l_sig = DAP_NEW_Z_RET_VAL_IF_FAIL(signature_t, -1); allocateSignature(l_sig, ¶mset); dap_return_val_if_pass(!l_sig, -1); @@ -146,13 +144,8 @@ int dap_enc_sig_picnic_verify_sign(dap_enc_key_t *a_key, const void *a_msg, cons paramset_t paramset; dap_return_val_if_pass((l_ret = get_param_set(pk->params, ¶mset)) != EXIT_SUCCESS, l_ret); // memory alloc - signature_t *l_sig = NULL; - DAP_NEW_Z_RET_VAL(l_sig, signature_t, -1, NULL); - + signature_t *l_sig = DAP_NEW_Z_RET_VAL_IF_FAIL(signature_t, -1); allocateSignature(l_sig, ¶mset); - if(!l_sig) { - return -1; - } l_ret = deserializeSignature(l_sig, (const uint8_t*)a_sig, a_sig_len, ¶mset); if(l_ret != EXIT_SUCCESS) { diff --git a/crypto/src/dap_enc_shipovnik.c b/crypto/src/dap_enc_shipovnik.c index de117f9b75382e8df8b6acd3d1796c6758175b59..0b7482d67b9ea2d282348cc793e1eac211909177 100644 --- a/crypto/src/dap_enc_shipovnik.c +++ b/crypto/src/dap_enc_shipovnik.c @@ -22,8 +22,8 @@ void dap_enc_sig_shipovnik_key_new_generate(dap_enc_key_t * key, UNUSED_ARG cons UNUSED_ARG size_t kex_size, const void *seed, size_t seed_size, UNUSED_ARG size_t key_size) { - DAP_NEW_Z_SIZE_RET(key->priv_key_data, void, SHIPOVNIK_SECRETKEYBYTES, NULL); - DAP_NEW_Z_SIZE_RET(key->pub_key_data, void, SHIPOVNIK_PUBLICKEYBYTES, key->priv_key_data); + key->priv_key_data = DAP_NEW_Z_SIZE_RET_IF_FAIL(void, SHIPOVNIK_SECRETKEYBYTES); + key->pub_key_data = DAP_NEW_Z_SIZE_RET_IF_FAIL(void, SHIPOVNIK_PUBLICKEYBYTES, key->priv_key_data); key->priv_key_data_size = SHIPOVNIK_SECRETKEYBYTES; key->pub_key_data_size = SHIPOVNIK_PUBLICKEYBYTES; if (!seed || !seed_size) { diff --git a/crypto/src/dap_enc_sphincsplus.c b/crypto/src/dap_enc_sphincsplus.c index d62b94e5e25afb9973e357c266652b413b1242f8..6fef44fff5f63cf778cbcb13b32b97e8356b6df4 100644 --- a/crypto/src/dap_enc_sphincsplus.c +++ b/crypto/src/dap_enc_sphincsplus.c @@ -32,7 +32,6 @@ void dap_enc_sig_sphincsplus_key_new_generate(dap_enc_key_t *a_key, UNUSED_ARG c sphincsplus_private_key_t *l_skey = NULL; sphincsplus_public_key_t *l_pkey = NULL; sphincsplus_base_params_t l_params = {0}; - unsigned char *l_seed_buf = NULL; if (sphincsplus_set_config(s_default_config) || sphincsplus_get_params(s_default_config, &l_params)) { log_it(L_CRITICAL, "Error load sphincsplus config"); @@ -41,7 +40,7 @@ void dap_enc_sig_sphincsplus_key_new_generate(dap_enc_key_t *a_key, UNUSED_ARG c // seed norming size_t l_seed_buf_size = dap_enc_sig_sphincsplus_crypto_sign_seedbytes(); - DAP_NEW_Z_SIZE_RET(l_seed_buf, unsigned char, l_seed_buf_size, NULL); + unsigned char *l_seed_buf = DAP_NEW_Z_SIZE_RET_IF_FAIL(unsigned char, l_seed_buf_size, NULL); if(a_seed && a_seed_size > 0) { shake256(l_seed_buf, l_seed_buf_size, (const unsigned char *) a_seed, a_seed_size); } else { @@ -52,10 +51,10 @@ void dap_enc_sig_sphincsplus_key_new_generate(dap_enc_key_t *a_key, UNUSED_ARG c a_key->priv_key_data_size = sizeof(sphincsplus_private_key_t); a_key->pub_key_data_size = sizeof(sphincsplus_public_key_t); - DAP_NEW_Z_SIZE_RET(l_skey, sphincsplus_private_key_t, a_key->priv_key_data_size, l_seed_buf); - DAP_NEW_Z_SIZE_RET(l_pkey, sphincsplus_public_key_t, a_key->pub_key_data_size, l_seed_buf, l_skey); - DAP_NEW_Z_SIZE_RET(l_skey->data, uint8_t, dap_enc_sig_sphincsplus_crypto_sign_secretkeybytes(), l_seed_buf, l_skey, l_pkey); - DAP_NEW_Z_SIZE_RET(l_pkey->data, uint8_t, dap_enc_sig_sphincsplus_crypto_sign_publickeybytes(), l_seed_buf, l_skey->data, l_skey, l_pkey); + l_skey = DAP_NEW_Z_SIZE_RET_IF_FAIL(sphincsplus_private_key_t, a_key->priv_key_data_size, l_seed_buf); + l_pkey = DAP_NEW_Z_SIZE_RET_IF_FAIL(sphincsplus_public_key_t, a_key->pub_key_data_size, l_seed_buf, l_skey); + l_skey->data = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, dap_enc_sig_sphincsplus_crypto_sign_secretkeybytes(), l_seed_buf, l_skey, l_pkey); + l_pkey->data = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, dap_enc_sig_sphincsplus_crypto_sign_publickeybytes(), l_seed_buf, l_skey->data, l_skey, l_pkey); if(sphincsplus_crypto_sign_seed_keypair(l_pkey->data, l_skey->data, l_seed_buf)) { log_it(L_CRITICAL, "Error generating Sphincs key pair"); @@ -86,8 +85,7 @@ int dap_enc_sig_sphincsplus_get_sign(dap_enc_key_t *a_key, const void *a_msg_in, return -3; } - DAP_NEW_Z_SIZE_RET_VAL(l_sign->sig_data, uint8_t, dap_enc_sig_sphincsplus_crypto_sign_bytes(), -3, NULL); - + l_sign->sig_data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, dap_enc_sig_sphincsplus_crypto_sign_bytes(), -3); l_sign->sig_params = l_skey->params; return sphincsplus_crypto_sign_signature(l_sign->sig_data, &l_sign->sig_len, (const unsigned char *)a_msg_in, a_msg_size, l_skey->data); } @@ -109,7 +107,7 @@ size_t dap_enc_sig_sphincsplus_get_sign_msg(dap_enc_key_t *a_key, const void *a_ } sphincsplus_signature_t *l_sign = (sphincsplus_signature_t *)a_sign_out; - DAP_NEW_Z_SIZE_RET_VAL(l_sign->sig_data, uint8_t, l_sign_bytes + a_msg_size, 0, NULL); + l_sign->sig_data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_sign_bytes + a_msg_size, 0); l_sign->sig_params = l_skey->params; int l_ret = sphincsplus_crypto_sign(l_sign->sig_data, &l_sign->sig_len, (const unsigned char *)a_msg, a_msg_size, l_skey->data); @@ -191,7 +189,7 @@ uint8_t *dap_enc_sig_sphincsplus_write_private_key(const void *a_private_key, si sphincsplus_set_params(&l_private_key->params); uint64_t l_secret_length = dap_enc_sig_sphincsplus_crypto_sign_secretkeybytes(); uint64_t l_buflen = dap_enc_sig_sphincsplus_ser_private_key_size((void *)l_private_key); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 6, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_private_key->params, (uint64_t)sizeof(sphincsplus_base_params_t), l_private_key->data, (uint64_t)l_secret_length @@ -210,11 +208,10 @@ void *dap_enc_sig_sphincsplus_read_private_key(const uint8_t *a_buf, size_t a_bu uint64_t l_buflen = 0; uint64_t l_skey_len = a_buflen - sizeof(uint64_t) - sizeof(sphincsplus_base_params_t); - sphincsplus_private_key_t *l_skey = NULL; - DAP_NEW_Z_RET_VAL(l_skey, sphincsplus_private_key_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_skey->data, uint8_t, l_skey_len, NULL, l_skey); + sphincsplus_private_key_t *l_skey = DAP_NEW_Z_RET_VAL_IF_FAIL(sphincsplus_private_key_t, NULL); + l_skey->data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_skey_len, NULL, l_skey); - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 6, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_skey->params, (uint64_t)sizeof(sphincsplus_base_params_t), l_skey->data, (uint64_t)l_skey_len @@ -246,7 +243,7 @@ uint8_t *dap_enc_sig_sphincsplus_write_public_key(const void* a_public_key, size sphincsplus_set_params(&l_public_key->params); uint64_t l_public_length = dap_enc_sig_sphincsplus_crypto_sign_publickeybytes(&l_public_key->params); uint64_t l_buflen = dap_enc_sig_sphincsplus_ser_public_key_size(a_public_key); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 6, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_public_key->params, (uint64_t)sizeof(sphincsplus_base_params_t), l_public_key->data, (uint64_t)l_public_length @@ -265,11 +262,10 @@ void *dap_enc_sig_sphincsplus_read_public_key(const uint8_t *a_buf, size_t a_buf uint64_t l_buflen = 0; uint64_t l_pkey_len = a_buflen - sizeof(uint64_t) - sizeof(sphincsplus_base_params_t); - sphincsplus_public_key_t *l_pkey = NULL; - DAP_NEW_Z_RET_VAL(l_pkey, sphincsplus_public_key_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_pkey->data, uint8_t, l_pkey_len, NULL, l_pkey); + sphincsplus_public_key_t *l_pkey = DAP_NEW_Z_RET_VAL_IF_FAIL(sphincsplus_public_key_t, NULL); + l_pkey->data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_pkey_len, NULL, l_pkey); - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 6, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_pkey->params, (uint64_t)sizeof(sphincsplus_base_params_t), l_pkey->data, (uint64_t)l_pkey_len @@ -299,7 +295,7 @@ uint8_t *dap_enc_sig_sphincsplus_write_signature(const void *a_sign, size_t *a_b sphincsplus_signature_t *l_sign = (sphincsplus_signature_t *)a_sign; // func work uint64_t l_buflen = dap_enc_sig_sphincsplus_ser_sig_size(a_sign); - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 8, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_sign->sig_params, (uint64_t)sizeof(sphincsplus_base_params_t), &l_sign->sig_len, (uint64_t)sizeof(uint64_t), @@ -318,11 +314,10 @@ void *dap_enc_sig_sphincsplus_read_signature(const uint8_t *a_buf, size_t a_bufl // func work uint64_t l_buflen; uint64_t l_sig_len = a_buflen - sizeof(uint64_t) * 2 - sizeof(sphincsplus_base_params_t); - sphincsplus_signature_t* l_sign = NULL; - DAP_NEW_Z_RET_VAL(l_sign, sphincsplus_signature_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_sign->sig_data, uint8_t, l_sig_len, NULL, l_sign); + sphincsplus_signature_t* l_sign = DAP_NEW_Z_RET_VAL_IF_FAIL(sphincsplus_signature_t, NULL); + l_sign->sig_data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_sig_len, NULL, l_sign); - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 8, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_sign->sig_params, (uint64_t)sizeof(sphincsplus_base_params_t), &l_sign->sig_len, (uint64_t)sizeof(uint64_t), diff --git a/crypto/src/dap_enc_tesla.c b/crypto/src/dap_enc_tesla.c index 4f5a1318a19239cb06f49512b189e296132ba500..2dff8dba7b7d3418f618890e3894097980814726 100755 --- a/crypto/src/dap_enc_tesla.c +++ b/crypto/src/dap_enc_tesla.c @@ -111,7 +111,7 @@ uint8_t *dap_enc_sig_tesla_write_signature(const void *a_sign, size_t *a_buflen_ // func work uint64_t l_buflen = dap_enc_sig_tesla_ser_sig_size(l_sign); uint32_t l_kind = l_sign->kind; - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 8, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), &l_sign->sig_len, (uint64_t)sizeof(uint64_t), @@ -130,11 +130,10 @@ void *dap_enc_sig_tesla_read_signature(const uint8_t *a_buf, size_t a_buflen) // func work uint64_t l_buflen; uint64_t l_sig_len = a_buflen - sizeof(uint64_t) * 2 - sizeof(uint32_t); - tesla_signature_t* l_sign = NULL; - DAP_NEW_Z_RET_VAL(l_sign, tesla_signature_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_sign->sig_data, uint8_t, l_sig_len, NULL, l_sign); + tesla_signature_t* l_sign = DAP_NEW_Z_RET_VAL_IF_FAIL(tesla_signature_t, NULL); + l_sign->sig_data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_sig_len, NULL, l_sign); uint32_t l_kind = 0; - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 8, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), &l_sign->sig_len, (uint64_t)sizeof(uint64_t), @@ -163,7 +162,7 @@ uint8_t *dap_enc_sig_tesla_write_private_key(const void *a_private_key, size_t * // func work uint64_t l_buflen = dap_enc_sig_tesla_ser_private_key_size(a_private_key); //CRYPTO_PUBLICKEYBYTES; uint32_t l_kind = l_private_key->kind; - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 6, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), l_private_key->data, (uint64_t)p.CRYPTO_SECRETKEYBYTES @@ -181,11 +180,10 @@ void *dap_enc_sig_tesla_read_private_key(const uint8_t *a_buf, size_t a_buflen) // func work uint64_t l_buflen; uint64_t l_skey_len = a_buflen - sizeof(uint64_t) - sizeof(uint32_t); - tesla_private_key_t* l_skey = NULL; - DAP_NEW_Z_RET_VAL(l_skey, tesla_private_key_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_skey->data, uint8_t, l_skey_len, NULL, l_skey); + tesla_private_key_t* l_skey = DAP_NEW_Z_RET_VAL_IF_FAIL(tesla_private_key_t, NULL); + l_skey->data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_skey_len, NULL, l_skey); uint32_t l_kind = 0; - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 6, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), l_skey->data, (uint64_t)l_skey_len @@ -214,7 +212,7 @@ uint8_t *dap_enc_sig_tesla_write_public_key(const void *a_public_key, size_t *a_ // func work uint64_t l_buflen = dap_enc_sig_tesla_ser_public_key_size(a_public_key); uint32_t l_kind = l_public_key->kind; - uint8_t *l_buf = dap_serialize_multy(NULL, l_buflen, 6, + uint8_t *l_buf = DAP_VA_SERIALIZE_NEW(l_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), l_public_key->data, (uint64_t)p.CRYPTO_PUBLICKEYBYTES @@ -232,11 +230,10 @@ void *dap_enc_sig_tesla_read_public_key(const uint8_t *a_buf, size_t a_buflen) // func work uint64_t l_buflen; uint64_t l_pkey_len = a_buflen - sizeof(uint64_t) - sizeof(uint32_t); - tesla_public_key_t* l_pkey = NULL; - DAP_NEW_Z_RET_VAL(l_pkey, tesla_public_key_t, NULL, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_pkey->data, uint8_t, l_pkey_len, NULL, l_pkey); + tesla_public_key_t* l_pkey = DAP_NEW_Z_RET_VAL_IF_FAIL(tesla_public_key_t, NULL); + l_pkey->data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_pkey_len, NULL, l_pkey); uint32_t l_kind = 0; - int l_res_des = dap_deserialize_multy(a_buf, a_buflen, 6, + int l_res_des = DAP_VA_DESERIALIZE(a_buf, a_buflen, &l_buflen, (uint64_t)sizeof(uint64_t), &l_kind, (uint64_t)sizeof(uint32_t), l_pkey->data, (uint64_t)l_pkey_len diff --git a/crypto/src/dap_pkey.c b/crypto/src/dap_pkey.c index c0e46ff6fbc7f39e75d876def05b4c2132004a02..1b61b0433b9e8c0ea235e6ab89c9b9f64afe59de 100755 --- a/crypto/src/dap_pkey.c +++ b/crypto/src/dap_pkey.c @@ -36,43 +36,32 @@ */ dap_pkey_t *dap_pkey_from_enc_key(dap_enc_key_t *a_key) { - if (a_key->pub_key_data_size > 0) { - dap_pkey_type_t l_type = dap_pkey_type_from_enc_key_type(a_key->type); - if (l_type.type == DAP_PKEY_TYPE_NULL) { - log_it(L_WARNING, "No serialization preset"); - return NULL; - } - size_t l_pub_key_size; - uint8_t *l_pkey = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_size); - if (!l_pkey) { - log_it(L_WARNING, "Serialization failed"); - return NULL; - } - dap_pkey_t *l_ret = DAP_NEW_SIZE(dap_pkey_t, sizeof(dap_pkey_t) + l_pub_key_size); - l_ret->header.type = l_type; - l_ret->header.size = (uint32_t)l_pub_key_size; - memcpy(&l_ret->pkey, l_pkey, l_pub_key_size); - DAP_DELETE(l_pkey); - return l_ret; - } else { - log_it(L_WARNING, "No public key in the input enc_key object"); - return NULL; - } - return NULL; + dap_return_val_if_fail(a_key, NULL); + dap_return_val_if_fail_err(a_key->pub_key_data_size, NULL, "No public key in the input enc_key object"); + dap_pkey_type_t l_type = dap_pkey_type_from_enc_key_type(a_key->type); + dap_return_val_if_pass_err(l_type.type == DAP_PKEY_TYPE_NULL, NULL, "Undefined pkey type"); + dap_pkey_t *l_ret = NULL; + size_t l_pub_key_size = 0; + uint8_t *l_pkey = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_size); + if ( l_pkey && l_pub_key_size ) { + l_ret = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_pkey_t, sizeof(dap_pkey_t) + l_pub_key_size, NULL, l_pkey); + *l_ret = (dap_pkey_t) { .header.type = l_type, .header.size = l_pub_key_size }; + memcpy(l_ret->pkey, l_pkey, l_pub_key_size); + } else + log_it(L_ERROR, "Pub key serialization failed"); + return DAP_DELETE(l_pkey), l_ret; } bool dap_pkey_get_hash(dap_pkey_t *a_pkey, dap_chain_hash_fast_t *a_out_hash) { - if (!a_pkey || !a_out_hash) - return false; - return dap_hash_fast(a_pkey->pkey, a_pkey->header.size, a_out_hash); + return a_pkey ? dap_hash_fast(a_pkey->pkey, a_pkey->header.size, a_out_hash) : false; } dap_pkey_t *dap_pkey_get_from_sign(dap_sign_t *a_sign) { - dap_pkey_t *l_pkey = DAP_NEW_SIZE(dap_pkey_t, sizeof(dap_pkey_t) + a_sign->header.sign_pkey_size); - l_pkey->header.size = a_sign->header.sign_pkey_size; - l_pkey->header.type = dap_pkey_type_from_sign_type(a_sign->header.type); + dap_return_val_if_fail(a_sign, NULL); + dap_pkey_t *l_pkey = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_pkey_t, sizeof(dap_pkey_t) + a_sign->header.sign_pkey_size, NULL); + *l_pkey = (dap_pkey_t) { .header.size = a_sign->header.sign_pkey_size, .header.type = dap_pkey_type_from_sign_type(a_sign->header.type) }; memcpy(l_pkey->pkey, a_sign->pkey_n_sign, l_pkey->header.size); return l_pkey; } diff --git a/crypto/src/dap_sign.c b/crypto/src/dap_sign.c index e104ab530dce7dac4fddfe82c0bda5034171ea9a..e3fb32c0f6a37737214c576d469ed2f731aa054b 100755 --- a/crypto/src/dap_sign.c +++ b/crypto/src/dap_sign.c @@ -268,11 +268,8 @@ dap_sign_t * dap_sign_create(dap_enc_key_t *a_key, const void * a_data, size_t l_sign_unserialized_size = dap_sign_create_output_unserialized_calc_size(a_key, a_output_wish_size); if(l_sign_unserialized_size > 0) { size_t l_pub_key_size = 0; - uint8_t* l_sign_unserialized = NULL; - uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_size); - - // dap_return_val_if_pass(!l_pub_key, NULL); - DAP_NEW_Z_SIZE_RET_VAL(l_sign_unserialized, uint8_t, l_sign_unserialized_size, NULL, l_pub_key); + uint8_t *l_sign_unserialized = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_sign_unserialized_size, NULL), + *l_pub_key = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_size); // calc signature [sign_size may decrease slightly] if( dap_sign_create_output(a_key, l_sign_data, l_sign_data_size, l_sign_unserialized, &l_sign_unserialized_size) != 0) { @@ -282,8 +279,7 @@ dap_sign_t * dap_sign_create(dap_enc_key_t *a_key, const void * a_data, size_t l_sign_ser_size = l_sign_unserialized_size; uint8_t *l_sign_ser = dap_enc_key_serialize_sign(a_key->type, l_sign_unserialized, &l_sign_ser_size); if ( l_sign_ser ){ - dap_sign_t *l_ret = NULL; - DAP_NEW_Z_SIZE_RET_VAL(l_ret, dap_sign_t, sizeof(dap_sign_hdr_t) + l_sign_ser_size + l_pub_key_size, NULL, l_sign_unserialized, l_pub_key, l_sign_ser); + dap_sign_t *l_ret = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_sign_t, sizeof(dap_sign_hdr_t) + l_sign_ser_size + l_pub_key_size, NULL, l_sign_unserialized, l_pub_key, l_sign_ser); // write serialized public key to dap_sign_t memcpy(l_ret->pkey_n_sign, l_pub_key, l_pub_key_size); l_ret->header.type = dap_sign_type_from_key_type(a_key->type); @@ -524,17 +520,14 @@ dap_sign_t **dap_sign_get_unique_signs(void *a_data, size_t a_data_size, size_t if (l_dup) continue; } else - DAP_NEW_Z_COUNT_RET_VAL(ret, dap_sign_t *, l_signs_count, NULL, NULL); + ret = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_sign_t*, l_signs_count, NULL); ret[i++] = l_sign; if (*a_signs_count && i == *a_signs_count) break; if (i == l_signs_count) { l_signs_count += l_realloc_count; - ret = DAP_REALLOC_COUNT(ret, l_signs_count); - if (!ret) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return NULL; - } + dap_sign_t **l_ret_new = DAP_REALLOC_COUNT_RET_VAL_IF_FAIL(ret, l_signs_count, NULL, ret); + ret = l_ret_new; } } *a_signs_count = i; diff --git a/crypto/src/dap_uuid.c b/crypto/src/dap_uuid.c index c749c11bacf598c7f82025d7cd12338f7d550194..96698279c2d3ba50a01feb78e369450be9091cd6 100644 --- a/crypto/src/dap_uuid.c +++ b/crypto/src/dap_uuid.c @@ -96,12 +96,11 @@ void dap_uuid_generate_nonce(void *a_nonce, size_t a_nonce_size) SHAKE128((unsigned char *)a_nonce, a_nonce_size, (unsigned char *)l_input, sizeof(l_input)); } -_Thread_local static char s_buf[sizeof(uint128_t) * 2 + 3]; - -const char *dap_guuid_to_hex_str(dap_guuid_t a_guuid) +dap_guuid_str_t dap_guuid_to_hex_str_(dap_guuid_t a_guuid) { - sprintf(s_buf, "0x%016" DAP_UINT64_FORMAT_X "%016" DAP_UINT64_FORMAT_X, a_guuid.net_id, a_guuid.srv_id); - return (const char *)s_buf; + dap_guuid_str_t l_ret; + return snprintf((char*)&l_ret, sizeof(l_ret), "0x%016" DAP_UINT64_FORMAT_X "%016" DAP_UINT64_FORMAT_X, + a_guuid.net_id, a_guuid.srv_id), l_ret; } @@ -117,9 +116,10 @@ dap_guuid_t dap_guuid_from_hex_str(const char *a_hex_str, bool *succsess) if (succsess) *succsess = false; return ret; } - sprintf(s_buf, "0x%s", a_hex_str + 16 + 2); + dap_guuid_str_t l_str; + snprintf((char*)&l_str, sizeof(l_str), "0x%s", a_hex_str + 16 + 2); uint64_t l_net_id, l_srv_id; - if (dap_id_uint64_parse(a_hex_str, &l_net_id) || dap_id_uint64_parse(s_buf, &l_srv_id)) + if (dap_id_uint64_parse(a_hex_str, &l_net_id) || dap_id_uint64_parse(l_str.s, &l_srv_id)) { if (succsess) *succsess = false; return ret; diff --git a/crypto/test/crypto/dap_enc_benchmark_test.c b/crypto/test/crypto/dap_enc_benchmark_test.c index 814bfb99fc719a79faf8284281c8995a46a62998..e6a46601d27c38fd0c1c5257015c3e0227c9f521 100644 --- a/crypto/test/crypto/dap_enc_benchmark_test.c +++ b/crypto/test/crypto/dap_enc_benchmark_test.c @@ -10,11 +10,8 @@ /*--------------------------TRANSFER TEST BLOCK--------------------------*/ static void s_transfer_test(dap_enc_key_type_t a_key_type, int a_times, int *a_gen_time, int *a_alice_shared, int *a_bob_shared) { - dap_enc_key_t **l_alice_keys = NULL; - dap_enc_key_t **l_bob_keys = NULL; - - DAP_NEW_Z_COUNT_RET(l_alice_keys, dap_enc_key_t*, a_times, NULL); - DAP_NEW_Z_COUNT_RET(l_bob_keys, dap_enc_key_t*, a_times, l_alice_keys); + dap_enc_key_t **l_alice_keys = DAP_NEW_Z_COUNT_RET_IF_FAIL(dap_enc_key_t*, a_times); + dap_enc_key_t **l_bob_keys = DAP_NEW_Z_COUNT_RET_IF_FAIL(dap_enc_key_t*, a_times, l_alice_keys); int l_t1 = get_cur_time_msec(); @@ -75,18 +72,13 @@ static void s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int * size_t seed_size = sizeof(uint8_t); uint8_t seed[sizeof(uint8_t)]; randombytes(seed, seed_size); - uint8_t **l_signs = NULL; - uint8_t **l_source = NULL; - dap_enc_key_t **l_keys = NULL; + uint8_t *l_signs[a_times], *l_source[a_times]; + dap_enc_key_t *l_keys[a_times]; size_t l_source_size[a_times]; dap_enc_key_t *l_key_temp = dap_enc_key_new_generate(a_key_type, NULL, 0, seed, seed_size, 0); size_t max_signature_size = dap_sign_create_output_unserialized_calc_size(l_key_temp, 0); dap_enc_key_delete(l_key_temp); - DAP_NEW_Z_COUNT_RET(l_signs, uint8_t*, a_times, NULL); - DAP_NEW_Z_COUNT_RET(l_source, uint8_t*, a_times, l_signs); - DAP_NEW_Z_COUNT_RET(l_keys, dap_enc_key_t*, a_times, l_source, l_signs); - int l_t1 = 0; *a_sig_time = 0; for (int i = 0; i < a_times; ++i) { @@ -99,9 +91,9 @@ static void s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int * } // ---------- - DAP_NEW_Z_SIZE_RET(l_signs[i], uint8_t, max_signature_size, NULL); + l_signs[i] = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, max_signature_size); l_source_size[i] = 1 + random_uint32_t(20); - DAP_NEW_Z_SIZE_RET(l_source[i], uint8_t, l_source_size[i], NULL); + l_source[i] = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, l_source_size[i]); randombytes(l_source[i], l_source_size[i]); l_t1 = get_cur_time_msec(); @@ -137,20 +129,16 @@ static void s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int * dap_enc_key_delete(l_keys[i]); DAP_DELETE(l_source[i]); } - DAP_DEL_MULTY(l_signs, l_source, l_keys); } static void s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, int *a_sig_time, int *a_verify_time) { size_t seed_size = sizeof(uint8_t); uint8_t seed[seed_size]; - dap_sign_t **l_signs = NULL; - uint8_t **l_source = NULL; + dap_sign_t *l_signs[a_times]; + uint8_t *l_source[a_times]; size_t l_source_size[a_times]; - DAP_NEW_Z_COUNT_RET(l_signs, dap_sign_t*, a_times, NULL); - DAP_NEW_Z_COUNT_RET(l_source, uint8_t*, a_times, l_signs); - int l_t1 = 0; *a_sig_time = 0; for (int i = 0; i < a_times; ++i) { @@ -164,7 +152,7 @@ static void s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, i } // ---------- l_source_size[i] = 1 + random_uint32_t(20); - DAP_NEW_Z_SIZE_RET(l_source[i], uint8_t, l_source_size[i], NULL); + l_source[i] = DAP_NEW_Z_SIZE_RET_IF_FAIL(uint8_t, l_source_size[i]); randombytes(l_source[i], l_source_size[i]); l_t1 = get_cur_time_msec(); @@ -199,7 +187,6 @@ static void s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, i for(int i = 0; i < a_times; ++i) { DAP_DEL_MULTY(l_signs[i], l_source[i]); } - DAP_DEL_MULTY(l_signs, l_source); } static void s_sign_verify_test_becnhmark(const char *a_name, dap_enc_key_type_t a_key_type, int a_times) { diff --git a/crypto/test/crypto/dap_enc_multithread_test.c b/crypto/test/crypto/dap_enc_multithread_test.c index 4f004882d6cc32f4f48421240be8dba1b6cd059f..e17f94b9f9ed0a6994e6debb041630daf14b4ce0 100644 --- a/crypto/test/crypto/dap_enc_multithread_test.c +++ b/crypto/test/crypto/dap_enc_multithread_test.c @@ -23,19 +23,16 @@ static int s_test_thread(dap_enc_key_type_t a_key_type, int a_times) int l_ret = 0; size_t seed_size = sizeof(uint8_t); uint8_t seed[seed_size]; - dap_sign_t **l_signs = NULL; - uint8_t **l_source = NULL; + dap_sign_t *l_signs[a_times]; + uint8_t *l_source[a_times]; size_t l_source_size[a_times]; - DAP_NEW_Z_COUNT_RET_VAL(l_signs, dap_sign_t*, a_times, 1, NULL); - DAP_NEW_Z_COUNT_RET_VAL(l_source, uint8_t*, a_times, 1, l_signs); - for (int i = 0; i < a_times; ++i) { randombytes(seed, seed_size); // ---------- l_source_size[i] = 1 + random_uint32_t(20); - DAP_NEW_Z_SIZE_RET_VAL(l_source[i], uint8_t, l_source_size[i], 1, NULL); + l_source[i] = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(uint8_t, l_source_size[i], 1, NULL); randombytes(l_source[i], l_source_size[i]); dap_enc_key_t *key = s_enc_key_new_generate(a_key_type, NULL, 0, seed, seed_size, 0); @@ -64,11 +61,8 @@ static int s_test_thread(dap_enc_key_type_t a_key_type, int a_times) dap_assert_PIF(!l_verified, "Deserialize and verifying signature"); l_ret |= l_verified; } - - for(int i = 0; i < a_times; ++i) { - DAP_DEL_MULTY(l_signs[i], l_source[i]); - } - DAP_DEL_MULTY(l_signs, l_source); + DAP_DEL_ARRAY(l_signs, a_times); + DAP_DEL_ARRAY(l_source, a_times); return l_ret; } diff --git a/global-db/dap_global_db.c b/global-db/dap_global_db.c index 712ed9e2f29343bc3d2f50362cb601e154ea6f7d..98f1dd33e7d979623e1cf519b9db0c22faf034e2 100644 --- a/global-db/dap_global_db.c +++ b/global-db/dap_global_db.c @@ -219,9 +219,7 @@ void dap_global_db_instance_deinit() dap_return_if_fail(s_dbi) dap_list_free_full(s_dbi->blacklist, NULL); dap_list_free_full(s_dbi->whitelist, NULL); - DAP_DEL_Z(s_dbi->driver_name); - DAP_DEL_Z(s_dbi->storage_path); - DAP_DEL_Z(s_dbi); + DAP_DEL_MULTY(s_dbi->driver_name, s_dbi->storage_path, s_dbi); } inline dap_global_db_instance_t *dap_global_db_instance_get_default() @@ -430,8 +428,7 @@ byte_t *dap_global_db_get_sync(const char *a_group, int dap_global_db_get(const char * a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group && a_key, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_GET; l_msg->group = dap_strdup(a_group); @@ -504,8 +501,7 @@ dap_store_obj_t *dap_global_db_get_raw_sync(const char *a_group, const char *a_k int dap_global_db_get_raw(const char *a_group, const char *a_key, dap_global_db_callback_result_raw_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group && a_key, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_GET_RAW; l_msg->group = dap_strdup(a_group); @@ -575,8 +571,7 @@ dap_nanotime_t dap_global_db_get_del_ts_sync(const char *a_group, const char *a_ int dap_global_db_get_del_ts(const char *a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group && a_key, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_GET_DEL_TS; l_msg->group = dap_strdup(a_group); @@ -663,8 +658,7 @@ byte_t *dap_global_db_get_last_sync(const char *a_group, char **a_key, size_t *a int dap_global_db_get_last(const char * a_group, dap_global_db_callback_result_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_GET_LAST; l_msg->group = dap_strdup(a_group); @@ -728,9 +722,7 @@ dap_store_obj_t *dap_global_db_get_last_raw_sync(const char *a_group) int dap_global_db_get_last_raw(const char * a_group, dap_global_db_callback_result_raw_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); - - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_GET_LAST_RAW; l_msg->group = dap_strdup(a_group); @@ -791,8 +783,7 @@ dap_global_db_obj_t *dap_global_db_get_all_sync(const char *a_group, size_t *a_o int dap_global_db_get_all(const char *a_group, size_t a_results_page_size, dap_global_db_callback_results_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_GET_ALL; l_msg->group = dap_strdup(a_group); @@ -891,8 +882,7 @@ dap_store_obj_t *dap_global_db_get_all_raw_sync(const char* a_group, size_t *a_o int dap_global_db_get_all_raw(const char *a_group, size_t a_results_page_size, dap_global_db_callback_results_raw_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_GET_ALL_RAW; l_msg->group = dap_strdup(a_group); @@ -1013,8 +1003,7 @@ int dap_global_db_set_sync(const char *a_group, const char *a_key, const void *a int dap_global_db_set(const char * a_group, const char *a_key, const void * a_value, const size_t a_value_length, bool a_pin_value, dap_global_db_callback_result_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group && a_key, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_SET; l_msg->group = dap_strdup(a_group); @@ -1029,12 +1018,7 @@ int dap_global_db_set(const char * a_group, const char *a_key, const void * a_va DAP_DEL_MULTY(l_msg->group, l_msg); return DAP_GLOBAL_DB_RC_CRITICAL; } - l_msg->value = DAP_DUP_SIZE(a_value, a_value_length); - if (!l_msg->value && a_value) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - DAP_DEL_MULTY(l_msg->key, l_msg->group, l_msg); - return DAP_GLOBAL_DB_RC_CRITICAL; - } + l_msg->value = DAP_DUP_SIZE_RET_VAL_IF_FAIL((char*)a_value, a_value_length, DAP_GLOBAL_DB_RC_CRITICAL, l_msg->key, l_msg->group, l_msg); l_msg->value_length = a_value_length; l_msg->value_is_pinned = a_pin_value; l_msg->callback_arg = a_arg; @@ -1104,8 +1088,7 @@ int dap_global_db_set_raw_sync(dap_store_obj_t *a_store_objs, size_t a_store_obj int dap_global_db_set_raw(dap_store_obj_t *a_store_objs, size_t a_store_objs_count, dap_global_db_callback_results_raw_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_store_objs && a_store_objs_count, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_SET_RAW; l_msg->callback_arg = a_arg; @@ -1161,8 +1144,7 @@ static void s_msg_opcode_set_raw(struct queue_io_msg * a_msg) int dap_global_db_set_multiple_zc(const char *a_group, dap_global_db_obj_t *a_values, size_t a_values_count, dap_global_db_callback_results_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group && a_values && a_values_count, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_SET_MULTIPLE; l_msg->group = dap_strdup(a_group); @@ -1198,7 +1180,8 @@ static void s_msg_opcode_set_multiple_zc(struct queue_io_msg * a_msg) size_t i=0; #ifdef DAP_TPS_TEST FILE *l_mempool_file = fopen("/opt/cellframe-node/share/ca/mempool_start.txt", "a"); - fclose(l_mempool_file); + if (l_mempool_file) + fclose(l_mempool_file); log_it(L_TPS, "Start write %zu records to mempool", a_msg->values_count); #endif if(a_msg->values_count>0) { @@ -1216,7 +1199,8 @@ static void s_msg_opcode_set_multiple_zc(struct queue_io_msg * a_msg) dap_global_db_objs_delete( a_msg->values, a_msg->values_count); #ifdef DAP_TPS_TEST l_mempool_file = fopen("/opt/cellframe-node/share/ca/mempool_finish.txt", "a"); - fclose(l_mempool_file); + if (l_mempool_file) + fclose(l_mempool_file); log_it(L_TPS, "Finish write %zu records to mempool ", a_msg->values_count); #endif } @@ -1256,8 +1240,7 @@ int dap_global_db_unpin_sync(const char *a_group, const char *a_key) int s_db_object_pin(const char *a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg, bool a_pin) { - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_PIN; l_msg->group = dap_strdup(a_group); @@ -1337,8 +1320,8 @@ int dap_global_db_unpin(const char *a_group, const char *a_key, dap_global_db_ca static int s_del_sync_with_dbi(dap_global_db_instance_t *a_dbi, const char *a_group, const char *a_key) { dap_store_obj_t l_store_obj = { - .key = a_key, - .group = (char *)a_group, + .key = (char*)a_key, + .group = (char*)a_group, .flags = DAP_GLOBAL_DB_RECORD_NEW | (a_key ? DAP_GLOBAL_DB_RECORD_DEL : DAP_GLOBAL_DB_RECORD_ERASE), .timestamp = dap_nanotime_now() }; @@ -1376,8 +1359,7 @@ inline int dap_global_db_del_sync(const char *a_group, const char *a_key) int dap_global_db_del(const char * a_group, const char *a_key, dap_global_db_callback_result_t a_callback, void *a_arg) { dap_return_val_if_fail(s_dbi && a_group, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_DELETE; l_msg->group = dap_strdup(a_group); @@ -1454,8 +1436,7 @@ int dap_global_db_flush_sync() int dap_global_db_flush(dap_global_db_callback_result_t a_callback, void * a_arg) { dap_return_val_if_fail(s_dbi, DAP_GLOBAL_DB_RC_ERROR); - struct queue_io_msg *l_msg; - DAP_NEW_Z_RET_VAL(l_msg, struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL, NULL); + struct queue_io_msg *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(struct queue_io_msg, DAP_GLOBAL_DB_RC_CRITICAL); l_msg->dbi = s_dbi; l_msg->opcode = MSG_OPCODE_FLUSH; l_msg->callback_arg = a_arg; @@ -1496,8 +1477,7 @@ dap_global_db_obj_t *dap_global_db_objs_copy(const dap_global_db_obj_t *a_objs_s /* Run over array's elements */ const dap_global_db_obj_t *l_obj = a_objs_src; - dap_global_db_obj_t *l_objs_dest; - DAP_NEW_Z_COUNT_RET_VAL(l_objs_dest, dap_global_db_obj_t, a_count, NULL, NULL); + dap_global_db_obj_t *l_objs_dest = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_global_db_obj_t, a_count, NULL); for (dap_global_db_obj_t *l_cur = l_objs_dest; a_count--; l_cur++, l_obj++) { *l_cur = *l_obj; if (l_obj->key) { @@ -1533,19 +1513,11 @@ dap_global_db_obj_t *dap_global_db_objs_copy(const dap_global_db_obj_t *a_objs_s */ void dap_global_db_objs_delete(dap_global_db_obj_t *a_objs, size_t a_count) { -dap_global_db_obj_t *l_obj; - - if (!a_objs && !a_count) - return; - - dap_return_if_fail(a_objs && a_count) /* Sanity checks */ - - for(l_obj = a_objs; a_count--; l_obj++) { /* Run over array's elements */ - DAP_DEL_Z(l_obj->key); - DAP_DEL_Z(l_obj->value); + if (a_objs && a_count) { + for (dap_global_db_obj_t *l_obj = a_objs; --a_count; ++l_obj) + DAP_DEL_MULTY(l_obj->key, l_obj->value); } - - DAP_DELETE(a_objs); /* Finaly kill the the array */ + DAP_DELETE(a_objs); } /** diff --git a/global-db/dap_global_db_ch.c b/global-db/dap_global_db_ch.c index 23fe998c9e86100c3a29c4bad91c5dd9daf81716..56f4f5e4759f06abf0d40792f1eb327d806ecc1e 100644 --- a/global-db/dap_global_db_ch.c +++ b/global-db/dap_global_db_ch.c @@ -76,9 +76,8 @@ void s_stream_ch_new(dap_stream_ch_t *a_ch, void *a_arg) * @param ch * @param arg */ -static void s_stream_ch_delete(dap_stream_ch_t *a_ch, void *a_arg) +static void s_stream_ch_delete(dap_stream_ch_t *a_ch, void UNUSED_ARG *a_arg) { - UNUSED(a_arg); dap_stream_ch_gdb_t *l_ch_gdb = DAP_STREAM_CH_GDB(a_ch); debug_if(g_dap_global_db_debug_more, L_NOTICE, "Destroyed GDB sync channel %p with internal data %p", a_ch, l_ch_gdb); DAP_DEL_Z(a_ch->internal); @@ -148,12 +147,11 @@ bool s_proc_thread_reader(void *a_arg) DAP_DELETE(l_hashes_pkt); } else if (l_type != DAP_STREAM_CH_GLOBAL_DB_MSG_TYPE_GROUP_REQUEST) { debug_if(g_dap_global_db_debug_more, L_INFO, "OUT: GLOBAL_DB_GROUP_REQUEST packet for group %s from first record", l_group); - size_t l_pkt_size = dap_global_db_start_pkt_get_size(l_pkt); - dap_global_db_start_pkt_t *l_oncoming_pkt = DAP_DUP_SIZE(l_pkt, l_pkt_size); - l_oncoming_pkt->last_hash = c_dap_global_db_driver_hash_blank; + dap_global_db_driver_hash_t l_tmp_hash = l_pkt->last_hash; + l_pkt->last_hash = c_dap_global_db_driver_hash_blank; dap_stream_ch_pkt_send_by_addr(l_sender_addr, DAP_STREAM_CH_GDB_ID, DAP_STREAM_CH_GLOBAL_DB_MSG_TYPE_GROUP_REQUEST, - l_oncoming_pkt, l_pkt_size); - DAP_DEL_Z(l_oncoming_pkt); + l_pkt, dap_global_db_start_pkt_get_size(l_pkt)); + l_pkt->last_hash = l_tmp_hash; } if (!l_ret) DAP_DELETE(a_arg); diff --git a/global-db/dap_global_db_cluster.c b/global-db/dap_global_db_cluster.c index 51c17b1ba080f8e2c8612eaf540eb825254e01c7..478cae199b77e6adde90c5ff6cd193d43fa8de15 100644 --- a/global-db/dap_global_db_cluster.c +++ b/global-db/dap_global_db_cluster.c @@ -217,6 +217,7 @@ int dap_global_db_cluster_add_notify_callback(dap_global_db_cluster_t *a_cluster static void s_ch_in_pkt_callback(dap_stream_ch_t *a_ch, uint8_t a_type, const void *a_data, size_t a_data_size, void *a_arg) { + dap_return_if_fail(a_arg); debug_if(g_dap_global_db_debug_more, L_DEBUG, "Got packet with message type %hhu size %zu from addr " NODE_ADDR_FP_STR, a_type, a_data_size, NODE_ADDR_FP_ARGS_S(a_ch->stream->node)); dap_global_db_cluster_t *l_cluster = a_arg; diff --git a/global-db/dap_global_db_driver.c b/global-db/dap_global_db_driver.c index c2431830e8005e1e014b557dac8e05306fb14c9b..d269e1eb91a9120e6b22609041768b829fe1c681 100644 --- a/global-db/dap_global_db_driver.c +++ b/global-db/dap_global_db_driver.c @@ -88,10 +88,10 @@ int dap_global_db_driver_init(const char *a_driver_name, const char *a_filename_ dap_global_db_driver_deinit(); // Fill callbacks with zeros - memset(&s_drv_callback, 0, sizeof(dap_global_db_driver_callbacks_t)); + s_drv_callback = (dap_global_db_driver_callbacks_t){ }; // Setup driver name - strncpy( s_used_driver, a_driver_name, sizeof(s_used_driver) - 1); + dap_strncpy( s_used_driver, a_driver_name, sizeof(s_used_driver) - 1); dap_mkdir_with_parents(a_filename_db); @@ -156,32 +156,22 @@ static inline void s_store_obj_copy_one(dap_store_obj_t *a_store_obj_dst, const { *a_store_obj_dst = *a_store_obj_src; a_store_obj_dst->group = dap_strdup(a_store_obj_src->group); - if (a_store_obj_src->group && !a_store_obj_dst->group) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return; - } + if (a_store_obj_src->group && !a_store_obj_dst->group) + return log_it(L_CRITICAL, "%s", c_error_memory_alloc); + a_store_obj_dst->key = dap_strdup(a_store_obj_src->key); if (a_store_obj_src->key && !a_store_obj_dst->key) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return; - } - if (a_store_obj_src->sign) { - a_store_obj_dst->sign = DAP_DUP_SIZE(a_store_obj_src->sign, dap_sign_get_size(a_store_obj_src->sign)); - if (!a_store_obj_dst->sign) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return; - } + return DAP_DELETE(a_store_obj_dst->group), log_it(L_CRITICAL, "%s", c_error_memory_alloc); } + if (a_store_obj_src->sign) + a_store_obj_dst->sign = DAP_DUP_SIZE_RET_IF_FAIL(a_store_obj_src->sign, dap_sign_get_size(a_store_obj_src->sign), + a_store_obj_dst->group, a_store_obj_dst->key); if (a_store_obj_src->value) { if (!a_store_obj_src->value_len) log_it(L_WARNING, "Inconsistent global DB object copy requested"); - else { - a_store_obj_dst->value = DAP_DUP_SIZE(a_store_obj_src->value, a_store_obj_src->value_len); - if (!a_store_obj_dst->value) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return; - } - } + else + a_store_obj_dst->value = DAP_DUP_SIZE_RET_IF_FAIL(a_store_obj_src->value, a_store_obj_src->value_len, + a_store_obj_dst->group, a_store_obj_dst->key, a_store_obj_dst->sign); } } @@ -212,8 +202,7 @@ dap_store_obj_t *l_store_obj, *l_store_obj_dst, *l_store_obj_src; dap_store_obj_t *dap_store_obj_copy_ext(dap_store_obj_t *a_store_obj, void *a_ext, size_t a_ext_size) { - dap_store_obj_t *l_ret; - DAP_NEW_Z_SIZE_RET_VAL(l_ret, dap_store_obj_t, sizeof(dap_store_obj_t) + a_ext_size, NULL, NULL); + dap_store_obj_t *l_ret = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_store_obj_t, sizeof(dap_store_obj_t) + a_ext_size, NULL); s_store_obj_copy_one(l_ret, a_store_obj); if (a_ext_size) memcpy(l_ret->ext, a_ext, a_ext_size); @@ -242,12 +231,10 @@ void dap_store_obj_free(dap_store_obj_t *a_store_obj, size_t a_store_count) if(!a_store_obj || !a_store_count) return; - dap_store_obj_t *l_store_obj_cur = a_store_obj; - - for ( ; a_store_count--; l_store_obj_cur++ ) { - DAP_DEL_MULTY(l_store_obj_cur->group, l_store_obj_cur->key, l_store_obj_cur->value, l_store_obj_cur->sign); + for ( dap_store_obj_t *l_cur = a_store_obj; --a_store_count; ++l_cur ) { + DAP_DEL_MULTY(l_cur->group, l_cur->key, l_cur->value, l_cur->sign); } - DAP_DEL_Z(a_store_obj); + DAP_DELETE(a_store_obj); } /** diff --git a/global-db/dap_global_db_driver_mdbx.c b/global-db/dap_global_db_driver_mdbx.c index bd9da77051c25cb79538e6ea9646f3a847aba623..d5294b173fc190f2f645226a1191bd9d76a4957f 100644 --- a/global-db/dap_global_db_driver_mdbx.c +++ b/global-db/dap_global_db_driver_mdbx.c @@ -550,7 +550,7 @@ int s_fill_store_obj(const char *a_group, MDBX_val *a_key, MDBX_val *a_data, dap DAP_DELETE(a_obj->group); return log_it(L_ERROR, "Ivalid driver record with zero text key length"), -9; } - if ( !(a_obj->key = DAP_DUP_SIZE(l_record->key_n_value_n_sign, l_record->key_len)) ) { + if ( !(a_obj->key = DAP_DUP_SIZE((char*)l_record->key_n_value_n_sign, l_record->key_len)) ) { DAP_DELETE(a_obj->group); return log_it(L_CRITICAL, "Cannot allocate a memory for store object key"), -5; } @@ -565,7 +565,7 @@ int s_fill_store_obj(const char *a_group, MDBX_val *a_key, MDBX_val *a_data, dap if (l_record->sign_len >= sizeof(dap_sign_t)) { dap_sign_t *l_sign = (dap_sign_t *)(l_record->key_n_value_n_sign + l_record->key_len + l_record->value_len); if (dap_sign_get_size(l_sign) != l_record->sign_len || - !(a_obj->sign = (dap_sign_t *)DAP_DUP_SIZE(l_sign, l_record->sign_len))) { + !(a_obj->sign = DAP_DUP_SIZE(l_sign, l_record->sign_len))) { DAP_DELETE(a_obj->group); DAP_DELETE(a_obj->key); DAP_DEL_Z(a_obj->value); @@ -763,14 +763,16 @@ static dap_global_db_pkt_pack_t *s_db_mdbx_get_by_hash(const char *a_group, dap_ } size_t l_data_len = l_record->key_len + l_record->value_len + l_record->sign_len + l_db_ctx->namelen + 1; size_t l_add_size = l_data_len + sizeof(dap_global_db_pkt_t); - l_ret = l_ret ? DAP_REALLOC(l_ret, l_ret->data_size + sizeof(dap_global_db_pkt_pack_t) + l_add_size) - : DAP_NEW_Z_SIZE(dap_global_db_pkt_pack_t, sizeof(dap_global_db_pkt_pack_t) + l_add_size); - if (!l_ret) { + dap_global_db_pkt_pack_t *l_new_pack = l_ret + ? DAP_REALLOC(l_ret, l_ret->data_size + sizeof(dap_global_db_pkt_pack_t) + l_add_size) + : DAP_NEW_Z_SIZE(dap_global_db_pkt_pack_t, sizeof(dap_global_db_pkt_pack_t) + l_add_size); + if (!l_new_pack) { log_it(L_CRITICAL, "Cannot allocate a memory for store object packet"); rc = MDBX_PROBLEM; break; } - dap_global_db_pkt_t *l_pkt = (dap_global_db_pkt_t *)(l_ret->data + l_ret->data_size); + l_ret = l_new_pack; + dap_global_db_pkt_t *l_pkt = (dap_global_db_pkt_t*)(l_ret->data + l_ret->data_size); /* Fill packet header */ if (l_key.iov_len != sizeof(dap_global_db_driver_hash_t)) { @@ -897,10 +899,14 @@ static void *s_db_mdbx_read_cond(const char *a_group, dap_global_db_driver_hash_ DAP_DEL_Z(l_obj_arr); } else { // Add blank object to the end as marker of final itreation - l_count_current++; - if (l_count_current < l_count_out && - !(l_obj_arr = DAP_REALLOC(l_obj_arr, l_element_size * l_count_current + l_addition_size))) - log_it(L_ERROR, "Cannot cut area to keep %zu <store objects>", l_count_current); + ++l_count_current; + if (l_count_current < l_count_out) { + byte_t *l_obj_arr_cut = DAP_REALLOC(l_obj_arr, l_element_size * l_count_current + l_addition_size); + if (!l_obj_arr_cut) + log_it(L_ERROR, "Cannot cut area to keep %zu <store objects>", l_count_current); + else + l_obj_arr = l_obj_arr_cut; + } } } if ( (MDBX_SUCCESS != rc) && (rc != MDBX_NOTFOUND) ) @@ -1056,9 +1062,7 @@ static int s_db_mdbx_apply_store_obj_with_txn(dap_store_obj_t *a_store_obj, MDBX size_t l_record_len = sizeof(struct driver_record) + a_store_obj->value_len + l_key_len; if (a_store_obj->sign) l_record_len += dap_sign_get_size(a_store_obj->sign); - struct driver_record *l_record = DAP_NEW_Z_SIZE(struct driver_record, l_record_len); - if (!l_record) - return log_it(L_CRITICAL, "Cannot allocate memory for new records, %zu bytes, errno=%d", l_record_len, errno), MDBX_PANIC; + struct driver_record *l_record = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(struct driver_record, l_record_len, MDBX_PANIC); dap_strncpy((char *)l_record->key_n_value_n_sign, a_store_obj->key, DAP_GLOBAL_DB_KEY_SIZE_MAX); l_record->key_len = l_key_len; l_record->value_len = a_store_obj->value_len; @@ -1069,12 +1073,12 @@ static int s_db_mdbx_apply_store_obj_with_txn(dap_store_obj_t *a_store_obj, MDBX if (a_store_obj->sign) { /* Put the authorization sign */ l_record->sign_len = dap_sign_get_size(a_store_obj->sign); - memcpy(l_record->key_n_value_n_sign + l_key_len + a_store_obj->value_len, a_store_obj->sign, l_record->sign_len); if (!l_record->sign_len) { DAP_DELETE(l_record); log_it(L_ERROR, "Global DB store object sign corrupted"); return MDBX_EINVAL; } + memcpy(l_record->key_n_value_n_sign + l_key_len + a_store_obj->value_len, a_store_obj->sign, l_record->sign_len); } /* So, finaly: do INSERT, COMMIT or ABORT ... */ l_data.iov_base = l_record; /* Fill IOV for MDBX data */ @@ -1240,9 +1244,11 @@ MDBX_txn *l_txn = s_txn; if (!l_count_current) { DAP_DEL_Z(l_obj_arr); } else if (l_count_current < l_count_out) { - l_obj_arr = DAP_REALLOC(l_obj_arr, l_count_current * sizeof(dap_store_obj_t)); - if (!l_obj_arr) + dap_store_obj_t *l_obj_arr_cut = DAP_REALLOC_COUNT(l_obj_arr, l_count_current); + if (!l_obj_arr_cut) log_it(L_ERROR, "Cannot cut area to keep %zu <store objects>", l_count_current); + else + l_obj_arr = l_obj_arr_cut; } } safe_ret: diff --git a/global-db/dap_global_db_driver_pgsql.c b/global-db/dap_global_db_driver_pgsql.c index a46f176dc0f60a79c648b325b69ed075332ff876..68eb21f53c927b6e7f64b2efe0bd2dc6d0e45b78 100644 --- a/global-db/dap_global_db_driver_pgsql.c +++ b/global-db/dap_global_db_driver_pgsql.c @@ -359,17 +359,22 @@ int dap_db_driver_pgsql_apply_store_obj(dap_store_obj_t *a_store_obj) static void s_pgsql_fill_object(const char *a_group, dap_store_obj_t *a_obj, PGresult *a_res, int a_row) { a_obj->group = dap_strdup(a_group); - - for (int i = 0; i < PQnfields(a_res); i++) { - if (i == PQfnumber(a_res, "obj_id")) { - a_obj->id = be64toh(*(uint64_t *)PQgetvalue(a_res, a_row, i)); - } else if (i == PQfnumber(a_res, "obj_ts")) { - a_obj->timestamp = be64toh(*(time_t *)PQgetvalue(a_res, a_row, i)); - } else if ((i == PQfnumber(a_res, "obj_key"))) { - a_obj->key = dap_strdup(PQgetvalue(a_res, a_row, i)); - } else if ((i == PQfnumber(a_res, "obj_val"))) { - a_obj->value_len = PQgetlength(a_res, a_row, i); - a_obj->value = DAP_DUP_SIZE(PQgetvalue(a_res, a_row, i), a_obj->value_len); + int q = PQnfields(a_res); + while (q-- > 0) { + switch (q) { + case PQfnumber(a_res, "obj_val"): + a_obj->value_len = PQgetlength(a_res, a_row, q); + a_obj->value = DAP_DUP_SIZE(PQgetvalue(a_res, a_row, q), a_obj->value_len); + break; + case PQfnumber(a_res, "obj_key"): + a_obj->key = dap_strdup(PQgetvalue(a_res, a_row, q)); + break; + case PQfnumber(a_res, "obj_ts"): + a_obj->timestamp = be64toh(*(time_t*)PQgetvalue(a_res, a_row, q)); + break; + case PQfnumber(a_res, "obj_id"): + a_obj->id = be64toh(*(uint64_t*)PQgetvalue(a_res, a_row, q)); + break; } } } @@ -414,11 +419,16 @@ dap_store_obj_t *dap_db_driver_pgsql_read_store_obj(const char *a_group, const c // parse reply size_t l_count = PQntuples(l_res); - dap_store_obj_t *l_obj = l_count ? DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(dap_store_obj_t) * l_count) : NULL; - for (int i = 0; i < l_count; i++) { - // fill currrent item - dap_store_obj_t *l_obj_cur = l_obj + i; - s_pgsql_fill_object(a_group, l_obj_cur, l_res, i); + if (l_count) { + dap_store_obj_t *l_obj = DAP_NEW_Z_COUNT(dap_store_obj_t, l_count); + if (!l_obj) { + log_it(L_ERROR, "Memory allocation error"); + l_count = 0; + } else { + for (int i = 0; i < l_count; ++i) { + s_pgsql_fill_object(a_group, (dap_store_obj_t*)(l_obj + i), l_res, i); + } + } } PQclear(l_res); s_pgsql_free_connection(l_conn); @@ -499,11 +509,16 @@ dap_store_obj_t *dap_db_driver_pgsql_read_cond_store_obj(const char *a_group, ui // parse reply size_t l_count = PQntuples(l_res); - dap_store_obj_t *l_obj = l_count ? DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(dap_store_obj_t) * l_count) : NULL; - for (int i = 0; i < l_count; i++) { - // fill currrent item - dap_store_obj_t *l_obj_cur = l_obj + i; - s_pgsql_fill_object(a_group, l_obj_cur, l_res, i); + if (l_count) { + dap_store_obj_t *l_obj = DAP_NEW_Z_COUNT(dap_store_obj_t, l_count); + if (!l_obj) { + log_it(L_ERROR, "Memory allocation error"); + l_count = 0; + } else { + for (int i = 0; i < l_count; ++i) { + s_pgsql_fill_object(a_group, (dap_store_obj_t*)(l_obj + i), l_res, i); + } + } } PQclear(l_res); s_pgsql_free_connection(l_conn); diff --git a/global-db/dap_global_db_driver_sqlite.c b/global-db/dap_global_db_driver_sqlite.c index c19319e4346af0ed142709656ab7cd5a5e69f4ae..1a53bbec787caefdfcf7f053438c8718953e3324 100644 --- a/global-db/dap_global_db_driver_sqlite.c +++ b/global-db/dap_global_db_driver_sqlite.c @@ -243,7 +243,7 @@ static conn_list_item_t *s_db_sqlite_get_connection(bool a_trans) // func work static int l_conn_idx = 0; if (!s_conn) { - DAP_NEW_Z_RET_VAL(s_conn, conn_list_item_t, NULL, NULL); + s_conn = DAP_NEW_Z_RET_VAL_IF_FAIL(conn_list_item_t, NULL); pthread_key_t s_destructor_key; pthread_key_create(&s_destructor_key, s_connection_destructor); pthread_setspecific(s_destructor_key, (const void *)s_conn); @@ -300,12 +300,11 @@ static int s_db_sqlite_create_group_table(const char *a_table_name, conn_list_it { // sanity check dap_return_val_if_pass(!a_table_name || !a_conn, -EINVAL); - char l_query[512]; - - snprintf(l_query, sizeof(l_query) - 1, - "CREATE TABLE IF NOT EXISTS '%s'(driver_key BLOB UNIQUE NOT NULL PRIMARY KEY ON CONFLICT REPLACE, key TEXT UNIQUE NOT NULL, flags INTEGER, value BLOB, sign BLOB)", - a_table_name); - return s_db_sqlite_exec(a_conn->conn, l_query, NULL, NULL, 0, NULL); + char *l_query = dap_strdup_printf("CREATE TABLE IF NOT EXISTS '%s'" + "(driver_key BLOB UNIQUE NOT NULL PRIMARY KEY ON CONFLICT REPLACE, key TEXT UNIQUE NOT NULL, flags INTEGER, value BLOB, sign BLOB)", + a_table_name); + int l_ret = s_db_sqlite_exec(a_conn->conn, l_query, NULL, NULL, 0, NULL); + return DAP_DELETE(l_query), l_ret; } /** @@ -326,8 +325,7 @@ int s_db_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) return -2; int l_ret = 0; - char *l_query = NULL; - char *l_table_name = dap_str_replace_char(a_store_obj->group, '.', '_'); + char *l_query = NULL, *l_table_name = dap_str_replace_char(a_store_obj->group, '.', '_'); if (!l_type_erase) { if (!a_store_obj->key) { log_it(L_ERROR, "Global DB store object unsigned"); @@ -377,29 +375,28 @@ static int s_db_sqlite_fill_one_item(const char *a_group, dap_store_obj_t *a_obj goto clean_and_ret; a_obj->group = dap_strdup(a_group); size_t l_count_col = sqlite3_column_count(a_stmt); - for(size_t i = 0; i < l_count_col; ++i) { - if (i == 0 && sqlite3_column_type(a_stmt, i) == SQLITE_BLOB) { - dap_global_db_driver_hash_t *l_driver_key = (dap_global_db_driver_hash_t *)sqlite3_column_blob(a_stmt, i); - a_obj->timestamp = be64toh(l_driver_key->bets); - a_obj->crc = be64toh(l_driver_key->becrc); - continue; - } - if (i == 1 && sqlite3_column_type(a_stmt, i) == SQLITE_TEXT) { - a_obj->key = dap_strdup((const char *)sqlite3_column_text(a_stmt, i)); - continue; - } - if (i == 2 && sqlite3_column_type(a_stmt, i) == SQLITE_INTEGER) { - a_obj->flags = sqlite3_column_int64(a_stmt, i); - continue; - } - if (i == 3 && sqlite3_column_type(a_stmt, i) == SQLITE_BLOB) { - a_obj->value_len = sqlite3_column_bytes(a_stmt, i); - a_obj->value = DAP_DUP_SIZE(sqlite3_column_blob(a_stmt, i), a_obj->value_len); - continue; - } - if (i == 4 && sqlite3_column_type(a_stmt, i) == SQLITE_BLOB) { - a_obj->sign = DAP_DUP_SIZE(sqlite3_column_blob(a_stmt, i), sqlite3_column_bytes(a_stmt, i)); - continue; + for (size_t i = 0; i < l_count_col; ++i) { + switch ( sqlite3_column_type(a_stmt, i) ) { + case SQLITE_BLOB: + if ( i == 0 ) { + dap_global_db_driver_hash_t *l_driver_key = (dap_global_db_driver_hash_t *)sqlite3_column_blob(a_stmt, i); + a_obj->timestamp = be64toh(l_driver_key->bets); + a_obj->crc = be64toh(l_driver_key->becrc); + } else if ( i == 3 ) { + a_obj->value_len = sqlite3_column_bytes(a_stmt, i); + a_obj->value = DAP_DUP_SIZE((byte_t*)sqlite3_column_blob(a_stmt, i), a_obj->value_len); + } else if ( i == 4 ) { + a_obj->sign = DAP_DUP_SIZE((dap_sign_t*)sqlite3_column_blob(a_stmt, i), sqlite3_column_bytes(a_stmt, i)); + } continue; + case SQLITE_TEXT: + if ( i == 1 ) { + a_obj->key = dap_strdup((const char*)sqlite3_column_text(a_stmt, i)); + } continue; + case SQLITE_INTEGER: + if ( i == 2 ) { + a_obj->flags = sqlite3_column_int64(a_stmt, i); + } continue; + default: continue; } } clean_and_ret: @@ -471,19 +468,15 @@ static dap_global_db_pkt_pack_t *s_db_sqlite_get_by_hash(const char *a_group, da const char *l_error_msg = "get by hash"; dap_global_db_pkt_pack_t *l_ret = NULL; sqlite3_stmt *l_stmt_count = NULL, *l_stmt = NULL, *l_stmt_size = NULL; - char *l_blob_str = DAP_NEW_Z_SIZE(char, a_count * 2); - char *l_table_name = dap_str_replace_char(a_group, '.', '_'); + char *l_table_name = dap_str_replace_char(a_group, '.', '_'), *l_blob_str = DAP_NEW_Z_SIZE(char, a_count * 2); if (!l_blob_str || !l_table_name) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_MULTY(l_table_name, l_blob_str); return NULL; } - for (size_t i = 0; i < a_count * 2; i += 2) { - l_blob_str[i] = '?'; - } - for (size_t i = 1; i + 1 < a_count * 2; i += 2) { - l_blob_str[i] = ','; - } + for (size_t k = 0; k < a_count; memcpy(l_blob_str + 2 * (k++), "?,", 2)); + l_blob_str[2 * a_count - 1] = '\0'; + char *l_str_query_count = sqlite3_mprintf("SELECT COUNT(*) FROM '%s' " " WHERE driver_key IN (%s)", l_table_name, l_blob_str); @@ -493,94 +486,111 @@ static dap_global_db_pkt_pack_t *s_db_sqlite_get_by_hash(const char *a_group, da char *l_str_query = sqlite3_mprintf("SELECT * FROM '%s'" " WHERE driver_key IN (%s) ORDER BY driver_key", l_table_name, l_blob_str); + DAP_DEL_MULTY(l_table_name, l_blob_str); if (!l_str_query_count || !l_str_query) { log_it(L_ERROR, "Error in SQL request forming"); goto clean_and_ret; } - if(s_db_sqlite_prepare(l_conn->conn, l_str_query_count, &l_stmt_count, l_error_msg)!= SQLITE_OK || - s_db_sqlite_prepare(l_conn->conn, l_str_query_size, &l_stmt_size, l_error_msg)!= SQLITE_OK || - s_db_sqlite_prepare(l_conn->conn, l_str_query, &l_stmt, l_error_msg)!= SQLITE_OK) + if( s_db_sqlite_prepare(l_conn->conn, l_str_query_count, &l_stmt_count, l_error_msg)!= SQLITE_OK || + s_db_sqlite_prepare(l_conn->conn, l_str_query_size, &l_stmt_size, l_error_msg) != SQLITE_OK || + s_db_sqlite_prepare(l_conn->conn, l_str_query, &l_stmt, l_error_msg) != SQLITE_OK ) { goto clean_and_ret; } for (size_t i = 1; i <= a_count; ++i) { - if( s_db_sqlite_bind_blob64(l_stmt_count, i, a_hashes + i - 1, sizeof(*a_hashes), SQLITE_STATIC, l_error_msg) != SQLITE_OK || + if( s_db_sqlite_bind_blob64(l_stmt_count, i,a_hashes + i - 1, sizeof(*a_hashes), SQLITE_STATIC, l_error_msg) != SQLITE_OK || s_db_sqlite_bind_blob64(l_stmt_size, i, a_hashes + i - 1, sizeof(*a_hashes), SQLITE_STATIC, l_error_msg) != SQLITE_OK || - s_db_sqlite_bind_blob64(l_stmt, i, a_hashes + i - 1, sizeof(*a_hashes), SQLITE_STATIC, l_error_msg) != SQLITE_OK) + s_db_sqlite_bind_blob64(l_stmt, i, a_hashes + i - 1, sizeof(*a_hashes), SQLITE_STATIC, l_error_msg) != SQLITE_OK ) { goto clean_and_ret; } } - if (s_db_sqlite_step(l_stmt_count, l_error_msg) != SQLITE_ROW || s_db_sqlite_step(l_stmt_size, l_error_msg) != SQLITE_ROW) { + if ( s_db_sqlite_step(l_stmt_count, l_error_msg) != SQLITE_ROW || s_db_sqlite_step(l_stmt_size, l_error_msg) != SQLITE_ROW ) { goto clean_and_ret; } // memory alloc - uint64_t l_count = sqlite3_column_int64(l_stmt_count, 0); - uint64_t l_size = sqlite3_column_int64(l_stmt_size, 0); - if (!l_count || !l_size) { + int64_t i, j, l_count = sqlite3_column_int64(l_stmt_count, 0), l_size = sqlite3_column_int64(l_stmt_size, 0); + if ( l_count <= 0 || l_size <= 0 ) { log_it(L_INFO, "There are no records satisfying the get by hash request"); goto clean_and_ret; } size_t l_group_name_len = strlen(a_group) + 1; size_t l_data_size = l_count * (sizeof(dap_global_db_pkt_t) + l_group_name_len + 1) + l_size; - DAP_NEW_Z_SIZE_RET_VAL(l_ret, dap_global_db_pkt_pack_t, sizeof(dap_global_db_pkt_pack_t) + l_data_size, NULL, l_str_query_count, l_str_query); -// data forming - for (size_t i = 0; i < l_count && l_ret->data_size < l_data_size && s_db_sqlite_step(l_stmt, l_error_msg) == SQLITE_ROW; ++i) { - dap_global_db_pkt_t *l_cur_pkt = (dap_global_db_pkt_t *)(l_ret->data + l_ret->data_size); - size_t l_count_col = sqlite3_column_count(l_stmt); - l_cur_pkt->group_len = l_group_name_len; - memcpy(l_cur_pkt->data, a_group, l_cur_pkt->group_len); - l_cur_pkt->data_len += l_cur_pkt->group_len; - for (size_t j = 0; j < l_count_col; ++j) { - if (j == 0 && sqlite3_column_type(l_stmt, j) == SQLITE_BLOB) { - if (sqlite3_column_bytes(l_stmt, j)) { - dap_global_db_driver_hash_t *l_driver_key = (dap_global_db_driver_hash_t *)sqlite3_column_blob(l_stmt, j); + l_ret = DAP_NEW_Z_SIZE(dap_global_db_pkt_pack_t, sizeof(dap_global_db_pkt_pack_t) + l_data_size); + if ( !l_ret ) { + log_it(L_CRITICAL, "Memory allocation error!"); + goto clean_and_ret; + } + byte_t *l_data_pos = l_ret->data, *l_data_end = l_data_pos + l_data_size; + for (i = 0; i < l_count && s_db_sqlite_step(l_stmt, l_error_msg) == SQLITE_ROW; ++i) { + dap_global_db_pkt_t *l_cur_pkt = (dap_global_db_pkt_t*)(l_data_pos); + l_data_pos = l_cur_pkt->data; + if ( l_data_pos + l_group_name_len > l_data_end ) + break; + l_data_pos = dap_mempcpy(l_data_pos, a_group, l_cur_pkt->group_len = l_group_name_len); + int l_count_col = sqlite3_column_count(l_stmt); + for (j = 0; j < l_count_col; ++j) { + switch ( sqlite3_column_type(l_stmt, j) ) { + case SQLITE_BLOB: + if ( j == 0 ) { + dap_global_db_driver_hash_t *l_driver_key = (dap_global_db_driver_hash_t*)sqlite3_column_blob(l_stmt, j); l_cur_pkt->timestamp = be64toh(l_driver_key->bets); l_cur_pkt->crc = be64toh(l_driver_key->becrc); - } - continue; - } - if (j == 1 && sqlite3_column_type(l_stmt, j) == SQLITE_TEXT) { - l_cur_pkt->key_len = sqlite3_column_bytes(l_stmt, j); - memcpy(l_cur_pkt->data + l_cur_pkt->data_len, sqlite3_column_text(l_stmt, j), l_cur_pkt->key_len); - l_cur_pkt->key_len++; - l_cur_pkt->data_len += l_cur_pkt->key_len; - continue; - } - if (j == 2 && sqlite3_column_type(l_stmt, j) == SQLITE_INTEGER) { - if (sqlite3_column_bytes(l_stmt, j)) - l_cur_pkt->flags = sqlite3_column_int64(l_stmt, j) & DAP_GLOBAL_DB_RECORD_DEL; - continue; - } - if (j == 3 && sqlite3_column_type(l_stmt, j) == SQLITE_BLOB) { - l_cur_pkt->value_len = sqlite3_column_bytes(l_stmt, j); - memcpy(l_cur_pkt->data + l_cur_pkt->data_len, sqlite3_column_blob(l_stmt, j), l_cur_pkt->value_len); - l_cur_pkt->data_len += l_cur_pkt->value_len; - continue; - } - if (j == 4 && sqlite3_column_type(l_stmt, j) == SQLITE_BLOB) { - size_t l_sign_size = sqlite3_column_bytes(l_stmt, j); - if (l_sign_size) { - dap_sign_t *l_sign = (dap_sign_t *)sqlite3_column_blob(l_stmt, j); - if (l_sign_size != dap_sign_get_size(l_sign)) { - log_it(L_ERROR, "Wrong sign size from global_db"); - goto clean_and_ret; + } else if ( j == 3 ) { + l_cur_pkt->value_len = sqlite3_column_bytes(l_stmt, j); + if ( l_data_pos + l_cur_pkt->value_len > l_data_end ) + break; + l_data_pos = dap_mempcpy(l_data_pos, sqlite3_column_blob(l_stmt, j), l_cur_pkt->value_len); + } else if ( j == 4 ) { + size_t l_sign_size = sqlite3_column_bytes(l_stmt, j); + if (l_sign_size) { + dap_sign_t *l_sign = (dap_sign_t*)sqlite3_column_blob(l_stmt, j); + if ( dap_sign_get_size(l_sign) != l_sign_size || l_data_pos + l_sign_size > l_data_end ) { + log_it(L_ERROR, "Wrong sign size in GDB group %s", a_group); + break; + } + l_data_pos = dap_mempcpy(l_data_pos, sqlite3_column_blob(l_stmt, j), l_sign_size); } - memcpy(l_cur_pkt->data + l_cur_pkt->data_len, sqlite3_column_blob(l_stmt, j), l_sign_size); - l_cur_pkt->data_len += l_sign_size; - } + } continue; + case SQLITE_TEXT: + if ( j == 1 ) { + l_cur_pkt->key_len = sqlite3_column_bytes(l_stmt, j); + if ( l_data_pos + l_cur_pkt->key_len > l_data_end ) + break; + l_data_pos = dap_mempcpy(l_data_pos, sqlite3_column_text(l_stmt, j), l_cur_pkt->key_len++) + 1; + } continue; + case SQLITE_INTEGER: + if ( j == 2 ) { + if (sqlite3_column_bytes(l_stmt, j)) + l_cur_pkt->flags = sqlite3_column_int64(l_stmt, j) & DAP_GLOBAL_DB_RECORD_DEL; + } continue; + default: continue; } + // Some break occured, escape from loops + j = -1; + break; } - l_ret->data_size += sizeof(dap_global_db_pkt_t) + l_cur_pkt->data_len; - l_ret->obj_count++; + if ( j == -1 ) { + l_data_pos = (byte_t*)l_cur_pkt; + break; + } + l_cur_pkt->data_len = (uint32_t)(l_data_pos - l_cur_pkt->data); + l_ret->data_size = (uint64_t)(l_data_pos - l_ret->data); } - if (l_ret->data_size != l_data_size) { - log_it(L_ERROR, "Wrong pkt pack size %"DAP_UINT64_FORMAT_U", expected %zu", l_ret->data_size, l_data_size); + l_ret->obj_count = i; + if (i < l_count) { + log_it(L_ERROR, "Invalid pack size, only %ld / %ld pkts (%zu / %zu bytes) fit the storage", + i, l_count, l_ret->data_size, l_data_size); + size_t l_new_size = (size_t)(l_data_pos - (byte_t*)l_ret); + dap_global_db_pkt_pack_t *l_new_pack = DAP_REALLOC(l_ret, l_new_size); + if (l_new_pack) + l_ret = l_new_pack; + else + DAP_DEL_Z(l_ret); } clean_and_ret: s_db_sqlite_clean(l_conn, 3, l_str_query, l_str_query_count, l_str_query_size, l_stmt, l_stmt_count, l_stmt_size); - DAP_DEL_MULTY(l_table_name, l_blob_str); return l_ret; } @@ -632,17 +642,26 @@ static dap_global_db_hash_pkt_t *s_db_sqlite_read_hashes(const char *a_group, da l_blank_add = l_count == l_blank_add; l_count += l_blank_add; size_t l_group_name_len = strlen(a_group) + 1; - DAP_NEW_Z_SIZE_RET_VAL(l_ret, dap_global_db_hash_pkt_t, sizeof(dap_global_db_hash_pkt_t) + l_count * sizeof(dap_global_db_driver_hash_t) + l_group_name_len, NULL, l_str_query_count, l_str_query); + l_ret = DAP_NEW_Z_SIZE(dap_global_db_hash_pkt_t, sizeof(dap_global_db_hash_pkt_t) + l_count * sizeof(dap_global_db_driver_hash_t) + l_group_name_len); + if (!l_ret) { + log_it(L_CRITICAL, "Memory allocation error!"); + goto clean_and_ret; + } // data forming - size_t l_count_out = 0; + size_t l_count_out; l_ret->group_name_len = l_group_name_len; - byte_t *l_curr_point = l_ret->group_n_hashses + l_ret->group_name_len; - memcpy(l_ret->group_n_hashses, a_group, l_group_name_len); - int l_count_col = sqlite3_column_count(l_stmt); - for(;l_count_out < l_count && s_db_sqlite_step(l_stmt, l_error_msg) == SQLITE_ROW && sqlite3_column_type(l_stmt, 0) == SQLITE_BLOB; ++l_count_out) { - byte_t *l_current_hash = (byte_t*) sqlite3_column_blob(l_stmt, 0); - memcpy(l_curr_point, l_current_hash, sizeof(dap_global_db_driver_hash_t)); - l_curr_point += sizeof(dap_global_db_driver_hash_t); + byte_t *l_pos = dap_mempcpy(l_ret->group_n_hashses, a_group, l_group_name_len); + + for ( l_count_out = 0; l_count_out < l_count + && s_db_sqlite_step(l_stmt, l_error_msg) == SQLITE_ROW + && sqlite3_column_type(l_stmt, 0) == SQLITE_BLOB; + ++l_count_out ) + { + if ( sqlite3_column_bytes(l_stmt, 0) != sizeof(dap_global_db_driver_hash_t) ) { + log_it(L_ERROR, "Invalid hash size, skip record"); + continue; + } + l_pos = dap_mempcpy(l_pos, sqlite3_column_blob(l_stmt, 0), sizeof(dap_global_db_driver_hash_t)); } l_ret->hashes_count = l_count_out + l_blank_add; clean_and_ret: @@ -679,23 +698,22 @@ static dap_store_obj_t* s_db_sqlite_read_cond_store_obj(const char *a_group, dap l_table_name, DAP_GLOBAL_DB_RECORD_DEL, a_with_holes ? ">=" : "=", a_count_out && *a_count_out ? (int)*a_count_out : (int)DAP_GLOBAL_DB_COND_READ_COUNT_DEFAULT); - DAP_DEL_Z(l_table_name); + DAP_DELETE(l_table_name); if (!l_str_query_count || !l_str_query) { log_it(L_ERROR, "Error in SQL request forming"); goto clean_and_ret; } - if(s_db_sqlite_prepare(l_conn->conn, l_str_query_count, &l_stmt_count, l_error_msg)!= SQLITE_OK || + if( s_db_sqlite_prepare(l_conn->conn, l_str_query_count, &l_stmt_count, l_error_msg) != SQLITE_OK || s_db_sqlite_bind_blob64(l_stmt_count, 1, &a_hash_from, sizeof(a_hash_from), SQLITE_STATIC, l_error_msg) != SQLITE_OK || - s_db_sqlite_prepare(l_conn->conn, l_str_query, &l_stmt, l_error_msg)!= SQLITE_OK || - s_db_sqlite_bind_blob64(l_stmt, 1, &a_hash_from, sizeof(a_hash_from), SQLITE_STATIC, l_error_msg) != SQLITE_OK || - s_db_sqlite_step(l_stmt_count, l_error_msg) != SQLITE_ROW) + s_db_sqlite_prepare(l_conn->conn, l_str_query, &l_stmt, l_error_msg) != SQLITE_OK || + s_db_sqlite_bind_blob64(l_stmt, 1, &a_hash_from, sizeof(a_hash_from), SQLITE_STATIC, l_error_msg) != SQLITE_OK || + s_db_sqlite_step(l_stmt_count, l_error_msg) != SQLITE_ROW ) { goto clean_and_ret; } // memory alloc - uint64_t l_count = sqlite3_column_int64(l_stmt_count, 0); - uint64_t l_blank_add = l_count; + uint64_t l_count = sqlite3_column_int64(l_stmt_count, 0), l_blank_add = l_count; l_count = a_count_out && *a_count_out ? dap_min(l_count, *a_count_out) : dap_min(l_count, DAP_GLOBAL_DB_COND_READ_COUNT_DEFAULT); if (!l_count) { log_it(L_INFO, "There are no records satisfying the conditional read request"); @@ -703,16 +721,16 @@ static dap_store_obj_t* s_db_sqlite_read_cond_store_obj(const char *a_group, dap } l_blank_add = l_count == l_blank_add; l_count += l_blank_add; - DAP_NEW_Z_COUNT_RET_VAL(l_ret, dap_store_obj_t, l_count, NULL, l_str_query_count, l_str_query); + if (!( l_ret = DAP_NEW_Z_COUNT(dap_store_obj_t, l_count) )) { + log_it(L_CRITICAL, "Memory allocation error"); + goto clean_and_ret; + } // data forming size_t l_count_out = 0; - int l_ret_code = 0; - for (l_ret_code = s_db_sqlite_fill_one_item(a_group, l_ret + l_count_out, l_stmt); - l_ret_code == SQLITE_ROW && l_count_out < l_count; - ++l_count_out, l_ret_code = s_db_sqlite_fill_one_item(a_group, l_ret + l_count_out, l_stmt)) {} - if(l_ret_code != SQLITE_DONE) { + int rc; + for ( rc = 0; l_count_out < l_count && SQLITE_ROW == ( rc = s_db_sqlite_fill_one_item(a_group, l_ret + l_count_out, l_stmt) ); ++l_count_out ); + if ( rc != SQLITE_DONE ) log_it(L_ERROR, "SQLite conditional read error %d(%s)", sqlite3_errcode(l_conn->conn), sqlite3_errmsg(l_conn->conn)); - } if (a_count_out) *a_count_out = l_count_out + l_blank_add; clean_and_ret: @@ -769,16 +787,17 @@ static dap_store_obj_t* s_db_sqlite_read_store_obj(const char *a_group, const ch log_it(L_INFO, "There are no records satisfying the read request"); goto clean_and_ret; } - DAP_NEW_Z_COUNT_RET_VAL(l_ret, dap_store_obj_t, l_count, NULL, l_str_query_count, l_str_query); + if (!( l_ret = DAP_NEW_Z_COUNT(dap_store_obj_t, l_count) )) { + log_it(L_CRITICAL, "Memory allocation error"); + goto clean_and_ret; + } + // data forming size_t l_count_out = 0; - int l_ret_code = 0; - for (l_ret_code = s_db_sqlite_fill_one_item(a_group, l_ret + l_count_out, l_stmt); - l_ret_code == SQLITE_ROW && l_count_out < l_count; - ++l_count_out, l_ret_code = s_db_sqlite_fill_one_item(a_group, l_ret + l_count_out, l_stmt)) {} - if(l_ret_code != SQLITE_DONE) { + int rc; + for ( rc = 0; l_count_out < l_count && SQLITE_ROW == ( rc = s_db_sqlite_fill_one_item(a_group, l_ret + l_count_out, l_stmt) ); ++l_count_out ); + if ( rc != SQLITE_DONE ) log_it(L_ERROR, "SQLite read error %d(%s)", sqlite3_errcode(l_conn->conn), sqlite3_errmsg(l_conn->conn)); - } if (a_count_out) *a_count_out = l_count_out; clean_and_ret: @@ -794,8 +813,8 @@ clean_and_ret: static dap_list_t *s_db_sqlite_get_groups_by_mask(const char *a_group_mask) { // sanity check - conn_list_item_t *l_conn = NULL; - dap_return_val_if_pass(!a_group_mask || !(l_conn = s_db_sqlite_get_connection(false)), NULL); + conn_list_item_t *l_conn = s_db_sqlite_get_connection(false); + dap_return_val_if_pass(!a_group_mask || !l_conn, NULL); // preparing const char *l_error_msg = "get groups"; dap_list_t* l_ret = NULL; @@ -811,15 +830,14 @@ static dap_list_t *s_db_sqlite_get_groups_by_mask(const char *a_group_mask) goto clean_and_ret; } l_mask = dap_str_replace_char(a_group_mask, '.', '_'); - int l_ret_code = 0; - for (l_ret_code = s_db_sqlite_step(l_stmt, l_error_msg); l_ret_code == SQLITE_ROW && sqlite3_column_type(l_stmt, 0) == SQLITE_TEXT; l_ret_code = s_db_sqlite_step(l_stmt, l_error_msg)) { - const char *l_table_name = (const char *)sqlite3_column_text(l_stmt, 0); + int rc = 0; + while ( SQLITE_ROW == ( rc = s_db_sqlite_step(l_stmt, l_error_msg) ) && sqlite3_column_type(l_stmt, 0) == SQLITE_TEXT ) { + const char *l_table_name = (const char*)sqlite3_column_text(l_stmt, 0); if (dap_global_db_group_match_mask(l_table_name, l_mask)) l_ret = dap_list_prepend(l_ret, dap_str_replace_char(l_table_name, '_', '.')); } - if(l_ret_code != SQLITE_DONE) { + if ( rc != SQLITE_DONE ) log_it(L_ERROR, "SQLite read error %d(%s)", sqlite3_errcode(l_conn->conn), sqlite3_errmsg(l_conn->conn)); - } clean_and_ret: s_db_sqlite_clean(l_conn, 1, l_str_query, l_stmt); DAP_DEL_Z(l_mask); @@ -1022,8 +1040,8 @@ int dap_global_db_driver_sqlite_init(const char *a_filename_db, dap_global_db_dr dap_return_val_if_pass(!a_filename_db, -1); dap_return_val_if_pass_err(s_db_inited, -2, "SQLite driver already init") // func work - int l_ret = -1, l_errno = errno; - char l_errbuf[255] = {0}, *l_error_message = NULL; + int l_ret = -1; + char l_errbuf[255] = "", *l_error_message = NULL; if ( sqlite3_threadsafe() && !sqlite3_config(SQLITE_CONFIG_MULTITHREAD) ) l_ret = sqlite3_initialize(); @@ -1040,13 +1058,12 @@ int dap_global_db_driver_sqlite_init(const char *a_filename_db, dap_global_db_dr log_it(L_NOTICE, "No directory %s, trying to create...",l_filename_dir); int l_mkdir_ret = dap_mkdir_with_parents(l_filename_dir); - l_errno = errno; if(!dap_dir_test(l_filename_dir)){ - strerror_r(l_errno,l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR, "Can't create directory, error code %d, error string \"%s\"", l_mkdir_ret, l_errbuf); + log_it(L_ERROR, "Can't create directory, error code %d, error %d: \"%s\"", + l_mkdir_ret, errno, dap_strerror(errno)); DAP_DELETE(l_filename_dir); - return -l_errno; + return -errno; }else log_it(L_NOTICE, "Directory created"); } diff --git a/global-db/dap_global_db_legacy.c b/global-db/dap_global_db_legacy.c index f5cc9e010572788674fe13a6216d72d9a5c58297..7a89f1187ddbc738e94f1e60cda55c222d7c05fe 100644 --- a/global-db/dap_global_db_legacy.c +++ b/global-db/dap_global_db_legacy.c @@ -68,8 +68,7 @@ dap_global_db_legacy_list_t *dap_global_db_legacy_list_start(const char *a_net_n if (!l_items_number) return NULL; - dap_global_db_legacy_list_t *l_db_legacy_list; - DAP_NEW_Z_RET_VAL(l_db_legacy_list, dap_global_db_legacy_list_t, NULL, NULL); + dap_global_db_legacy_list_t *l_db_legacy_list = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_global_db_legacy_list_t, NULL); l_db_legacy_list->groups = l_db_legacy_list->current_group = l_groups; l_db_legacy_list->items_rest = l_db_legacy_list->items_number = l_items_number; @@ -154,13 +153,10 @@ dap_global_db_pkt_old_t *dap_global_db_pkt_pack_old(dap_global_db_pkt_old_t *a_o { if (!a_new_pkt) return a_old_pkt; - a_old_pkt = a_old_pkt - ? DAP_REALLOC(a_old_pkt, sizeof(dap_global_db_pkt_old_t) + a_old_pkt->data_size + a_new_pkt->data_size) - : DAP_NEW_Z_SIZE(dap_global_db_pkt_old_t, sizeof(dap_global_db_pkt_old_t) + a_new_pkt->data_size); - if (!a_old_pkt) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return NULL; - } + dap_global_db_pkt_old_t *l_old_pkt_new = a_old_pkt + ? DAP_REALLOC_RET_VAL_IF_FAIL(a_old_pkt, sizeof(dap_global_db_pkt_old_t) + a_old_pkt->data_size + a_new_pkt->data_size, NULL) + : DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_global_db_pkt_old_t, sizeof(dap_global_db_pkt_old_t) + a_new_pkt->data_size, NULL); + a_old_pkt = l_old_pkt_new; memcpy(a_old_pkt->data + a_old_pkt->data_size, a_new_pkt->data, a_new_pkt->data_size); a_old_pkt->data_size += a_new_pkt->data_size; ++a_old_pkt->obj_count; diff --git a/global-db/dap_global_db_pkt.c b/global-db/dap_global_db_pkt.c index ef832a4f85beb4ce7319fca355c09a6e53d07491..5565c4a9c464c12c0926a004000015e3040443b6 100644 --- a/global-db/dap_global_db_pkt.c +++ b/global-db/dap_global_db_pkt.c @@ -41,14 +41,12 @@ dap_global_db_pkt_pack_t *dap_global_db_pkt_pack(dap_global_db_pkt_pack_t *a_old if (!a_new_pkt) return a_old_pkt; size_t l_add_size = dap_global_db_pkt_get_size(a_new_pkt); - dap_global_db_pkt_pack_t *l_old_pkt; - if (a_old_pkt) - l_old_pkt = (dap_global_db_pkt_pack_t *)DAP_REALLOC(a_old_pkt, a_old_pkt->data_size + sizeof(dap_global_db_pkt_pack_t) + l_add_size); - else - DAP_NEW_Z_SIZE_RET_VAL(l_old_pkt, dap_global_db_pkt_pack_t, sizeof(dap_global_db_pkt_pack_t) + l_add_size, a_old_pkt, NULL); + dap_global_db_pkt_pack_t *l_old_pkt = !a_old_pkt + ? DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_global_db_pkt_pack_t, sizeof(dap_global_db_pkt_pack_t) + l_add_size, NULL) + : DAP_REALLOC_RET_VAL_IF_FAIL(a_old_pkt, a_old_pkt->data_size + sizeof(dap_global_db_pkt_pack_t) + l_add_size, NULL); memcpy(l_old_pkt->data + l_old_pkt->data_size, a_new_pkt, l_add_size); l_old_pkt->data_size += l_add_size; - l_old_pkt->obj_count++; + ++l_old_pkt->obj_count; return l_old_pkt; } @@ -60,16 +58,11 @@ dap_global_db_pkt_pack_t *dap_global_db_pkt_pack(dap_global_db_pkt_pack_t *a_old dap_global_db_pkt_t *dap_global_db_pkt_serialize(dap_store_obj_t *a_store_obj) { dap_return_val_if_fail(a_store_obj, NULL); - size_t l_group_len = dap_strlen(a_store_obj->group); size_t l_key_len = dap_strlen(a_store_obj->key); size_t l_sign_len = a_store_obj->sign ? dap_sign_get_size(a_store_obj->sign) : 0; size_t l_data_size_out = l_group_len + l_key_len + a_store_obj->value_len + l_sign_len; - dap_global_db_pkt_t *l_pkt = DAP_NEW_Z_SIZE(dap_global_db_pkt_t, l_data_size_out + sizeof(dap_global_db_pkt_t)); - if (!l_pkt) { - log_it(L_CRITICAL, "Insufficient memory"); - return NULL; - } + dap_global_db_pkt_t *l_pkt = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_global_db_pkt_t, l_data_size_out + sizeof(dap_global_db_pkt_t), NULL); /* Fill packet header */ l_pkt->timestamp = a_store_obj->timestamp; @@ -115,12 +108,8 @@ dap_sign_t *dap_store_obj_sign(dap_store_obj_t *a_obj, dap_enc_key_t *a_key, uin if (a_checksum) { if (a_key) { size_t l_sign_len = dap_sign_get_size(l_sign); - l_pkt = DAP_REALLOC(l_pkt, dap_global_db_pkt_get_size(l_pkt) + l_sign_len); - if (!l_pkt) { - log_it(L_CRITICAL, "Not enough memory"); - DAP_DELETE(l_sign); - return NULL; - } + dap_global_db_pkt_t *l_new_pkt = DAP_REALLOC_RET_VAL_IF_FAIL(l_pkt, dap_global_db_pkt_get_size(l_pkt) + l_sign_len, NULL, l_sign); + l_pkt = l_new_pkt; memcpy(l_pkt->data + l_pkt->data_len, l_sign, l_sign_len); l_pkt->data_len += l_sign_len; } diff --git a/global-db/include/dap_global_db.h b/global-db/include/dap_global_db.h index b020cfaa0df74d2d9cbf3ef60d660771da0d8a0a..664a8e8e8f82447addef2017ffcec53179ec7799 100644 --- a/global-db/include/dap_global_db.h +++ b/global-db/include/dap_global_db.h @@ -36,9 +36,9 @@ typedef struct dap_global_db_cluster dap_global_db_cluster_t; // Global DB instance with settings data typedef struct dap_global_db_instance { - uint32_t version; // Current GlobalDB version - const char *storage_path; // GlobalDB storage path - const char *driver_name; // GlobalDB driver name + uint32_t version; // Current GlobalDB version + char *storage_path; // GlobalDB storage path + char *driver_name; // GlobalDB driver name dap_list_t *whitelist; dap_list_t *blacklist; uint64_t store_time_limit; @@ -48,7 +48,7 @@ typedef struct dap_global_db_instance { } dap_global_db_instance_t; typedef struct dap_global_db_obj { - const char *key; + char *key; uint8_t *value; size_t value_len; dap_nanotime_t timestamp; diff --git a/global-db/include/dap_global_db_cluster.h b/global-db/include/dap_global_db_cluster.h index 642803433b44ca16c80ba3d101360753d93bc175..a20956a8af138989594c461fdab37db91724611f 100644 --- a/global-db/include/dap_global_db_cluster.h +++ b/global-db/include/dap_global_db_cluster.h @@ -74,7 +74,7 @@ typedef struct dap_global_db_sync_context { } dap_global_db_sync_context_t; typedef struct dap_global_db_cluster { - const char *groups_mask; // GDB cluster coverage area + char *groups_mask; // GDB cluster coverage area dap_cluster_t *links_cluster; // Cluster container for network links dap_cluster_t *role_cluster; // Cluster container for members with especial roles dap_global_db_role_t default_role; // Role assined for new membersadded with default one diff --git a/global-db/include/dap_global_db_driver.h b/global-db/include/dap_global_db_driver.h index 4c1ae70ace3346b6d1687de6f93834820615cafc..811ead5eaf8569474afb18bac821b4eb52c4a6a7 100644 --- a/global-db/include/dap_global_db_driver.h +++ b/global-db/include/dap_global_db_driver.h @@ -56,7 +56,7 @@ typedef struct dap_global_db_driver_hash { typedef struct dap_store_obj { char *group; // Name of database table analogue (key-value DB have no 'table' defined) - const char *key; // Unique database key + char *key; // Unique database key byte_t *value; // Database value corresponsing with database key size_t value_len; // Length of database value uint8_t flags; // Record flags diff --git a/global-db/test/dap_global_db_test.c b/global-db/test/dap_global_db_test.c index 16c6e35ed7e8531488f8297c36ab03400e6c5506..eacb804b33d46c875f1f581f715842dad04dcbc0 100644 --- a/global-db/test/dap_global_db_test.c +++ b/global-db/test/dap_global_db_test.c @@ -91,7 +91,7 @@ static int s_test_write(size_t a_count) log_it(L_DEBUG, "Write %zu record in GDB", i); l_store_obj.group = DAP_DB$T_GROUP; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i); // add bad to check rewrite /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i); // add bad to check rewrite /* Generate a key of record */ clock_gettime(CLOCK_REALTIME, &now); /* Get and save record's timestamp */ l_store_obj.timestamp = ((uint64_t)now.tv_sec << 32) | ((uint32_t) (now.tv_nsec)); @@ -136,7 +136,7 @@ static int s_test_write(size_t a_count) l_store_obj.group = DAP_DB$T_GROUP_WRONG; l_store_obj.crc = i + 1; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%09zx", i); + snprintf(l_key, sizeof(l_key), "KEY$%09zx", i); l_time = get_cur_time_msec(); ret = dap_global_db_driver_add(&l_store_obj, 1); @@ -157,7 +157,7 @@ static int s_test_read(size_t a_count) dap_chain_hash_fast_t csum = { 0 };; dap_db_test_record_t *prec = NULL; char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i); /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i); /* Generate a key of record */ l_time = get_cur_time_msec(); dap_store_obj_t *l_store_obj = dap_global_db_driver_read(DAP_DB$T_GROUP, l_key, NULL, true); @@ -199,7 +199,7 @@ static void s_test_read_cond_store(size_t a_count) dap_assert_PIF(l_count <= DAP_GLOBAL_DB_COND_READ_COUNT_DEFAULT + dap_global_db_driver_hash_is_blank(&l_blank_check), "Wrong finded records count"); for (size_t j = i, k = 0; j < a_count && k < l_count; ++j, ++k) { char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", j); /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", j); /* Generate a key of record */ dap_store_obj_t *l_store_obj = dap_global_db_driver_read(DAP_DB$T_GROUP, l_key, NULL, true); dap_assert_PIF(l_store_obj, "Record-Not-Found"); dap_assert_PIF(!strcmp(DAP_DB$T_GROUP, (l_objs + k)->group), "Wrong group"); @@ -253,7 +253,7 @@ static void s_test_count(size_t a_count) int l_time = 0; for (size_t i = 0; i < a_count; ++i) { char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i); + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i); dap_store_obj_t *l_store_obj = dap_global_db_driver_read(DAP_DB$T_GROUP, l_key, NULL, true); dap_assert_PIF(l_store_obj, "Records-Not-Found"); @@ -272,7 +272,7 @@ static void s_test_count(size_t a_count) if (i >= a_count) break; } - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i); + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i); dap_store_obj_t *l_store_obj = dap_global_db_driver_read(DAP_DB$T_GROUP, l_key, NULL, false); dap_assert_PIF(l_store_obj, "Records-Not-Found"); @@ -295,14 +295,14 @@ static void s_test_is_obj(size_t a_count) { for (size_t i = 0; i < a_count; ++i) { char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i); /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i); /* Generate a key of record */ dap_assert_PIF(dap_global_db_driver_is(DAP_DB$T_GROUP, l_key), "Key not finded") dap_assert_PIF(!dap_global_db_driver_is(DAP_DB$T_GROUP_WRONG, l_key), "Key finded in wrong group") dap_assert_PIF(!dap_global_db_driver_is(DAP_DB$T_GROUP_NOT_EXISTED, l_key), "Key finded in not existed group") } for (size_t i = a_count; i < a_count * 2; ++i) { char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i); /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i); /* Generate a key of record */ dap_assert_PIF(!dap_global_db_driver_is(DAP_DB$T_GROUP, l_key), "Finded not existed key") dap_assert_PIF(!dap_global_db_driver_is(DAP_DB$T_GROUP_WRONG, l_key), "Finded not existed key in wrong group") dap_assert_PIF(!dap_global_db_driver_is(DAP_DB$T_GROUP_NOT_EXISTED, l_key), "Finded not existed key in not existed group") @@ -314,7 +314,7 @@ static void s_test_is_hash(size_t a_count) { for (size_t i = 0; i < a_count; ++i) { char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i); /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i); /* Generate a key of record */ dap_store_obj_t *l_store_obj = dap_global_db_driver_read(DAP_DB$T_GROUP, l_key, NULL, true); dap_assert_PIF(l_store_obj, "Record-Not-Found"); dap_global_db_driver_hash_t l_driver_key = dap_global_db_driver_hash_get(l_store_obj); @@ -338,7 +338,7 @@ static void s_test_last(size_t a_count) { char l_key[64] = { 0 }; // with holes - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", a_count - 1); + snprintf(l_key, sizeof(l_key), "KEY$%08zx", a_count - 1); dap_store_obj_t *l_store_obj = dap_global_db_driver_read_last(DAP_DB$T_GROUP, true); dap_assert_PIF(l_store_obj && !strcmp(l_key, l_store_obj->key), "Last with holes"); dap_store_obj_free_one(l_store_obj); @@ -350,7 +350,7 @@ static void s_test_last(size_t a_count) l_store_obj = dap_global_db_driver_read_last(DAP_DB$T_GROUP_NOT_EXISTED, true); dap_assert_PIF(!l_store_obj, "Last with holes in not existed group"); // without holes - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", a_count - 1 - a_count % DAP_DB$SZ_HOLES); + snprintf(l_key, sizeof(l_key), "KEY$%08zx", a_count - 1 - a_count % DAP_DB$SZ_HOLES); l_store_obj = dap_global_db_driver_read_last(DAP_DB$T_GROUP, false); dap_assert_PIF(l_store_obj && !strcmp(l_key, l_store_obj->key), "Last without holes"); dap_store_obj_free_one(l_store_obj); @@ -381,7 +381,7 @@ static void s_test_read_hashes(size_t a_count) size_t l_bias = l_hashes->group_name_len; for (size_t j = i, k = 0; j < a_count && k < DAP_GLOBAL_DB_COND_READ_KEYS_DEFAULT; ++j, ++k) { char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", j); /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", j); /* Generate a key of record */ dap_store_obj_t *l_store_obj = dap_global_db_driver_read(DAP_DB$T_GROUP, l_key, NULL, true); dap_assert_PIF(l_store_obj, "Record-Not-Found"); dap_global_db_driver_hash_t l_driver_key_current = dap_global_db_driver_hash_get(l_store_obj); @@ -414,7 +414,7 @@ static void s_test_get_by_hash(size_t a_count) size_t l_total_data = 0; for (size_t j = 0; j < l_hashes->hashes_count - dap_global_db_driver_hash_is_blank((dap_global_db_driver_hash_t *)(l_hashes->group_n_hashses + l_hashes->group_name_len) + l_hashes->hashes_count - 1); ++j) { char l_key[64] = { 0 }; - snprintf(l_key, sizeof(l_key) - 1, "KEY$%08zx", i + j); /* Generate a key of record */ + snprintf(l_key, sizeof(l_key), "KEY$%08zx", i + j); /* Generate a key of record */ dap_store_obj_t *l_store_obj = dap_global_db_driver_read(DAP_DB$T_GROUP, l_key, NULL, true); dap_assert_PIF(l_store_obj, "Record-Not-Found"); dap_global_db_pkt_t *l_cur_pkt = (dap_global_db_pkt_t *)(l_objs->data + l_total_data); diff --git a/io/dap_context.c b/io/dap_context.c index db352198212efec227f9495da4de81fc89891c2a..0334ccba30c4ea22bbe87d72815d7493bb071b6f 100644 --- a/io/dap_context.c +++ b/io/dap_context.c @@ -730,8 +730,7 @@ int dap_worker_thread_loop(dap_context_t * a_context) #ifdef DAP_OS_WINDOWS log_it(L_ERROR, "Context thread %d got errno %d", a_context->id, WSAGetLastError()); #else - strerror_r(l_errno, l_error_buf, sizeof (l_error_buf) - 1); - log_it(L_ERROR, "Context thread %d got errno:\"%s\" (%d)", a_context->id, l_error_buf, l_errno); + log_it(L_ERROR, "Context thread %d got error: %d: \"%s\"", a_context->id, errno, dap_strerror(errno)); assert(l_errno); #endif break; @@ -1031,9 +1030,7 @@ int dap_worker_thread_loop(dap_context_t * a_context) if( l_errno == EAGAIN || l_errno == EWOULDBLOCK){// Everything is good, we'll receive ACCEPT on next poll continue; }else{ - char l_errbuf[128]; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it(L_WARNING,"accept() on socket %d error:\"%s\"(%d)",l_cur->socket, l_errbuf,l_errno); + log_it(L_WARNING,"accept() on socket %d error %d: \"%s\"",l_cur->socket, l_errno, dap_strerror(l_errno)); break; } } @@ -1165,14 +1162,12 @@ int dap_worker_thread_loop(dap_context_t * a_context) #endif } else { l_error_len = sizeof(l_errno); - getsockopt(l_cur->socket, SOL_SOCKET, SO_ERROR, (void *)&l_errno, &l_error_len); if(l_errno == EINPROGRESS) { log_it(L_DEBUG, "Connecting with %s in progress...", l_cur->remote_addr_str); }else if (l_errno){ - strerror_r(l_errno, l_error_buf, sizeof (l_error_buf)); - log_it(L_ERROR,"Connecting error with %s: \"%s\" (code %d)", l_cur->remote_addr_str, - l_error_buf, l_errno); + log_it(L_ERROR,"Connecting with %s failed, error %d: \"%s\"", l_cur->remote_addr_str, + l_errno, dap_strerror(l_errno)); if ( l_cur->callbacks.error_callback ) l_cur->callbacks.error_callback(l_cur, l_errno); }else{ @@ -1657,11 +1652,8 @@ lb_exit: #ifdef DAP_EVENTS_CAPS_IOCP log_it(L_ERROR, "IOCP update failed, errno %lu %llu", l_errno, a_es->socket); #else - char l_errbuf[128]; - l_errbuf[0]=0; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it(L_ERROR,"Can't update client socket state on poll/epoll/kqueue fd %" DAP_FORMAT_SOCKET ": \"%s\" (%d)", - a_es->socket, l_errbuf, l_errno); + log_it(L_ERROR,"Can't update client socket state on poll/epoll/kqueue fd %" DAP_FORMAT_SOCKET ", error %d: \"%s\"", + a_es->socket, l_errno, dap_strerror(l_errno) ); #endif return l_errno; } @@ -1869,25 +1861,13 @@ dap_events_socket_t *dap_context_find(dap_context_t * a_context, dap_events_sock #if defined(DAP_EVENTS_CAPS_QUEUE_PIPE2) || defined(DAP_EVENTS_CAPS_QUEUE_PIPE) int l_pipe[2]; - char l_errbuf[255]; - int l_errno; - l_errbuf[0]=0; #if defined(DAP_EVENTS_CAPS_QUEUE_PIPE2) if( pipe2(l_pipe,O_DIRECT | O_NONBLOCK ) < 0 ){ #elif defined(DAP_EVENTS_CAPS_QUEUE_PIPE) if( pipe(l_pipe) < 0 ){ #endif - l_errno = errno; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - switch (l_errno) { - case EINVAL: log_it(L_CRITICAL, "Too old linux version thats doesn't support O_DIRECT flag for pipes (%s)", l_errbuf); break; - default: log_it( L_ERROR, "Error detected, can't create pipe(): '%s' (%d)", l_errbuf, l_errno); - } - DAP_DELETE(l_es); - return NULL; + return DAP_DELETE(l_es), log_it(L_ERROR, "pipe() failed, error %d: '%s'", errno, dap_strerror(errno)), NULL; } - //else - // log_it(L_DEBUG, "Created one-way unnamed packet pipe %d->%d", l_pipe[0], l_pipe[1]); l_es->fd = l_pipe[0]; l_es->fd2 = l_pipe[1]; @@ -1910,10 +1890,8 @@ dap_events_socket_t *dap_context_find(dap_context_t * a_context, dap_events_sock #if !defined (DAP_OS_ANDROID) FILE* l_sys_max_pipe_size_fd = fopen("/proc/sys/fs/pipe-max-size", "r"); if (l_sys_max_pipe_size_fd) { - const int l_file_buf_size = 64; - char l_file_buf[l_file_buf_size]; - memset(l_file_buf, 0, l_file_buf_size); - fread(l_file_buf, l_file_buf_size, 1, l_sys_max_pipe_size_fd); + char l_file_buf[64] = ""; + fread(l_file_buf, sizeof(l_file_buf), 1, l_sys_max_pipe_size_fd); uint64_t l_sys_max_pipe_size = strtoull(l_file_buf, 0, 10); fcntl(l_pipe[0], F_SETPIPE_SZ, l_sys_max_pipe_size); fclose(l_sys_max_pipe_size_fd); @@ -2027,25 +2005,9 @@ dap_events_socket_t * dap_context_create_event(dap_context_t * a_context, dap_ev #endif #ifdef DAP_EVENTS_CAPS_EVENT_EVENTFD - if((l_es->fd = eventfd(0,EFD_NONBLOCK) ) < 0 ){ - int l_errno = errno; - char l_errbuf[128]; - l_errbuf[0]=0; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - switch (l_errno) { - case EINVAL: log_it(L_CRITICAL, "An unsupported value was specified in flags: \"%s\" (%d)", l_errbuf, l_errno); break; - case EMFILE: log_it(L_CRITICAL, "The per-process limit on the number of open file descriptors has been reached: \"%s\" (%d)", l_errbuf, l_errno); break; - case ENFILE: log_it(L_CRITICAL, "The system-wide limit on the total number of open files has been reached: \"%s\" (%d)", l_errbuf, l_errno); break; - case ENODEV: log_it(L_CRITICAL, "Could not mount (internal) anonymous inode device: \"%s\" (%d)", l_errbuf, l_errno); break; - case ENOMEM: log_it(L_CRITICAL, "There was insufficient memory to create a new eventfd file descriptor: \"%s\" (%d)", l_errbuf, l_errno); break; - default: log_it( L_ERROR, "Error detected, can't create eventfd: '%s' (%d)", l_errbuf, l_errno); - } - DAP_DELETE(l_es); - return NULL; - }else { - l_es->fd2 = l_es->fd; - //log_it(L_DEBUG, "Created eventfd descriptor %d", l_es->fd ); - } + if ( (l_es->fd = eventfd(0,EFD_NONBLOCK) ) < 0 ) + return DAP_DELETE(l_es), log_it(L_ERROR, "Can't create eventfd, error %d: '%s'", errno, dap_strerror(errno)), NULL; + l_es->fd2 = l_es->fd; #elif defined DAP_EVENTS_CAPS_WEPOLL l_es->socket = socket(AF_INET, SOCK_DGRAM, 0); @@ -2128,17 +2090,8 @@ dap_events_socket_t * dap_context_create_pipe(dap_context_t * a_context, dap_eve #if defined(DAP_EVENTS_CAPS_PIPE_POSIX) int l_pipe[2]; - int l_errno; - char l_errbuf[128]; - l_errbuf[0]=0; - if( pipe(l_pipe) < 0 ){ - l_errno = errno; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it( L_ERROR, "Error detected, can't create pipe(): '%s' (%d)", l_errbuf, l_errno); - DAP_DELETE(l_es); - return NULL; - }//else - // log_it(L_DEBUG, "Created one-way unnamed bytestream pipe %d->%d", l_pipe[0], l_pipe[1]); + if( pipe(l_pipe) < 0 ) + return DAP_DELETE(l_es), log_it( L_ERROR, "Error detected, can't create pipe(), error %d: '%s'", errno, dap_strerror(errno)), NULL; l_es->fd = l_pipe[0]; l_es->fd2 = l_pipe[1]; #if defined DAP_OS_UNIX diff --git a/io/dap_events.c b/io/dap_events.c index c80756a8bb506d1a552545a82998ab5f04abaa29..5f6dfb4a718ffa01270d5ea75a220aa40e6ef886 100644 --- a/io/dap_events.c +++ b/io/dap_events.c @@ -89,8 +89,6 @@ typedef cpuset_t cpu_set_t; // Adopt BSD CPU setstructure to POSIX variant #include <pthread.h> #include "dap_common.h" -#include "dap_strfuncs.h" -#include "dap_server.h" #include "dap_events.h" #include "dap_context.h" #include "dap_events_socket.h" @@ -199,16 +197,7 @@ void dap_cpu_assign_thread_on(uint32_t a_cpu_id) if(l_retcode != 0) #endif { - char l_errbuf[128]={0}; - switch (l_retcode) { - case EFAULT: strncpy(l_errbuf,"A supplied memory address was invalid.",sizeof (l_errbuf)-1); break; - case EINVAL: strncpy(l_errbuf,"The affinity bit mask mask contains no processors that are currently physically on the system and permitted to the thread",sizeof (l_errbuf)-1); break; - case ESRCH: strncpy(l_errbuf,"No thread with the ID thread could be found",sizeof (l_errbuf)-1); break; - case EPFNOSUPPORT: strncpy(l_errbuf,"System doesn't support thread affinity set",sizeof (l_errbuf)-1); break; - default: strncpy(l_errbuf,"Unknown error",sizeof (l_errbuf)-1); - } - log_it(L_ERROR, "Worker #%u: error in set affinity thread call: %s (%d)",a_cpu_id, l_errbuf , l_retcode); - //abort(); + log_it(L_ERROR, "Set affinity error %d: \"%s\"", l_retcode, dap_strerror(l_retcode)); } #endif #else diff --git a/io/dap_events_socket.c b/io/dap_events_socket.c index 1bb6c32a5d9091adf481133af8a0641830c5cb7b..979519dc4520fe0cd56161fed84b3214d867076e 100644 --- a/io/dap_events_socket.c +++ b/io/dap_events_socket.c @@ -202,7 +202,7 @@ int dap_events_socket_queue_data_send(dap_events_socket_t *a_es, const void *a_d queue_entry_t *l_entry = DAP_ALMALLOC(MEMORY_ALLOCATION_ALIGNMENT, sizeof(queue_entry_t)); *l_entry = (queue_entry_t) { .size = a_size, - .data = a_size ? DAP_DUP_SIZE(a_data, a_size) : (void*)a_data + .data = a_size ? DAP_DUP_SIZE((char*)a_data, a_size) : (void*)a_data }; if (g_debug_reactor) { if (a_size) @@ -590,13 +590,8 @@ dap_events_socket_t * dap_events_socket_queue_ptr_create_input(dap_events_socket if ( 0 >= (l_es->mqd = mq_open(l_mq_name, O_CREAT|O_WRONLY |O_NONBLOCK, 0700, &l_mq_attr)) ) { - log_it(L_CRITICAL,"Can't create mqueue descriptor %s: \"%s\" code %d (%s)", l_mq_name, l_errbuf, errno, - (strerror_r(errno, l_errbuf, sizeof (l_errbuf)), l_errbuf) ); - - DAP_DELETE(l_es->buf_in); - DAP_DELETE(l_es->buf_out); - DAP_DELETE(l_es); - return NULL; + log_it(L_CRITICAL,"Can't create mqueue descriptor %s, error %d: \"%s\"", l_mq_name, errno, dap_strerror(errno)); + return DAP_DEL_MULTY(l_es->buf_in, l_es->buf_out, l_es), NULL; } #elif defined (DAP_EVENTS_CAPS_QUEUE_PIPE2) || defined (DAP_EVENTS_CAPS_QUEUE_PIPE) @@ -681,30 +676,14 @@ int dap_events_socket_queue_proc_input_unsafe(dap_events_socket_t * a_esocket) a_esocket->callbacks.queue_ptr_callback(a_esocket, l_queue_ptr); } if (l_ret == -1) { - int l_errno = errno; - switch (l_errno) { + switch (errno) { case EAGAIN: debug_if(g_debug_reactor, L_INFO, "Received and processed %lu callbacks in 1 pass", l_shift / 8); break; - default: { - char l_errbuf[128]; - l_errbuf[0]=0; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it(L_ERROR, "mq_receive error in esocket queue_ptr:\"%s\" code %d", l_errbuf, l_errno); - return -1; - } + default: + return log_it(L_ERROR, "mq_receive error in esocket queue_ptr:\"%s\" code %d", dap_strerror(errno), errno), -1; } } - ssize_t l_ret = mq_receive(a_esocket->mqd,(char*) &l_queue_ptr, sizeof (l_queue_ptr),NULL); - if (l_ret == -1){ - int l_errno = errno; - char l_errbuf[128]; - l_errbuf[0]=0; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it(L_ERROR, "Error in esocket queue_ptr:\"%s\" code %d", l_errbuf, l_errno); - return -1; - } - a_esocket->callbacks.queue_ptr_callback (a_esocket, l_queue_ptr); #elif defined DAP_EVENTS_CAPS_WEPOLL if(l_read > 0) { debug_if(g_debug_reactor, L_NOTICE, "Got %ld bytes from socket", l_read); @@ -1187,7 +1166,7 @@ void dap_events_socket_descriptor_close(dap_events_socket_t *a_esocket) } if ( a_esocket->fd2 > 0 ) closesocket(a_esocket->fd2); - a_esocket->fd = a_esocket->fd2 = INVALID_SOCKET; + a_esocket->socket = a_esocket->socket2 = INVALID_SOCKET; } /** @@ -1489,9 +1468,6 @@ void dap_events_socket_set_readable_unsafe( dap_events_socket_t *a_esocket, bool int l_kevent_ret = kevent(l_kqueue_fd,&l_event,1,NULL,0,NULL); int l_errno = errno; if ( l_kevent_ret == -1 && l_errno != EINPROGRESS ){ - char l_errbuf[128]; - l_errbuf[0]=0; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); if (l_errno == EBADF){ log_it(L_ATT,"Set readable: socket %d (%p ) disconnected, rise CLOSE flag to remove from queue, lost %"DAP_UINT64_FORMAT_U":%" DAP_UINT64_FORMAT_U " bytes",a_esocket->socket,a_esocket,a_esocket->buf_in_size,a_esocket->buf_out_size); @@ -1499,7 +1475,7 @@ void dap_events_socket_set_readable_unsafe( dap_events_socket_t *a_esocket, bool a_esocket->buf_in_size = a_esocket->buf_out_size = 0; // Reset everything from buffer, we close it now all }else{ log_it(L_ERROR,"Can't update client socket %d state on kqueue fd for set_read op %d: \"%s\" (%d)", - a_esocket->socket, l_kqueue_fd, l_errbuf, l_errno); + a_esocket->socket, l_kqueue_fd, dap_strerror(l_errno), l_errno); } } } @@ -1540,9 +1516,6 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *a_esocket, bool int l_kevent_ret=kevent(l_kqueue_fd,&l_event,1,NULL,0,NULL); int l_errno = errno; if ( l_kevent_ret == -1 && l_errno != EINPROGRESS && l_errno != ENOENT ){ - char l_errbuf[128]; - l_errbuf[0]=0; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); if (l_errno == EBADF){ log_it(L_ATT,"Set writable: socket %d (%p ) disconnected, rise CLOSE flag to remove from queue, lost %"DAP_UINT64_FORMAT_U":%" DAP_UINT64_FORMAT_U " bytes",a_esocket->socket,a_esocket,a_esocket->buf_in_size,a_esocket->buf_out_size); @@ -1550,7 +1523,7 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *a_esocket, bool a_esocket->buf_in_size = a_esocket->buf_out_size = 0; // Reset everything from buffer, we close it now all }else{ log_it(L_ERROR,"Can't update client socket %d state on kqueue fd for set_write op %d: \"%s\" (%d)", - a_esocket->socket, l_kqueue_fd, l_errbuf, l_errno); + a_esocket->socket, l_kqueue_fd, dap_strerror(l_errno), l_errno); } } } @@ -1595,12 +1568,9 @@ int dap_events_socket_queue_ptr_send( dap_events_socket_t *a_es, void *a_arg) log_it(L_ERROR, "Number of pending messages: %ld", a_es->buf_out_size); s_add_ptr_to_buf(a_es, a_arg); return 0; - default: { - char l_errbuf[128] = { '\0' }; - strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it(L_ERROR, "Can't send ptr to queue:\"%s\" code %d", l_errbuf, l_errno); - return l_errno; - }} + default: + return log_it(L_ERROR, "Can't send ptr to queue, error %d:\"%s\"", l_errno, dap_strerror(l_errno)), l_errno; + } l_ret = mq_send(a_es->mqd, (const char *)&a_arg, sizeof (a_arg), 0); l_errno = errno; if ( l_ret == EPERM){ @@ -1833,7 +1803,7 @@ size_t dap_events_socket_write_inter(dap_events_socket_t * a_es_input, dap_event dap_worker_msg_io_t * l_msg = DAP_NEW_Z(dap_worker_msg_io_t); if( !l_msg) return 0; l_msg->esocket_uuid = a_es_uuid; if (a_data && a_data_size) - l_msg->data = DAP_DUP_SIZE(a_data ,a_data_size); + l_msg->data = DAP_DUP_SIZE((char*)a_data, a_data_size); l_msg->data_size = a_data_size; l_msg->flags_set = DAP_SOCK_READY_TO_WRITE; @@ -1927,7 +1897,7 @@ size_t dap_events_socket_write(dap_events_socket_uuid_t a_es_uuid, const void * * @param l_data_size * @return */ -size_t dap_events_socket_write_mt(dap_worker_t * a_w,dap_events_socket_uuid_t a_es_uuid, const void *a_data, size_t a_data_size) +size_t dap_events_socket_write_mt(dap_worker_t * a_w,dap_events_socket_uuid_t a_es_uuid, void *a_data, size_t a_data_size) { #ifdef DAP_EVENTS_CAPS_IOCP dap_overlapped_t *ol = DAP_NEW_SIZE(dap_overlapped_t, sizeof(dap_overlapped_t) + a_data_size); @@ -1939,21 +1909,17 @@ size_t dap_events_socket_write_mt(dap_worker_t * a_w,dap_events_socket_uuid_t a_ : ( DAP_DELETE(ol), log_it(L_ERROR, "Can't schedule writing to %"DAP_UINT64_FORMAT_U" in context #%d, error %d", a_es_uuid, a_w->context->id, GetLastError()), 0 ); #else - dap_worker_msg_io_t * l_msg = DAP_NEW_Z(dap_worker_msg_io_t); if (!l_msg) return 0; + dap_worker_msg_io_t * l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_worker_msg_io_t, 0); l_msg->esocket_uuid = a_es_uuid; if (a_data && a_data_size) l_msg->data = (char*)a_data; // DAP_DUP_SIZE(a_data, a_data_size); l_msg->data_size = a_data_size; l_msg->flags_set = DAP_SOCK_READY_TO_WRITE; - int l_ret= dap_events_socket_queue_ptr_send(a_w->queue_es_io, l_msg ); - if (l_ret!=0){ - log_it(L_ERROR, "wite mt: wasn't send pointer to queue: code %d", l_ret); - DAP_DEL_Z(l_msg->data); - DAP_DELETE(l_msg); - return 0; - } - return a_data_size; + int l_ret = dap_events_socket_queue_ptr_send(a_w->queue_es_io, l_msg); + return l_ret + ? log_it(L_ERROR, "wite mt: wasn't send pointer to queue: code %d", l_ret), DAP_DEL_MULTY(l_msg->data, l_msg), 0 + : a_data_size; #endif } @@ -2037,10 +2003,12 @@ size_t dap_events_socket_write_unsafe(dap_events_socket_t *a_es, const void *a_d return dap_events_socket_queue_data_send(a_es, a_data, a_data_size); #endif static const size_t l_basic_buf_size = DAP_EVENTS_SOCKET_BUF_LIMIT / 4; - + byte_t *l_buf_out; if (a_es->buf_out_size_max < a_es->buf_out_size + a_data_size) { a_es->buf_out_size_max += dap_max(l_basic_buf_size, a_data_size); - a_es->buf_out = DAP_REALLOC(a_es->buf_out, a_es->buf_out_size_max); + if (!( l_buf_out = DAP_REALLOC(a_es->buf_out, a_es->buf_out_size_max) )) + return log_it(L_ERROR, "Can't increase capacity: OOM!"), 0; + a_es->buf_out = l_buf_out; debug_if(g_debug_reactor, L_MSG, "[!] Socket %"DAP_FORMAT_SOCKET": increase capacity to %zu, actual size: %zu", a_es->fd, a_es->buf_out_size_max, a_es->buf_out_size); } else if ((a_es->buf_out_size + a_data_size <= l_basic_buf_size / 4) && (a_es->buf_out_size_max > l_basic_buf_size)) { a_es->buf_out_size_max = l_basic_buf_size; diff --git a/io/dap_server.c b/io/dap_server.c index 5e6dcff9f550fce8dfe58e78248c59de1a72ef7e..abf37f29c12411dca3dc217018be3d3e967f24b9 100644 --- a/io/dap_server.c +++ b/io/dap_server.c @@ -245,8 +245,7 @@ int dap_server_callbacks_set(dap_server_t* a_server, dap_events_socket_callbacks */ dap_server_t *dap_server_new(const char *a_cfg_section, dap_events_socket_callbacks_t *a_server_callbacks, dap_events_socket_callbacks_t *a_client_callbacks) { - dap_server_t *l_server = NULL; - DAP_NEW_Z_RET_VAL(l_server, dap_server_t, NULL, NULL); + dap_server_t *l_server = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_server_t, NULL); dap_events_socket_callbacks_t l_callbacks = { .accept_callback = s_es_server_accept, .new_callback = s_es_server_new, @@ -270,7 +269,7 @@ dap_server_t *dap_server_new(const char *a_cfg_section, dap_events_socket_callba log_it(L_ERROR, "chmod() on socket path failed, errno %d: \"%s\"", errno, dap_strerror(errno)); } - dap_config_get_item_str_path_array_free(l_paths, &l_count); + dap_config_get_item_str_path_array_free(l_paths, l_count); #endif const char **l_addrs = dap_config_get_array_str(g_config, a_cfg_section, DAP_CFG_PARAM_LISTEN_ADDRS, &l_count); for (i = 0; i < l_count; ++i) { diff --git a/io/dap_worker.c b/io/dap_worker.c index 5abfa68a9fc088b33b1e4fdfc4180779284d4b03..2024282788669f16a13cdb4f23faaac23f3fd6c6 100644 --- a/io/dap_worker.c +++ b/io/dap_worker.c @@ -104,7 +104,9 @@ int dap_worker_context_callback_started(dap_context_t * a_context, void *a_arg) dap_worker_t *l_worker = (dap_worker_t*) a_arg; assert(l_worker); if (s_worker) - return log_it(L_ERROR, "Worker %d is already assigned to current thread %u", s_worker->id), -1; + return log_it(L_ERROR, "Worker %d is already assigned to current thread %ld", + s_worker->id, s_worker->context->thread_id), + -1; s_worker = l_worker; #if defined(DAP_EVENTS_CAPS_KQUEUE) a_context->kqueue_fd = kqueue(); @@ -283,8 +285,6 @@ static void s_queue_es_reassign_callback( dap_events_socket_t * a_es, void * a_a assert(a_es); dap_context_t * l_context = a_es->context; assert(l_context); - dap_worker_t * l_worker = a_es->worker; - assert(l_worker); dap_worker_msg_reassign_t * l_msg = (dap_worker_msg_reassign_t*) a_arg; assert(l_msg); dap_events_socket_t * l_es_reassign; diff --git a/io/include/dap_events.h b/io/include/dap_events.h index 6daa2b0dafb4c77536f868f067d812882c2361f4..19d5b1d4f5f1b9d8a91390729b6d92d867d62999 100644 --- a/io/include/dap_events.h +++ b/io/include/dap_events.h @@ -23,8 +23,6 @@ */ #pragma once #include <pthread.h> -#include "uthash.h" -#include "dap_server.h" #include "dap_worker.h" #define DAP_MAX_EVENTS_COUNT 8192 diff --git a/io/include/dap_events_socket.h b/io/include/dap_events_socket.h index e67cc20e6e95cc68181282595038901bed787eed..4d174e21dfb9e6c1f8e8fe0e0023c223c5cbd5a1 100644 --- a/io/include/dap_events_socket.h +++ b/io/include/dap_events_socket.h @@ -30,7 +30,6 @@ typedef int SOCKET; #else #include <ws2tcpip.h> #include <mq.h> -#define INVALID_SOCKET (SOCKET)(~0) #endif #include <pthread.h> @@ -417,7 +416,7 @@ size_t dap_events_socket_write(dap_events_socket_uuid_t a_es_uuid, const void * dap_events_socket_callback_error_t a_callback_error, void * a_arg); -size_t dap_events_socket_write_mt(dap_worker_t * a_w, dap_events_socket_uuid_t a_es_uuid, const void * a_data, size_t a_data_size); +size_t dap_events_socket_write_mt(dap_worker_t * a_w, dap_events_socket_uuid_t a_es_uuid, void * a_data, size_t a_data_size); DAP_PRINTF_ATTR(3, 4) size_t dap_events_socket_write_f_mt(dap_worker_t * a_w, dap_events_socket_uuid_t a_es_uuid, const char * a_format,...); void dap_events_socket_delete_unsafe( dap_events_socket_t * a_esocket , bool a_preserve_inheritor); void dap_events_socket_remove_and_delete_unsafe( dap_events_socket_t *a_es, bool preserve_inheritor ); diff --git a/net/app-cli/dap_app_cli.c b/net/app-cli/dap_app_cli.c index c7619ed096f8b3244231dbb0e6d565dbcd1d8f33..ad4bd8b674ee5fc585e3a27465ca3fe017faf8e8 100644 --- a/net/app-cli/dap_app_cli.c +++ b/net/app-cli/dap_app_cli.c @@ -225,18 +225,14 @@ JNIEXPORT jstring JNICALL Java_com_CellframeWallet_Node_cellframeNodeCliMain(JNI #endif int dap_app_cli_main(const char *a_app_name, int a_argc, const char **a_argv) { - char l_config_dir[MAX_PATH] = {'\0'}; - sprintf(l_config_dir, "%s/etc", g_sys_dir_path); - dap_config_init(l_config_dir); - if ( !(g_config = dap_config_open(a_app_name)) ) { - printf("Can't init general configurations %s/%s.cfg\n", l_config_dir, a_app_name); - return -3; + { + char l_config_dir[MAX_PATH + 1]; + snprintf(l_config_dir, MAX_PATH, "%s/etc", g_sys_dir_path); + if ( dap_config_init(l_config_dir) || !(g_config = dap_config_open(a_app_name)) ) + return printf("Can't init general config \"%s/%s.cfg\"\n", l_config_dir, a_app_name), -3; } - - int l_res = -1; - - if (a_argc > 1){ + if (a_argc > 1) { // Call the function dap_app_cli_cmd_state_t cmd = { .cmd_name = (char *)a_argv[1], diff --git a/net/app-cli/dap_app_cli_net.c b/net/app-cli/dap_app_cli_net.c index e92d46c0e5aa105474d6d00dec46d7d32183bae1..0be52cb644af934e53c0fde718b1b10ddae0c5cd 100644 --- a/net/app-cli/dap_app_cli_net.c +++ b/net/app-cli/dap_app_cli_net.c @@ -89,8 +89,12 @@ static int dap_app_cli_http_read(dap_app_cli_connect_param_t socket, dap_app_cli break; l_hdr_end_token += ( sizeof(l_head_end_str) - 1 ); l_cmd->hdr_len = l_hdr_end_token - l_cmd->cmd_res; - if (l_cmd->cmd_res_len + l_cmd->hdr_len > l_cmd->cmd_res_cur) - l_cmd->cmd_res = DAP_REALLOC(l_cmd->cmd_res, l_cmd->cmd_res_len + l_cmd->hdr_len + 1); + if (l_cmd->cmd_res_len + l_cmd->hdr_len > l_cmd->cmd_res_cur) { + char *l_res = DAP_REALLOC(l_cmd->cmd_res, l_cmd->cmd_res_len + l_cmd->hdr_len + 1); + if (!l_res) + return printf("Error: out of memory!"), DAP_CLI_ERROR_INCOMPLETE; + l_cmd->cmd_res = l_res; + } ++a_status; } case 3: @@ -116,40 +120,32 @@ dap_app_cli_connect_param_t dap_app_cli_connect() int l_arg_len = 0; uint16_t l_array_count; struct sockaddr_storage l_saddr = { }; - char **l_addrs = dap_config_get_item_str_path_array(g_config, "cli-server", DAP_CFG_PARAM_SOCK_PATH, &l_array_count); - char *l_addr = l_addrs ? l_addrs[0] : NULL; - if (l_addr) { - l_addrs[0] = NULL; - dap_config_get_item_str_path_array_free(l_addrs, &l_array_count); + char *l_addr = NULL; + if (( l_addr = dap_config_get_item_str_path_default(g_config, "cli-server", DAP_CFG_PARAM_SOCK_PATH, NULL) )) { #if defined(DAP_OS_WINDOWS) || defined(DAP_OS_ANDROID) #else - if ( -1 == (l_socket = socket(AF_UNIX, SOCK_STREAM, 0)) ) { - printf ("socket() error %d", errno); - return ~0; - } + if ( -1 == (l_socket = socket(AF_UNIX, SOCK_STREAM, 0)) ) + return printf ("socket() error %d: \"%s\"\r\n", errno, dap_strerror(errno)), ~0; struct sockaddr_un l_saddr_un = { .sun_family = AF_UNIX }; strncpy(l_saddr_un.sun_path, l_addr, sizeof(l_saddr_un.sun_path) - 1); l_arg_len = SUN_LEN(&l_saddr_un); memcpy(&l_saddr, &l_saddr_un, l_arg_len); - DAP_DEL_Z(l_addr); + DAP_DELETE(l_addr); #endif - } else if ( !!(l_addr = (char *)dap_config_get_item_str(g_config, "cli-server", DAP_CFG_PARAM_LISTEN_ADDRS)) ) { + } else if (( l_addr = (char*)dap_config_get_item_str(g_config, "cli-server", DAP_CFG_PARAM_LISTEN_ADDRS) )) { if ( -1 == (l_socket = socket(AF_INET, SOCK_STREAM, 0)) ) { #ifdef DAP_OS_WINDOWS _set_errno( WSAGetLastError() ); #endif - printf ("socket() error %d", errno); - return ~0; + return printf ("socket() error %d: \"%s\"\r\n", errno, dap_strerror(errno)), ~0; } char l_ip[INET6_ADDRSTRLEN] = { '\0' }; uint16_t l_port = 0; if ( 0 > (l_arg_len = dap_net_parse_config_address(l_addr, l_ip, &l_port, &l_saddr, NULL)) ) { printf ("Incorrect address \"%s\" format\n", l_addr); return ~0; } - } else { - printf("CLI server is not set, check config"); - return ~0; - } + } else + return printf("CLI server is not set, check config"), ~0; if ( connect(l_socket, (struct sockaddr*)&l_saddr, l_arg_len) == SOCKET_ERROR ) { #ifdef DAP_OS_WINDOWS diff --git a/net/client/dap_client.c b/net/client/dap_client.c index 471f4ed624f7f775835d62218b1343bb02fd0fb3..1a8d27fe13515b7ed692c82a0e71e4c7c8b19ce9 100644 --- a/net/client/dap_client.c +++ b/net/client/dap_client.c @@ -73,11 +73,8 @@ void dap_client_deinit() */ dap_client_t *dap_client_new(dap_client_callback_t a_stage_status_error_callback, void *a_callbacks_arg) { -// memory alloc - dap_client_t *l_client = NULL; - DAP_NEW_Z_RET_VAL(l_client, dap_client_t, NULL, NULL); - DAP_NEW_Z_RET_VAL(l_client->_internal, dap_client_pvt_t, NULL, l_client); -// func work + dap_client_t *l_client = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_client_t, NULL); + l_client->_internal = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_client_pvt_t, NULL, l_client); l_client->stage_status_error_callback = a_stage_status_error_callback; l_client->callbacks_arg = a_callbacks_arg; // CONSTRUCT dap_client object diff --git a/net/client/dap_client_http.c b/net/client/dap_client_http.c index 66aca4e1d577fd729edf0e38de22d6018652cc41..cdbbc9b24619f8e9d0516fbabd59ca425b7e35bd 100644 --- a/net/client/dap_client_http.c +++ b/net/client/dap_client_http.c @@ -235,7 +235,8 @@ static void s_http_connected(dap_events_socket_t * a_esocket) ssize_t l_out_buf_size = l_header_size; if (l_client_http->request && l_client_http->request_size){ l_out_buf_size += l_client_http->request_size + 1; - l_out_buf = DAP_REALLOC(l_out_buf, l_out_buf_size); + char *l_out_new = DAP_REALLOC_RET_IF_FAIL(l_out_buf, l_out_buf_size, l_out_buf); + l_out_buf = l_out_new; memcpy(l_out_buf + l_header_size, l_client_http->request, l_client_http->request_size); } @@ -385,25 +386,22 @@ static void s_http_read(dap_events_socket_t * a_es, void * arg) l_client_http->is_header_read = false; // received not enough data - if(l_client_http->content_length - > (l_client_http->response_size - l_client_http->header_length)) { + if ( l_client_http->content_length > l_client_http->response_size - l_client_http->header_length ) return; - }else{ - // process data - if(l_client_http->response_callback) - l_client_http->response_callback( - l_client_http->response + l_client_http->header_length, - l_client_http->content_length, - l_client_http->callbacks_arg, s_extract_http_code( - l_client_http->response, l_client_http->response_size)); - l_client_http->response_size -= l_client_http->header_length; - l_client_http->response_size -= l_client_http->content_length; - l_client_http->header_length = 0; - l_client_http->content_length = 0; - l_client_http->were_callbacks_called = true; - a_es->flags |= DAP_SOCK_SIGNAL_CLOSE; - } - + // process data + l_client_http->response[dap_min(l_client_http->response_size, l_client_http->response_size_max - 1)] = '\0'; + if(l_client_http->response_callback) + l_client_http->response_callback( + l_client_http->response + l_client_http->header_length, + l_client_http->content_length, + l_client_http->callbacks_arg, s_extract_http_code( + l_client_http->response, l_client_http->response_size)); + l_client_http->response_size -= l_client_http->header_length; + l_client_http->response_size -= l_client_http->content_length; + l_client_http->header_length = 0; + l_client_http->content_length = 0; + l_client_http->were_callbacks_called = true; + a_es->flags |= DAP_SOCK_SIGNAL_CLOSE; } } @@ -755,16 +753,12 @@ dap_client_http_t * dap_client_http_request_custom ( } dap_worker_add_events_socket(l_client_http->worker, l_ev_socket); return l_client_http; - } - else{ - char l_errbuf[128]; - l_errbuf[0] = '\0'; - strerror_r(errno, l_errbuf, sizeof (l_errbuf)); - log_it(L_ERROR, "Connecting error: \"%s\" (code %d)", l_errbuf, errno); + } else { + log_it(L_ERROR, "Connecting error %d: \"%s\"", errno, dap_strerror(errno)); s_client_http_delete( l_client_http); l_ev_socket->_inheritor = NULL; dap_events_socket_delete_unsafe( l_ev_socket, true); - if(a_error_callback) + if (a_error_callback) a_error_callback(errno, a_callbacks_arg); return NULL; } diff --git a/net/client/dap_client_pvt.c b/net/client/dap_client_pvt.c index eb7aea285c6596fa5e7380787972f29172875a18..4a830e06be7239668f2ec967bd591f1d8163879e 100644 --- a/net/client/dap_client_pvt.c +++ b/net/client/dap_client_pvt.c @@ -302,7 +302,7 @@ static bool s_stream_timer_timeout_after_connected_check(void * a_arg) void dap_client_pvt_queue_add(dap_client_pvt_t *a_client_pvt, const char a_ch_id, uint8_t a_type, void *a_data, size_t a_data_size) { - dap_client_pkt_queue_elm_t *l_pkt = DAP_NEW_SIZE(dap_client_pkt_queue_elm_t, sizeof(dap_client_pkt_queue_elm_t) + a_data_size); + dap_client_pkt_queue_elm_t *l_pkt = DAP_NEW_Z_SIZE(dap_client_pkt_queue_elm_t, sizeof(dap_client_pkt_queue_elm_t) + a_data_size); l_pkt->ch_id = a_ch_id; l_pkt->type = a_type; l_pkt->data_size = a_data_size; @@ -340,18 +340,13 @@ int s_add_cert_sign_to_data(const dap_cert_t *a_cert, uint8_t **a_data, size_t * dap_return_val_if_pass(!a_cert || !a_size || !a_data, 0); dap_sign_t *l_sign = dap_sign_create(a_cert->enc_key, a_signing_data, a_signing_size, 0); - dap_return_val_if_pass(!l_sign, 0); - - size_t l_sign_size = dap_sign_get_size(l_sign); - *a_data = DAP_REALLOC(*a_data, (*a_size + l_sign_size) * sizeof(uint8_t)); - if (!*a_data) { - DAP_DELETE(l_sign); - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return 0; - } - memcpy(*a_data + *a_size, l_sign, l_sign_size); - *a_size += l_sign_size; + dap_return_val_if_fail(l_sign, 0); + size_t l_sign_size = dap_sign_get_size(l_sign), l_size = *a_size; + byte_t *l_data = DAP_REALLOC_RET_VAL_IF_FAIL(*a_data, l_size + l_sign_size, 0, l_sign); + memcpy(l_data + l_size, l_sign, l_sign_size); DAP_DELETE(l_sign); + *a_data = l_data; + *a_size = l_size + l_sign_size; return 1; } @@ -401,9 +396,11 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt) break; } size_t l_data_size = a_client_pvt->session_key_open->pub_key_data_size; - uint8_t *l_data = DAP_NEW_Z_SIZE(uint8_t, l_data_size); - memcpy(l_data, a_client_pvt->session_key_open->pub_key_data, a_client_pvt->session_key_open->pub_key_data_size); - + uint8_t *l_data = DAP_DUP_SIZE(a_client_pvt->session_key_open->pub_key_data, l_data_size); + if (!l_data) { + a_client_pvt->stage_status = STAGE_STATUS_ERROR; + break; + } dap_cert_t *l_node_cert = dap_cert_find_by_name(DAP_STREAM_NODE_ADDR_CERT_NAME); size_t l_sign_count = 0; if (a_client_pvt->client->auth_cert) @@ -589,15 +586,9 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt) s_stream_timer_timeout_check,l_stream_es_uuid_ptr); } else if (l_err != EINPROGRESS && l_err != -1){ - char l_errbuf[128] = {0}; - - if (l_err) - strerror_r(l_err,l_errbuf,sizeof (l_errbuf)); - else - strncpy(l_errbuf,"Unknown Error",sizeof(l_errbuf)-1); log_it(L_ERROR, "Remote address can't connect (%s:%hu) with sock_id %"DAP_FORMAT_SOCKET": \"%s\" (code %d)", - a_client_pvt->client->link_info.uplink_addr, a_client_pvt->client->link_info.uplink_port, - l_es->socket, l_errbuf, l_err); + a_client_pvt->client->link_info.uplink_addr, a_client_pvt->client->link_info.uplink_port, + l_es->socket, dap_strerror(l_err), l_err); dap_events_socket_delete_unsafe(l_es, true); a_client_pvt->stage_status = STAGE_STATUS_ERROR; a_client_pvt->last_error = ERROR_STREAM_CONNECT; @@ -636,7 +627,7 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt) dap_stream_ch_new(a_client_pvt->stream, (uint8_t)a_client_pvt->client->active_channels[i]); char l_full_path[2048]; - snprintf(l_full_path, sizeof(l_full_path) - 1, "%s/globaldb?session_id=%u", DAP_UPLINK_PATH_STREAM, + snprintf(l_full_path, sizeof(l_full_path), "%s/globaldb?session_id=%u", DAP_UPLINK_PATH_STREAM, dap_client_get_stream_id(a_client_pvt->client)); dap_events_socket_write_f_unsafe( a_client_pvt->stream_es, "GET /%s HTTP/1.1\r\n" @@ -801,99 +792,55 @@ int dap_client_pvt_request(dap_client_pvt_t * a_client_internal, const char * a_ * @param a_response_proc * @param a_response_error */ -void dap_client_pvt_request_enc(dap_client_pvt_t * a_client_internal, const char * a_path, - const char * a_sub_url, const char * a_query - , void * a_request, size_t a_request_size - , dap_client_callback_data_size_t a_response_proc - , dap_client_callback_int_t a_response_error) +void dap_client_pvt_request_enc(dap_client_pvt_t * a_client_internal, const char *a_path, + const char *a_sub_url, const char * a_query, void *a_request, size_t a_request_size, + dap_client_callback_data_size_t a_response_proc, dap_client_callback_int_t a_response_error) { bool is_query_enc = true; // if true, then encode a_query string [Why do we even need this?] - - debug_if(s_debug_more, L_DEBUG, "Encrypted request: sub_url '%s' query '%s'", a_sub_url ? a_sub_url : "NULL", - a_query ? a_query : "NULL"); - - size_t l_sub_url_size = a_sub_url ? strlen(a_sub_url) : 0; - size_t l_query_size = a_query ? strlen(a_query) : 0; -// size_t l_url_size; -// char l_url[1024] = { 0 }; -// snprintf(l_url, 1024, "http://%s:%u", a_client_internal->uplink_addr, a_client_internal->uplink_port); -// l_url_size = strlen(l_url); - - size_t l_sub_url_enc_size_max = l_sub_url_size ? (5 * l_sub_url_size + 16) : 0; - char *l_sub_url_enc = l_sub_url_size ? DAP_NEW_Z_SIZE(char, l_sub_url_enc_size_max + 1) : NULL; - - size_t l_query_enc_size_max = (is_query_enc) ? (l_query_size * 5 + 16) : l_query_size; - char *l_query_enc = - (is_query_enc) ? (l_query_size ? DAP_NEW_Z_SIZE(char, l_query_enc_size_max + 1) : NULL) : (char*) a_query; - -// size_t l_url_full_size_max = 5 * l_sub_url_size + 5 * l_query_size + 16 + l_url_size + 2; -// char * l_url_full = DAP_NEW_Z_SIZE(char, l_url_full_size_max + 1); - - size_t l_request_enc_size_max = a_request_size ? a_request_size * 2 + 16 : 0; - char * l_request_enc = a_request_size ? DAP_NEW_Z_SIZE(char, l_request_enc_size_max + 1) : NULL; - size_t l_request_enc_size = 0; - - a_client_internal->request_response_callback = a_response_proc; - a_client_internal->request_error_callback = a_response_error; - a_client_internal->is_encrypted = true; - dap_enc_data_type_t l_enc_type; - - if(a_client_internal->uplink_protocol_version >= 21) - l_enc_type = DAP_ENC_DATA_TYPE_B64_URLSAFE; - else - l_enc_type = DAP_ENC_DATA_TYPE_B64; - - if(l_sub_url_size) - dap_enc_code(a_client_internal->session_key, - a_sub_url, l_sub_url_size, - l_sub_url_enc, l_sub_url_enc_size_max, - l_enc_type); - - if(is_query_enc && l_query_size) - dap_enc_code(a_client_internal->session_key, - a_query, l_query_size, - l_query_enc, l_query_enc_size_max, - l_enc_type); - - if(a_request_size) - l_request_enc_size = dap_enc_code(a_client_internal->session_key, - a_request, a_request_size, - l_request_enc, l_request_enc_size_max, - DAP_ENC_DATA_TYPE_RAW); - - size_t l_path_size= l_query_enc_size_max + l_sub_url_enc_size_max + 1; - char *l_path = DAP_NEW_Z_SIZE(char, l_path_size); - l_path[0] = '\0'; - if(a_path) { - if(l_sub_url_size){ - if(l_query_size){ - snprintf(l_path, l_path_size, "%s/%s?%s", a_path?a_path:"", - l_sub_url_enc?l_sub_url_enc:"", - l_query_enc?l_query_enc:""); - }else{ - snprintf(l_path, l_path_size, "%s/%s", a_path, l_sub_url_enc); + debug_if (s_debug_more, L_DEBUG, "Encrypt request: sub_url '%s' query '%s'", + a_sub_url ? a_sub_url : "", a_query ? a_query : ""); + dap_enc_data_type_t l_enc_type = a_client_internal->uplink_protocol_version >= 21 + ? DAP_ENC_DATA_TYPE_B64_URLSAFE : DAP_ENC_DATA_TYPE_B64; + char *l_path = NULL, *l_request_enc = NULL; + if (a_path && *a_path) { + size_t l_suburl_len = a_sub_url && *a_sub_url ? dap_strlen(a_sub_url) : 0, + l_suburl_enc_size = dap_enc_code_out_size(a_client_internal->session_key, l_suburl_len, l_enc_type), + l_query_len = a_query && *a_query ? dap_strlen(a_query) : 0, + l_query_enc_size = dap_enc_code_out_size(a_client_internal->session_key, l_query_len, l_enc_type), + l_path_size = dap_strlen(a_path) + l_suburl_enc_size + l_query_enc_size + 3; + l_path = DAP_NEW_Z_SIZE(char, l_path_size); + char *l_offset = dap_strncpy(l_path, a_path, l_path_size); + *l_offset++ = '/'; + if (l_suburl_enc_size) { + l_offset += dap_enc_code(a_client_internal->session_key, a_sub_url, l_suburl_len, + l_offset, l_suburl_enc_size, l_enc_type); + if (l_query_enc_size) { + *l_offset++ = '?'; + dap_enc_code(a_client_internal->session_key, a_query, l_query_len, + l_offset, l_query_enc_size, l_enc_type); } - } else { - dap_stpcpy(l_path, a_path); } } - - size_t l_size_required = a_client_internal->session_key_id ? strlen(a_client_internal->session_key_id) + 40 : 40; - char *l_custom = DAP_NEW_Z_SIZE(char, l_size_required); - size_t l_off = snprintf(l_custom, l_size_required, "KeyID: %s\r\n", a_client_internal->session_key_id ? a_client_internal->session_key_id : "NULL"); - if (a_client_internal->is_close_session) - snprintf(l_custom + l_off, l_size_required - l_off, "%s\r\n", "SessionCloseAfterRequest: true"); - - a_client_internal->http_client = dap_client_http_request(a_client_internal->worker, a_client_internal->client->link_info.uplink_addr, - a_client_internal->client->link_info.uplink_port, - a_request ? "POST" : "GET", "text/text", - l_path, l_request_enc, l_request_enc_size, NULL, - s_request_response, s_request_error, a_client_internal, l_custom); - DAP_DEL_Z(l_sub_url_enc); - DAP_DEL_Z(l_custom); - DAP_DEL_Z(l_query_enc); - DAP_DEL_Z(l_path); - DAP_DEL_Z(l_request_enc); + size_t l_req_enc_size = 0; + if (a_request && a_request_size) { + l_req_enc_size = dap_enc_code_out_size(a_client_internal->session_key, a_request_size, l_enc_type) + 1; + l_request_enc = DAP_NEW_Z_SIZE(char, l_req_enc_size); + dap_enc_code(a_client_internal->session_key, a_request, a_request_size, + l_request_enc, l_req_enc_size, DAP_ENC_DATA_TYPE_RAW); + } + char *l_custom = dap_strdup_printf("KeyID: %s\r\n%s", + a_client_internal->session_key_id ? a_client_internal->session_key_id : "NULL", + a_client_internal->is_close_session ? "SessionCloseAfterRequest: true\r\n" : ""); + + a_client_internal->request_response_callback = a_response_proc; + a_client_internal->request_error_callback = a_response_error; + a_client_internal->is_encrypted = true; + a_client_internal->http_client = dap_client_http_request(a_client_internal->worker, + a_client_internal->client->link_info.uplink_addr, a_client_internal->client->link_info.uplink_port, + a_request ? "POST" : "GET", "text/text", l_path, l_request_enc, l_req_enc_size, NULL, + s_request_response, s_request_error, a_client_internal, l_custom); + + DAP_DEL_MULTY(l_path, l_request_enc, l_custom); } /** @@ -920,34 +867,27 @@ static void s_request_error(int a_err_code, void * a_obj) * @param a_response_size * @param a_obj */ -static void s_request_response(void * a_response, size_t a_response_size, void * a_obj, http_status_code_t a_http_code) +static void s_request_response(void * a_response, size_t a_response_size, void * a_obj, UNUSED_ARG http_status_code_t a_http_code) { - (void)a_http_code; dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t *) a_obj; assert(l_client_pvt); + if ( !l_client_pvt->request_response_callback ) + return log_it(L_ERROR, "No request_response_callback in encrypted client!"); l_client_pvt->http_client = NULL; - if (l_client_pvt->is_encrypted && l_client_pvt->session_key) { - size_t l_response_dec_size_max = a_response_size ? a_response_size * 2 + 16 : 0; - char * l_response_dec = a_response_size ? DAP_NEW_Z_SIZE(char, l_response_dec_size_max) : NULL; - size_t l_response_dec_size = 0; - if(a_response_size) - l_response_dec_size = dap_enc_decode(l_client_pvt->session_key, - a_response, a_response_size, - l_response_dec, l_response_dec_size_max, - DAP_ENC_DATA_TYPE_RAW); - - if ( l_client_pvt->request_response_callback ) - l_client_pvt->request_response_callback(l_client_pvt->client, l_response_dec, l_response_dec_size); - else - log_it(L_ERROR, "NULL request_response_callback for encrypted client %p", l_client_pvt->client ); - - if(l_response_dec) - DAP_DELETE(l_response_dec); - } else { - if ( l_client_pvt->request_response_callback ) + + if (a_response && a_response_size) { + if (l_client_pvt->is_encrypted) { + if (!l_client_pvt->session_key) + return log_it(L_ERROR, "No session key in encrypted client!"); + size_t l_len = dap_enc_decode_out_size(l_client_pvt->session_key, a_response_size, DAP_ENC_DATA_TYPE_RAW); + char *l_response = DAP_NEW_Z_SIZE(char, l_len + 1); + l_len = dap_enc_decode(l_client_pvt->session_key, a_response, a_response_size, + l_response, l_len, DAP_ENC_DATA_TYPE_RAW); + l_response[l_len] = '\0'; + l_client_pvt->request_response_callback(l_client_pvt->client, l_response, l_len); + DAP_DELETE(l_response); + } else l_client_pvt->request_response_callback(l_client_pvt->client, a_response, a_response_size); - else - log_it(L_ERROR, "NULL request_response_callback for unencrypted client %p", l_client_pvt->client ); } } @@ -983,16 +923,14 @@ int s_json_multy_obj_parse_str(const char *a_key, const char *a_val, int a_count * @param a_response * @param a_response_size */ -static void s_enc_init_response(dap_client_t *a_client, void * a_data, size_t a_data_size) +static void s_enc_init_response(dap_client_t *a_client, void *a_data, size_t a_data_size) { // sanity check dap_client_pvt_t * l_client_pvt = DAP_CLIENT_PVT(a_client); dap_return_if_pass(!l_client_pvt || !a_data); // func work - char *l_session_id_b64 = NULL; - char *l_bob_message_b64 = NULL; - char *l_node_sign_b64 = NULL; - char *l_bob_message = NULL; + char *l_data = (char*)a_data, *l_session_id_b64 = NULL, + *l_bob_message_b64 = NULL, *l_node_sign_b64 = NULL, *l_bob_message = NULL; l_client_pvt->last_error = ERROR_NO_ERROR; while(l_client_pvt->last_error == ERROR_NO_ERROR) { // first checks @@ -1002,14 +940,14 @@ static void s_enc_init_response(dap_client_t *a_client, void * a_data, size_t a_ break; } if (a_data_size <= 10) { - log_it(L_ERROR, "ENC: Wrong response (size %zu data '%s')", a_data_size, (char* )a_data); + log_it(L_ERROR, "ENC: Wrong response (size %zu data '%s')", a_data_size, l_data); l_client_pvt->last_error = ERROR_ENC_NO_KEY; break; } size_t l_bob_message_size = 0; int l_json_parse_count = 0; // parse data - struct json_object *jobj = json_tokener_parse((const char *) a_data); + struct json_object *jobj = json_tokener_parse(l_data); if(jobj) { // parse encrypt_id & encrypt_msg json_object_object_foreach(jobj, key, val) @@ -1037,7 +975,7 @@ static void s_enc_init_response(dap_client_t *a_client, void * a_data, size_t a_ // check data if (l_json_parse_count < 2 || l_json_parse_count > 4) { l_client_pvt->last_error = ERROR_ENC_NO_KEY; - log_it(L_ERROR, "ENC: Wrong response (size %zu data '%s')", a_data_size, (char* ) a_data); + log_it(L_ERROR, "ENC: Wrong response (size %zu data '%s')", a_data_size, l_data); break; } if (!l_session_id_b64 || !l_bob_message_b64) { @@ -1046,18 +984,14 @@ static void s_enc_init_response(dap_client_t *a_client, void * a_data, size_t a_ break; } // decode session key id - DAP_NEW_Z_SIZE_RET(l_client_pvt->session_key_id, char, strlen(l_session_id_b64) + 1, l_session_id_b64, l_bob_message_b64, l_node_sign_b64); - if (!dap_enc_base64_decode(l_session_id_b64, strlen(l_session_id_b64), - l_client_pvt->session_key_id, DAP_ENC_DATA_TYPE_B64)) { - log_it(L_WARNING, "ENC: Can't decode session id from base64"); - l_client_pvt->last_error = ERROR_ENC_WRONG_KEY; - } else { - log_it(L_DEBUG, "ENC: session Key ID %s", l_client_pvt->session_key_id); - } + size_t l_len = strlen(l_session_id_b64), l_decoded_len; + l_client_pvt->session_key_id = DAP_NEW_Z_SIZE_RET_IF_FAIL(char, DAP_ENC_BASE64_DECODE_SIZE(l_len) + 1, l_session_id_b64, l_bob_message_b64, l_node_sign_b64); + l_decoded_len = dap_enc_base64_decode(l_session_id_b64, l_len, l_client_pvt->session_key_id, DAP_ENC_DATA_TYPE_B64); + log_it(L_DEBUG, "ENC: session Key ID %s", l_client_pvt->session_key_id); // decode bob message - DAP_NEW_Z_SIZE_RET(l_bob_message, char, strlen(l_bob_message_b64) + 1, l_session_id_b64, l_bob_message_b64, l_node_sign_b64, l_client_pvt->session_key_id); - l_bob_message_size = dap_enc_base64_decode(l_bob_message_b64, strlen(l_bob_message_b64), - l_bob_message, DAP_ENC_DATA_TYPE_B64); + l_len = strlen(l_bob_message_b64); + l_bob_message = DAP_NEW_Z_SIZE_RET_IF_FAIL(char, DAP_ENC_BASE64_DECODE_SIZE(l_len) + 1, l_session_id_b64, l_bob_message_b64, l_node_sign_b64, l_client_pvt->session_key_id); + l_bob_message_size = dap_enc_base64_decode(l_bob_message_b64, l_len, l_bob_message, DAP_ENC_DATA_TYPE_B64); if (!l_bob_message_size) { log_it(L_WARNING, "ENC: Can't decode bob message from base64"); l_client_pvt->last_error = ERROR_ENC_WRONG_KEY; @@ -1075,7 +1009,7 @@ static void s_enc_init_response(dap_client_t *a_client, void * a_data, size_t a_ l_client_pvt->session_key = dap_enc_key_new_generate(l_client_pvt->session_key_type, l_client_pvt->session_key_open->priv_key_data, // shared key l_client_pvt->session_key_open->priv_key_data_size, - l_client_pvt->session_key_id, strlen(l_client_pvt->session_key_id), l_client_pvt->session_key_block_size); + l_client_pvt->session_key_id, l_decoded_len, l_client_pvt->session_key_block_size); if (l_client_pvt->stage != STAGE_ENC_INIT) { // We are in wrong stage l_client_pvt->last_error = ERROR_WRONG_STAGE; @@ -1085,10 +1019,11 @@ static void s_enc_init_response(dap_client_t *a_client, void * a_data, size_t a_ } // verify node sign if (l_node_sign_b64) { - dap_sign_t *l_sign = NULL; - DAP_NEW_Z_SIZE_RET(l_sign, dap_sign_t, strlen(l_node_sign_b64) + 1, l_session_id_b64, l_bob_message_b64, l_node_sign_b64, l_bob_message, l_client_pvt->session_key_id); - size_t l_decode_len = dap_enc_base64_decode(l_node_sign_b64, strlen(l_node_sign_b64), l_sign, DAP_ENC_DATA_TYPE_B64); - if (!dap_sign_verify_all(l_sign, l_decode_len, l_bob_message, l_bob_message_size)) { + l_len = strlen(l_node_sign_b64); + dap_sign_t *l_sign = DAP_NEW_Z_SIZE_RET_IF_FAIL(dap_sign_t, DAP_ENC_BASE64_DECODE_SIZE(l_len) + 1, + l_session_id_b64, l_bob_message_b64, l_node_sign_b64, l_bob_message, l_client_pvt->session_key_id); + l_decoded_len = dap_enc_base64_decode(l_node_sign_b64, l_len, l_sign, DAP_ENC_DATA_TYPE_B64); + if ( !dap_sign_verify_all(l_sign, l_decoded_len, l_bob_message, l_bob_message_size) ) { dap_stream_node_addr_t l_sign_node_addr = dap_stream_node_addr_from_sign(l_sign); if (l_sign_node_addr.uint64 != a_client->link_info.node_addr.uint64) { log_it(L_WARNING, "Unverified stream to node "NODE_ADDR_FP_STR" signed by "NODE_ADDR_FP_STR"\n", NODE_ADDR_FP_ARGS_S(a_client->link_info.node_addr), NODE_ADDR_FP_ARGS_S(l_sign_node_addr)); @@ -1146,58 +1081,48 @@ static void s_enc_init_error(dap_client_t * a_client, UNUSED_ARG void *a_arg, in * @param a_data * @param a_data_size */ -static void s_stream_ctl_response(dap_client_t * a_client, void * a_data, size_t a_data_size) +static void s_stream_ctl_response(dap_client_t * a_client, void *a_data, size_t a_data_size) { dap_client_pvt_t *l_client_pvt = DAP_CLIENT_PVT(a_client); if (!l_client_pvt) return; if(s_debug_more) log_it(L_DEBUG, "STREAM_CTL response %zu bytes length recieved", a_data_size); - char * l_response_str = DAP_NEW_Z_SIZE(char, a_data_size + 1); - if (!l_response_str) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return; - } - memcpy(l_response_str, a_data, (uint32_t)a_data_size); - + char *l_response_str = (char*)a_data; // The caller must ensure it's a null-terminated string + if(a_data_size < 4) { log_it(L_ERROR, "STREAM_CTL Wrong reply: '%s'", l_response_str); l_client_pvt->last_error = ERROR_STREAM_CTL_ERROR_RESPONSE_FORMAT; l_client_pvt->stage_status = STAGE_STATUS_ERROR; s_stage_status_after(l_client_pvt); - } else if(strcmp(l_response_str, "ERROR") == 0) { + } else if ( !strncmp(l_response_str, "ERROR", a_data_size) ) { log_it(L_WARNING, "STREAM_CTL Got ERROR from the remote site,expecting thats ERROR_AUTH"); l_client_pvt->last_error = ERROR_STREAM_CTL_ERROR_AUTH; l_client_pvt->stage_status = STAGE_STATUS_ERROR; s_stage_status_after(l_client_pvt); } else { int l_arg_count; - char *l_stream_key = DAP_NEW_Z_SIZE(char, 4096 * 3); - if (!l_stream_key) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - DAP_DEL_Z(l_response_str); - return; - } + char l_stream_key[4096 + 1] = { '\0' }; uint32_t l_remote_protocol_version; dap_enc_key_type_t l_enc_type = l_client_pvt->session_key_type; int l_enc_headers = 0; uint32_t l_stream_id_int = 0; - l_arg_count = sscanf(l_response_str, "%u %4096s %u %d %d" - , &l_stream_id_int, l_stream_key, &l_remote_protocol_version, &l_enc_type, &l_enc_headers); + l_arg_count = sscanf(l_response_str, "%u %4096s %u %d %d", + &l_stream_id_int, l_stream_key, + &l_remote_protocol_version, + &l_enc_type, &l_enc_headers); if(l_arg_count < 2) { log_it(L_WARNING, "STREAM_CTL Need at least 2 arguments in reply (got %d)", l_arg_count); l_client_pvt->last_error = ERROR_STREAM_CTL_ERROR_RESPONSE_FORMAT; l_client_pvt->stage_status = STAGE_STATUS_ERROR; s_stage_status_after(l_client_pvt); } else { - if(l_arg_count > 2) { l_client_pvt->uplink_protocol_version = l_remote_protocol_version; log_it(L_DEBUG, "Uplink protocol version %u", l_remote_protocol_version); } else - log_it(L_WARNING, "No uplink protocol version, use default version %d" - , l_client_pvt->uplink_protocol_version = DAP_PROTOCOL_VERSION_DEFAULT); - + log_it(L_WARNING, "No uplink protocol version, use default version %d", + l_client_pvt->uplink_protocol_version = DAP_PROTOCOL_VERSION_DEFAULT); if(l_stream_id_int) { //log_it(L_DEBUG, "Stream server id %s, stream key length(base64 encoded) %u" // ,l_stream_id,strlen(l_stream_key) ); @@ -1209,8 +1134,7 @@ static void s_stream_ctl_response(dap_client_t * a_client, void * a_data, size_t l_client_pvt->stream_id = l_stream_id_int; l_client_pvt->stream_key = - dap_enc_key_new_generate(l_enc_type, l_stream_key, strlen(l_stream_key), NULL, 0, - 32); + dap_enc_key_new_generate(l_enc_type, l_stream_key, strlen(l_stream_key), NULL, 0, 32); l_client_pvt->is_encrypted_headers = l_enc_headers; @@ -1228,11 +1152,8 @@ static void s_stream_ctl_response(dap_client_t * a_client, void * a_data, size_t l_client_pvt->stage_status = STAGE_STATUS_ERROR; s_stage_status_after(l_client_pvt); } - } - DAP_DELETE(l_stream_key); } - DAP_DELETE(l_response_str); } /** diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c index 12ee05a34405ac775b7c0227d3ffb0f1d55c5aaa..6b9c41bdb334e3eac85cd20fc3fa92447fe79198 100644 --- a/net/link_manager/dap_link_manager.c +++ b/net/link_manager/dap_link_manager.c @@ -255,12 +255,8 @@ void dap_link_manager_deinit() */ dap_link_manager_t *dap_link_manager_new(const dap_link_manager_callbacks_t *a_callbacks) { -// sanity check dap_return_val_if_pass_err(!a_callbacks || !a_callbacks->fill_net_info, NULL, "Needed link manager callbacks not filled, please check it"); -// memory alloc - dap_link_manager_t *l_ret = NULL; - DAP_NEW_Z_RET_VAL(l_ret, dap_link_manager_t, NULL, NULL); -// func work + dap_link_manager_t *l_ret = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_link_manager_t, NULL); l_ret->callbacks = *a_callbacks; if(!l_ret->callbacks.link_request) log_it(L_WARNING, "Link manager link_request callback is NULL"); @@ -341,8 +337,7 @@ int dap_link_manager_add_net(uint64_t a_net_id, dap_cluster_t *a_link_cluster, u return -3; } } - dap_managed_net_t *l_net = NULL; - DAP_NEW_Z_RET_VAL(l_net, dap_managed_net_t, -3, NULL); + dap_managed_net_t *l_net = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_managed_net_t, -3); l_net->id = a_net_id; l_net->min_links_num = a_min_links_number; l_net->link_clusters = dap_list_append(l_net->link_clusters, a_link_cluster); @@ -571,16 +566,11 @@ bool s_link_drop_callback(void *a_arg) */ void s_client_error_callback(dap_client_t *a_client, void *a_arg) { -// sanity check dap_return_if_pass(!a_client || !DAP_LINK(a_client)); dap_link_t *l_link = DAP_LINK(a_client); assert(l_link->uplink.client == a_client); -// memory alloc - struct link_drop_args *l_args = NULL; - DAP_NEW_Z_RET(l_args, struct link_drop_args, NULL); -// func work + struct link_drop_args *l_args = DAP_NEW_Z_RET_IF_FAIL(struct link_drop_args); *l_args = (struct link_drop_args) { .addr = l_link->addr, .disconnected = a_arg }; - dap_proc_thread_callback_add_pri(s_query_thread, s_link_drop_callback, l_args, DAP_QUEUE_MSG_PRIORITY_HIGH); } @@ -896,10 +886,7 @@ int dap_link_manager_link_update(dap_stream_node_addr_t *a_node_addr, const char return -6; } -// memory alloc - struct link_update_args *l_args = NULL; - DAP_NEW_Z_RET_VAL(l_args, struct link_update_args, -7, NULL); -// func work + struct link_update_args *l_args = DAP_NEW_Z_RET_VAL_IF_FAIL(struct link_update_args, -7); l_args->host = dap_strdup(a_host); if (!l_args->host) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); @@ -995,12 +982,8 @@ static bool s_stream_add_callback(void *a_arg) */ int dap_link_manager_stream_add(dap_stream_node_addr_t *a_node_addr, bool a_uplink) { -// sanity check dap_return_val_if_pass(!a_node_addr || !s_link_manager->active, -1); -// memory alloc - struct link_moving_args *l_args = NULL; - DAP_NEW_Z_RET_VAL(l_args, struct link_moving_args, -2, NULL); -// func work + struct link_moving_args *l_args = DAP_NEW_Z_RET_VAL_IF_FAIL(struct link_moving_args, -2); *l_args = (struct link_moving_args) { .addr = *a_node_addr, .uplink = a_uplink }; return dap_proc_thread_callback_add_pri(s_query_thread, s_stream_add_callback, l_args, DAP_QUEUE_MSG_PRIORITY_HIGH); } @@ -1036,13 +1019,9 @@ static bool s_stream_replace_callback(void *a_arg) void dap_link_manager_stream_replace(dap_stream_node_addr_t *a_addr, bool a_new_is_uplink) { -// sanity check dap_return_if_fail(a_addr); -// memory alloc - struct link_moving_args *l_args = NULL; - DAP_NEW_Z_RET(l_args, struct link_moving_args, NULL); + struct link_moving_args *l_args = DAP_NEW_Z_RET_IF_FAIL(struct link_moving_args); *l_args = (struct link_moving_args) { .addr = *a_addr, .uplink = a_new_is_uplink }; -// func work dap_proc_thread_callback_add_pri(s_query_thread, s_stream_replace_callback, l_args, DAP_QUEUE_MSG_PRIORITY_HIGH); } @@ -1143,13 +1122,9 @@ static bool s_link_accounting_callback(void *a_arg) */ void dap_link_manager_accounting_link_in_net(uint64_t a_net_id, dap_stream_node_addr_t *a_node_addr, bool a_no_error) { -// sanity check dap_managed_net_t *l_net = s_find_net_by_id(a_net_id); dap_return_if_pass(!l_net); -// memory alloc - struct link_accounting_args *l_args = NULL; - DAP_NEW_Z_RET(l_args, struct link_accounting_args, NULL); -// func work + struct link_accounting_args *l_args = DAP_NEW_Z_RET_IF_FAIL(struct link_accounting_args); *l_args = (struct link_accounting_args) { .addr = *a_node_addr, .net = l_net, .no_error = a_no_error }; dap_proc_thread_callback_add_pri(s_query_thread, s_link_accounting_callback, l_args, DAP_QUEUE_MSG_PRIORITY_NORMAL); } @@ -1253,13 +1228,12 @@ dap_stream_node_addr_t *dap_link_manager_get_net_links_addrs(uint64_t a_net_id, return NULL; } // memory alloc - dap_stream_node_addr_t *l_ret = NULL; - DAP_NEW_Z_COUNT_RET_VAL(l_ret, dap_stream_node_addr_t, l_count, NULL, NULL); + dap_stream_node_addr_t *l_ret = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_stream_node_addr_t, l_count, NULL); // func work pthread_rwlock_rdlock(&s_link_manager->links_lock); - size_t l_cur_count = 0; + size_t i, l_cur_count = 0; dap_stream_node_addr_t *l_links_addrs = dap_cluster_get_all_members_addrs((dap_cluster_t *)l_net->link_clusters->data, &l_cur_count, -1); - for (size_t i = 0; i < l_cur_count; ++i) { + for (i = 0; i < l_cur_count; ++i) { dap_link_t *l_link = NULL; HASH_FIND(hh, s_link_manager->links, l_links_addrs + i, sizeof(l_links_addrs[i]), l_link); if (!l_link || (l_link->is_uplink && a_established_only && l_link->uplink.state != LINK_STATE_ESTABLISHED)) { @@ -1275,10 +1249,8 @@ dap_stream_node_addr_t *dap_link_manager_get_net_links_addrs(uint64_t a_net_id, } DAP_DEL_Z(l_links_addrs); pthread_rwlock_unlock(&s_link_manager->links_lock); - if (!l_uplinks_count && !l_downlinks_count) { - DAP_DELETE(l_ret); - return NULL; - } + if (!l_uplinks_count && !l_downlinks_count) + DAP_DEL_Z(l_ret); if (a_uplinks_count) *a_uplinks_count = l_uplinks_count; if (a_downlinks_count) diff --git a/net/server/enc_server/dap_enc_http.c b/net/server/enc_server/dap_enc_http.c index b380707c90c96f90624ff8f91993f1d35ee1641d..c8d41cc257a3192ea9b0a6836d608991ddea2e47 100644 --- a/net/server/enc_server/dap_enc_http.c +++ b/net/server/enc_server/dap_enc_http.c @@ -71,14 +71,15 @@ void enc_http_deinit() } static void _enc_http_write_reply(struct dap_http_simple *a_cl_st, - const char* a_encrypt_id, - const char* a_encrypt_msg, const char *a_node_sign) + const char* a_encrypt_id, int a_id_len, + const char* a_encrypt_msg,int a_msg_len, + const char* a_node_sign, int a_sign_len) { struct json_object *l_jobj = json_object_new_object(); - json_object_object_add(l_jobj, "encrypt_id", json_object_new_string(a_encrypt_id)); - json_object_object_add(l_jobj, "encrypt_msg", json_object_new_string(a_encrypt_msg)); + json_object_object_add(l_jobj, "encrypt_id", json_object_new_string_len(a_encrypt_id, a_id_len)); + json_object_object_add(l_jobj, "encrypt_msg", json_object_new_string_len(a_encrypt_msg, a_msg_len)); if (a_node_sign) - json_object_object_add(l_jobj, "node_sign", json_object_new_string(a_node_sign)); + json_object_object_add(l_jobj, "node_sign", json_object_new_string_len(a_node_sign, a_sign_len)); json_object_object_add(l_jobj, "dap_protocol_version", json_object_new_int(DAP_PROTOCOL_VERSION)); const char* l_json_str = json_object_to_json_string(l_jobj); dap_http_simple_reply(a_cl_st, (void*) l_json_str, (size_t) strlen(l_json_str)); @@ -114,8 +115,10 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) log_it(L_DEBUG, "Stream encryption: %s\t public key exchange: %s",dap_enc_get_type_name(l_enc_block_type), dap_enc_get_type_name(l_pkey_exchange_type)); - uint8_t alice_msg[cl_st->request_size]; - size_t l_decode_len = dap_enc_base64_decode(cl_st->request, cl_st->request_size, alice_msg, DAP_ENC_DATA_TYPE_B64); + size_t l_decode_len = DAP_ENC_BASE64_DECODE_SIZE(cl_st->request_size); + uint8_t alice_msg[l_decode_len + 1]; + l_decode_len = dap_enc_base64_decode(cl_st->request, cl_st->request_size, alice_msg, DAP_ENC_DATA_TYPE_B64); + alice_msg[l_decode_len] = '\0'; dap_chain_hash_fast_t l_sign_hash = {0}; if (!l_protocol_version && !l_sign_count) { if (l_decode_len > l_pkey_exchange_size + sizeof(dap_sign_hdr_t)) { @@ -176,7 +179,9 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) char *encrypt_msg = DAP_NEW_Z_SIZE(char, DAP_ENC_BASE64_ENCODE_SIZE(l_pkey_exchange_key->pub_key_data_size) + 1), encrypt_id[DAP_ENC_BASE64_ENCODE_SIZE(DAP_ENC_KS_KEY_ID_SIZE) + 1] = { '\0' }; - dap_enc_base64_encode(l_pkey_exchange_key->pub_key_data, l_pkey_exchange_key->pub_key_data_size, encrypt_msg, DAP_ENC_DATA_TYPE_B64); + int l_enc_msg_len = (int)dap_enc_base64_encode( l_pkey_exchange_key->pub_key_data, + l_pkey_exchange_key->pub_key_data_size, + encrypt_msg, DAP_ENC_DATA_TYPE_B64); l_enc_key_ks->key = dap_enc_key_new_generate(l_enc_block_type, l_pkey_exchange_key->priv_key_data, // shared key @@ -184,7 +189,9 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) l_enc_key_ks->id, DAP_ENC_KS_KEY_ID_SIZE, l_block_key_size); dap_enc_ks_save_in_storage(l_enc_key_ks); - dap_enc_base64_encode(l_enc_key_ks->id, sizeof (l_enc_key_ks->id), encrypt_id, DAP_ENC_DATA_TYPE_B64); + int l_enc_id_len = (int)dap_enc_base64_encode(l_enc_key_ks->id, sizeof (l_enc_key_ks->id), + encrypt_id, DAP_ENC_DATA_TYPE_B64), + l_node_msg_len = 0; // save verified node addr and generate own sign char* l_node_sign_msg = NULL; @@ -211,11 +218,11 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) DAP_DELETE(l_node_sign); return; } - dap_enc_base64_encode(l_node_sign, l_node_sign_size, l_node_sign_msg, DAP_ENC_DATA_TYPE_B64); + l_node_msg_len = (int)dap_enc_base64_encode(l_node_sign, l_node_sign_size, l_node_sign_msg, DAP_ENC_DATA_TYPE_B64); DAP_DELETE(l_node_sign); } - _enc_http_write_reply(cl_st, encrypt_id, encrypt_msg, l_node_sign_msg); + _enc_http_write_reply(cl_st, encrypt_id, l_enc_id_len, encrypt_msg, l_enc_msg_len, l_node_sign_msg, l_node_msg_len); DAP_DELETE(encrypt_msg); dap_enc_key_delete(l_pkey_exchange_key); DAP_DEL_Z(l_node_sign_msg); @@ -249,12 +256,7 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *a_http_simp dap_enc_key_t * l_key= dap_enc_ks_find_http(a_http_simple->http_client); if(l_key){ - enc_http_delegate_t * dg = DAP_NEW_Z(enc_http_delegate_t); - if (!dg) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - DAP_DEL_Z(dg); - return NULL; - } + enc_http_delegate_t * dg = DAP_NEW_Z_RET_VAL_IF_FAIL(enc_http_delegate_t, NULL); dg->key=l_key; dg->http=a_http_simple->http_client; // dg->isOk=true; @@ -391,10 +393,10 @@ size_t enc_http_reply_f(enc_http_delegate_t *a_http_delegate, const char *a_data char *l_buf = DAP_NEW_SIZE(char, mem_size); if (!l_buf) { va_end(ap_copy); - log_it(L_ERROR, "Can not allocate memory"); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return 0; } - vsprintf(l_buf, a_data, ap_copy); + vsnprintf(l_buf, mem_size, a_data, ap_copy); va_end(ap_copy); size_t l_ret = enc_http_reply(a_http_delegate, l_buf, mem_size); DAP_DELETE(l_buf); diff --git a/net/server/http_server/dap_http_simple.c b/net/server/http_server/dap_http_simple.c index d73c26c2a11f094814494a30439ffcedf9e841a5..d96035564ae4b78e61244e16143da53e3e14711f 100644 --- a/net/server/http_server/dap_http_simple.c +++ b/net/server/http_server/dap_http_simple.c @@ -289,8 +289,7 @@ inline static void s_copy_reply_and_mime_to_response( dap_http_simple_t *a_simpl return log_it( L_WARNING, " cl_sh->reply_size equal 0" ); a_simple->http_client->out_content_length = a_simple->reply_size; - strcpy( a_simple->http_client->out_content_type, a_simple->reply_mime ); - + dap_strncpy( a_simple->http_client->out_content_type, a_simple->reply_mime, sizeof(a_simple->http_client->out_content_type) - 1 ); return; } @@ -309,7 +308,7 @@ inline static void s_write_response_bad_request( dap_http_simple_t * a_http_simp const char* json_str = json_object_to_json_string( jobj ); dap_http_simple_reply(a_http_simple, (void*) json_str, (size_t) strlen(json_str) ); - strcpy( a_http_simple->reply_mime, "application/json" ); + dap_strncpy( a_http_simple->reply_mime, "application/json", sizeof(a_http_simple->reply_mime) - 1 ); s_copy_reply_and_mime_to_response( a_http_simple ); @@ -451,10 +450,16 @@ void s_http_client_data_read( dap_http_client_t *a_http_client, void * a_arg ) if( bytes_to_read ) { // Oops! The client sent more data than write in the CONTENT_LENGTH header if(l_http_simple->request_size + bytes_to_read > l_http_simple->request_size_max){ - log_it(L_WARNING, "Oops! Client sent more data length=%zu than in content-length=%zu in request", l_http_simple->request_size + bytes_to_read, a_http_client->in_content_length); + log_it(L_WARNING, "Client sent more data length=%zu than in content-length=%zu in request", l_http_simple->request_size + bytes_to_read, a_http_client->in_content_length); l_http_simple->request_size_max = l_http_simple->request_size + bytes_to_read + 1; // increase input buffer - l_http_simple->request = DAP_REALLOC(l_http_simple->request, l_http_simple->request_size_max); + byte_t *l_req_new = DAP_REALLOC((byte_t*)l_http_simple->request, l_http_simple->request_size_max); + if (!l_req_new) { + log_it(L_CRITICAL, "%s", c_error_memory_alloc); + dap_events_socket_set_readable_unsafe(a_http_client->esocket, false); + return; + } + l_http_simple->request = l_req_new; } if(l_http_simple->request){// request_byte=request memcpy( l_http_simple->request_byte + l_http_simple->request_size, a_http_client->esocket->buf_in, bytes_to_read ); @@ -527,7 +532,7 @@ size_t dap_http_simple_reply_f(dap_http_simple_t *a_http_simple, const char *a_f return 0; } char *l_buf = DAP_NEW_SIZE(char, l_buf_size); - vsprintf(l_buf, a_format, ap_copy); + vsnprintf(l_buf, l_buf_size, a_format, ap_copy); va_end(ap_copy); size_t l_ret = dap_http_simple_reply(a_http_simple, l_buf, l_buf_size); diff --git a/net/server/http_server/http_client/dap_http_user_agent.c b/net/server/http_server/http_client/dap_http_user_agent.c index 733ea7aaf0d65add55c88c73ea13b626c0b2c5ea..09770e1f7845f2cb43959f32d113a4774432eccf 100644 --- a/net/server/http_server/http_client/dap_http_user_agent.c +++ b/net/server/http_server/http_client/dap_http_user_agent.c @@ -80,7 +80,7 @@ dap_http_user_agent_ptr_t dap_http_user_agent_new_from_str(const char* a_user_ag char* l_major = strtok(l_version, "."); char* l_minor = strtok(NULL, "."); - if(l_minor == NULL) { + if(!l_major || !l_minor) { log_it(L_ERROR, "Wrong input value %s", a_user_agent_str); goto END; } diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c index 2a25a56a7891e1ac641e961ae4cc55d41fd0c97e..39d1c320a64207209a3126b0a356a98720e71554 100644 --- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c +++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c @@ -150,12 +150,12 @@ static int dap_chain_exec_cmd_list_wait(struct exec_cmd_request *a_exec_cmd_requ #ifdef DAP_OS_WINDOWS EnterCriticalSection(&a_exec_cmd_request->wait_crit_sec); if (a_exec_cmd_request->response) - return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), a_exec_cmd_request->response; + return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), EXEC_CMD_OK; while (!a_exec_cmd_request->response) { if ( !SleepConditionVariableCS(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_crit_sec, a_timeout_ms) ) - a_exec_cmd_request->response = GetLastError() == ERROR_TIMEOUT ? EXEC_CMD_ERR_WAIT_TIMEOUT : EXEC_CMD_ERR_UNKNOWN; + a_exec_cmd_request->error_code = GetLastError() == ERROR_TIMEOUT ? EXEC_CMD_ERR_WAIT_TIMEOUT : EXEC_CMD_ERR_UNKNOWN; } - return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), a_exec_cmd_request->response; + return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), a_exec_cmd_request->error_code; #else pthread_mutex_lock(&a_exec_cmd_request->wait_mutex); if(a_exec_cmd_request->response) @@ -175,14 +175,17 @@ static int dap_chain_exec_cmd_list_wait(struct exec_cmd_request *a_exec_cmd_requ pthread_cond_timedwait(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_mutex, &l_cond_timeout) #endif ) { + case 0: + break; case ETIMEDOUT: - a_exec_cmd_request->response = dap_strdup("ERR_WAIT_TIMEOUT"); - return EXEC_CMD_ERR_WAIT_TIMEOUT; + a_exec_cmd_request->error_code = EXEC_CMD_ERR_WAIT_TIMEOUT; + break; default: + a_exec_cmd_request->error_code = EXEC_CMD_ERR_UNKNOWN; break; } } - return pthread_mutex_unlock(&a_exec_cmd_request->wait_mutex), EXEC_CMD_OK; + return pthread_mutex_unlock(&a_exec_cmd_request->wait_mutex), a_exec_cmd_request->error_code; #endif } @@ -484,7 +487,6 @@ dap_json_rpc_http_request_t *dap_json_rpc_request_sign_by_cert(dap_json_rpc_requ } char* dap_json_rpc_request_to_http_str(dap_json_rpc_request_t *a_request, size_t*output_data_size){ - uint64_t l_id_response = dap_json_rpc_response_registration(a_request); a_request->id = 0; dap_cert_t *l_cert = dap_cert_find_by_name("node-addr"); if (!l_cert) { @@ -502,23 +504,17 @@ int dap_json_rpc_request_send(dap_client_pvt_t* a_client_internal, dap_json_rpc char* l_custom_header = NULL, *l_path = NULL; char* l_request_data_str = dap_json_rpc_request_to_http_str(a_request, &l_request_data_size); - if (!l_request_data_str) { + if (!l_request_data_str) return -1; - } + char * l_enc_request = dap_json_rpc_enc_request(a_client_internal, l_request_data_str, l_request_data_size, &l_path, &l_enc_request_size, &l_custom_header); - DAP_DEL_Z(l_request_data_str); - if (!l_enc_request || !l_path) { - DAP_DEL_Z(l_request_data_str); - DAP_DEL_Z(l_custom_header); - return -2; - } + DAP_DELETE(l_request_data_str); + if (!l_enc_request || !l_path) + return DAP_DEL_MULTY(l_custom_header, l_enc_request, l_path), -1; + struct exec_cmd_request* l_exec_cmd_request = s_exec_cmd_request_init(a_client_internal); - if (!l_exec_cmd_request) { - DAP_DEL_Z(l_custom_header); - DAP_DEL_Z(l_path); - DAP_DEL_Z(l_enc_request); - return -3; - } + if (!l_exec_cmd_request) + return DAP_DEL_MULTY(l_custom_header, l_enc_request, l_path), -1; log_it(L_DEBUG, "Send enc json-rpc request to %s:%d, path = %s, request size = %lu", a_client_internal->client->link_info.uplink_addr, a_client_internal->client->link_info.uplink_port, l_path, l_enc_request_size); diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_response_handler.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_response_handler.c index 941b56bd8acfb4c2e223c768879ed6a1f640cd0c..ab521f7dbc2b416015872b23610c952b1587b1e4 100644 --- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_response_handler.c +++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_response_handler.c @@ -78,21 +78,19 @@ uint64_t dap_json_rpc_response_get_new_id(void) return l_ret; } -void dap_json_rpc_response_accepted(void *a_data, size_t a_size_data, void *a_obj, http_status_code_t http_status) +void dap_json_rpc_response_accepted(void *a_data, size_t a_size_data, UNUSED_ARG void *a_obj, http_status_code_t http_status) { - if(http_status == Http_Status_OK) { - (void)http_status; - (void)a_obj; - log_it(L_NOTICE, "Pre handling response"); - char *l_str = DAP_NEW_SIZE(char, a_size_data); - memcpy(l_str, a_data, a_size_data); - dap_json_rpc_response_t *l_response = dap_json_rpc_response_from_string(l_str); - DAP_FREE(l_str); - dap_json_rpc_response_handler(l_response); - dap_json_rpc_response_free(l_response); - return; - } else { - log_it(L_ERROR, "Response error code: %d", http_status); - return; - } -} + if (http_status != Http_Status_OK) + return log_it(L_ERROR, "Reponse error %d", (int)http_status); + log_it(L_NOTICE, "Pre handling response"); + dap_json_rpc_response_t *l_response; + if ( *((char*)a_data + a_size_data) ) { + char *l_dup = DAP_NEW_Z_SIZE_RET_IF_FAIL(char, a_size_data + 1); + memcpy(l_dup, a_data, a_size_data); + l_response = dap_json_rpc_response_from_string(l_dup); + DAP_DELETE(l_dup); + } else + l_response = dap_json_rpc_response_from_string((char*)a_data); + dap_json_rpc_response_handler(l_response); + dap_json_rpc_response_free(l_response); +} \ No newline at end of file diff --git a/net/server/json_rpc/src/dap_json_rpc.c b/net/server/json_rpc/src/dap_json_rpc.c index 4356696412f0c9132bc8dbd10d80c31765e10220..303ac918a052c8fcfe5c430bbea7e8488b4da316 100644 --- a/net/server/json_rpc/src/dap_json_rpc.c +++ b/net/server/json_rpc/src/dap_json_rpc.c @@ -56,7 +56,7 @@ bool dap_check_node_pkey_in_map(dap_hash_fast_t *a_pkey){ } dap_client_http_callback_error_t * dap_json_rpc_error_callback() { - + return NULL; } int dap_json_rpc_init(dap_server_t* a_http_server, dap_config_t *a_config) diff --git a/net/server/notify_server/include/dap_notify_srv.h b/net/server/notify_server/include/dap_notify_srv.h index 7041fac8d1d63ff57820990f5150203bae328498..b703afe117131d93266bbb792020b0fe6ddfa656 100644 --- a/net/server/notify_server/include/dap_notify_srv.h +++ b/net/server/notify_server/include/dap_notify_srv.h @@ -32,6 +32,6 @@ int dap_notify_server_send_mt(const char * a_data); DAP_PRINTF_ATTR(1, 2) int dap_notify_server_send_f_mt(const char *a_format, ...); typedef bool (*dap_notify_data_user_callback_t)(const char *data); -void dap_notify_data_set_user_callback(dap_notify_data_user_callback_t callback); +void dap_notify_data_set_user_callback(dap_notify_data_user_callback_t a_cb); -void dap_notify_srv_set_callback_new(dap_events_socket_callback_t); \ No newline at end of file +void dap_notify_srv_set_callback_new(dap_events_socket_callback_t a_cb); diff --git a/net/server/notify_server/src/dap_notify_srv.c b/net/server/notify_server/src/dap_notify_srv.c index e8d82ded1754e269bd81f2550bb1580c41573329..30728be945c44394d5631ecf13dd6c78efd4d0b8 100644 --- a/net/server/notify_server/src/dap_notify_srv.c +++ b/net/server/notify_server/src/dap_notify_srv.c @@ -78,7 +78,7 @@ int dap_notify_server_init() } s_notify_server_queue = dap_events_socket_create_type_queue_ptr_mt(dap_events_worker_get_auto(), s_notify_server_callback_queue); uint32_t l_workers_count = dap_events_thread_get_count(); - DAP_NEW_Z_COUNT_RET_VAL(s_notify_server_queue_inter, dap_events_socket_t*, l_workers_count, -2, NULL); + s_notify_server_queue_inter = DAP_NEW_Z_COUNT_RET_VAL_IF_FAIL(dap_events_socket_t*, l_workers_count, -2); for (uint32_t i = 0; i < l_workers_count; ++i) { s_notify_server_queue_inter[i] = dap_events_socket_queue_ptr_create_input(s_notify_server_queue); dap_events_socket_assign_on_worker_mt(s_notify_server_queue_inter[i], dap_events_worker_get(i)); @@ -136,7 +136,7 @@ int dap_notify_server_send_f_inter(uint32_t a_worker_id, const char * a_format,. log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } - vsprintf(l_str, a_format, ap_copy); + vsnprintf(l_str, l_str_size, a_format, ap_copy); va_end(ap_copy); int l_ret = dap_events_socket_queue_ptr_send_to_input(l_input, l_str); DAP_DELETE(l_str); @@ -184,15 +184,12 @@ int dap_notify_server_send_f_mt(const char *a_format, ...) log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } - vsprintf(l_str, a_format, ap_copy); + vsnprintf(l_str, l_str_size, a_format, ap_copy); va_end(ap_copy); - if (s_notify_data_user_callback) s_notify_data_user_callback(l_str); + if (s_notify_data_user_callback) + s_notify_data_user_callback(l_str); - - if(!s_notify_server_queue) // If not initialized - nothing to notify - return 0; - int l_ret = dap_events_socket_queue_ptr_send(s_notify_server_queue, l_str); DAP_DELETE(l_str); return l_ret; @@ -224,7 +221,7 @@ static void s_notify_server_callback_queue(dap_events_socket_t * a_es, void * a_ #endif dap_events_socket_write_mt( dap_events_worker_get(l_worker_id), - l_socket_handler->uuid, l_arg, l_str_len + 1 ); + l_socket_handler->uuid, l_arg, l_str_len + 1 ); } pthread_rwlock_unlock(&s_notify_server_clients_mutex); DAP_DELETE(a_arg); diff --git a/net/stream/ch/dap_stream_ch.c b/net/stream/ch/dap_stream_ch.c index 85ae37e2eea85d126295136b5b62149c3adc4aeb..ca0b15da3ae47dfffd64e07042e43812d5529ce8 100644 --- a/net/stream/ch/dap_stream_ch.c +++ b/net/stream/ch/dap_stream_ch.c @@ -209,7 +209,8 @@ dap_stream_ch_t* dap_stream_ch_new(dap_stream_t* a_stream, uint8_t a_id) { dap_stream_ch_proc_t * proc=dap_stream_ch_proc_find(a_id); if(proc){ - + dap_stream_ch_t **l_channels = DAP_REALLOC_COUNT_RET_VAL_IF_FAIL(a_stream->channel, a_stream->channel_count + 1, NULL); + a_stream->channel = l_channels; dap_stream_ch_t* l_ch_new = dap_stream_ch_alloc(); l_ch_new->me = l_ch_new; @@ -232,7 +233,6 @@ dap_stream_ch_t* dap_stream_ch_new(dap_stream_t* a_stream, uint8_t a_id) if(l_ch_new->proc->new_callback) l_ch_new->proc->new_callback(l_ch_new,NULL); - a_stream->channel = DAP_REALLOC(a_stream->channel, sizeof(dap_stream_ch_t *) * (a_stream->channel_count + 1)); a_stream->channel[l_ch_new->stream->channel_count++] = l_ch_new; return l_ch_new; diff --git a/net/stream/ch/dap_stream_ch_pkt.c b/net/stream/ch/dap_stream_ch_pkt.c index aaa80e54072cde562f943d274fe31a9c4592012a..1632bc51a2ab0253d7a68c73416afeaa7f61eac4 100644 --- a/net/stream/ch/dap_stream_ch_pkt.c +++ b/net/stream/ch/dap_stream_ch_pkt.c @@ -107,7 +107,7 @@ size_t dap_stream_ch_pkt_write_f_mt(dap_stream_worker_t * a_worker , dap_stream_ } l_msg->data_size = l_data_size; l_msg->flags_set = DAP_SOCK_READY_TO_WRITE; - l_data_size = vsprintf(l_msg->data, a_format, ap_copy); + l_data_size = vsnprintf(l_msg->data, l_data_size, a_format, ap_copy); va_end(ap_copy); va_end(ap); @@ -160,7 +160,7 @@ size_t dap_stream_ch_pkt_write_f_inter(dap_events_socket_t * a_queue , dap_stre } l_msg->data_size = l_data_size; l_msg->flags_set = DAP_SOCK_READY_TO_WRITE; - l_data_size = vsprintf(l_msg->data, a_format, ap_copy); + l_data_size = vsnprintf(l_msg->data, l_data_size, a_format, ap_copy); va_end(ap_copy); int l_ret= dap_events_socket_queue_ptr_send_to_input(a_queue , l_msg ); @@ -196,7 +196,7 @@ size_t dap_stream_ch_pkt_write_mt(dap_stream_worker_t * a_worker , dap_stream_ch l_msg->ch_uuid = a_ch_uuid; l_msg->ch_pkt_type = a_type; if (a_data && a_data_size) - l_msg->data = DAP_DUP_SIZE(a_data, a_data_size); + l_msg->data = DAP_DUP_SIZE((char*)a_data, a_data_size); l_msg->flags_set = DAP_SOCK_READY_TO_WRITE; l_msg->data_size = a_data_size; @@ -222,7 +222,7 @@ int dap_stream_ch_pkt_send_mt(dap_stream_worker_t *a_worker, dap_events_socket_u l_msg->ch_pkt_type = a_type; l_msg->ch_id = a_ch_id; if (a_data && a_data_size) { - l_msg->data = DAP_DUP_SIZE(a_data, a_data_size); + l_msg->data = DAP_DUP_SIZE((char*)a_data, a_data_size); if (!l_msg->data) { log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_msg); @@ -269,7 +269,7 @@ size_t dap_stream_ch_pkt_write_inter(dap_events_socket_t * a_queue_input, dap_st l_msg->ch_uuid = a_ch_uuid; l_msg->ch_pkt_type = a_type; if (a_data && a_data_size) - l_msg->data = DAP_DUP_SIZE(a_data, a_data_size); + l_msg->data = DAP_DUP_SIZE((char*)a_data, a_data_size); l_msg->data_size = a_data_size; l_msg->flags_set = DAP_SOCK_READY_TO_WRITE; @@ -389,7 +389,7 @@ ssize_t dap_stream_ch_pkt_write_f_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, va_end(ap_copy); return l_data_size--; } - vsprintf(l_data, a_format, ap_copy); + vsnprintf(l_data, l_data_size, a_format, ap_copy); va_end(ap_copy); size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_data, l_data_size); DAP_DELETE(l_data); diff --git a/net/stream/stream/dap_stream.c b/net/stream/stream/dap_stream.c index 085d40a5226ffd99ae16f021a26a3b10ce57a91e..23f7ab17615ca89a27bad94bd8708e7759f3060c 100644 --- a/net/stream/stream/dap_stream.c +++ b/net/stream/stream/dap_stream.c @@ -1063,39 +1063,36 @@ dap_list_t *dap_stream_find_all_by_addr(dap_stream_node_addr_t *a_addr) */ dap_stream_node_addr_t dap_stream_node_addr_from_sign(dap_sign_t *a_sign) { - dap_stream_node_addr_t l_ret = {0}; + dap_stream_node_addr_t l_ret = { }; dap_return_val_if_pass(!a_sign, l_ret); dap_hash_fast_t l_node_addr_hash; - dap_sign_get_pkey_hash(a_sign, &l_node_addr_hash); - dap_stream_node_addr_from_hash(&l_node_addr_hash, &l_ret); - + if ( dap_sign_get_pkey_hash(a_sign, &l_node_addr_hash) ) + dap_stream_node_addr_from_hash(&l_node_addr_hash, &l_ret); return l_ret; } dap_stream_node_addr_t dap_stream_node_addr_from_cert(dap_cert_t *a_cert) { - dap_stream_node_addr_t l_ret = {0}; + dap_stream_node_addr_t l_ret = { }; dap_return_val_if_pass(!a_cert, l_ret); // Get certificate public key hash dap_hash_fast_t l_node_addr_hash; - dap_cert_get_pkey_hash(a_cert, &l_node_addr_hash); - dap_stream_node_addr_from_hash(&l_node_addr_hash, &l_ret); - + if ( !dap_cert_get_pkey_hash(a_cert, &l_node_addr_hash) ) + dap_stream_node_addr_from_hash(&l_node_addr_hash, &l_ret); return l_ret; } dap_stream_node_addr_t dap_stream_node_addr_from_pkey(dap_pkey_t *a_pkey) { - dap_stream_node_addr_t l_ret = {0}; + dap_stream_node_addr_t l_ret = { }; dap_return_val_if_pass(!a_pkey, l_ret); // Get certificate public key hash dap_hash_fast_t l_node_addr_hash; - dap_pkey_get_hash(a_pkey, &l_node_addr_hash); - dap_stream_node_addr_from_hash(&l_node_addr_hash, &l_ret); - + if ( dap_pkey_get_hash(a_pkey, &l_node_addr_hash) ) + dap_stream_node_addr_from_hash(&l_node_addr_hash, &l_ret); return l_ret; } @@ -1104,7 +1101,7 @@ static void s_stream_fill_info(dap_stream_t *a_stream, dap_stream_info_t *a_out_ a_out_info->node_addr = a_stream->node; a_out_info->remote_addr_str = dap_strdup_printf("%-*s", INET_ADDRSTRLEN - 1, a_stream->esocket->remote_addr_str); a_out_info->remote_port = a_stream->esocket->remote_port; - a_out_info->channels = DAP_NEW_Z_SIZE(char, a_stream->channel_count + 1); + a_out_info->channels = DAP_NEW_Z_SIZE_RET_IF_FAIL(char, a_stream->channel_count + 1, a_out_info->remote_addr_str); for (size_t i = 0; i < a_stream->channel_count; i++) a_out_info->channels[i] = a_stream->channel[i]->proc->id; a_out_info->total_packets_sent = a_stream->seq_id; diff --git a/net/stream/stream/dap_stream_cluster.c b/net/stream/stream/dap_stream_cluster.c index 159531d245ee6c626b71aed9b9ce3d63baebc76f..391ee52398812e2af82573bf65db824ecf5745bf 100644 --- a/net/stream/stream/dap_stream_cluster.c +++ b/net/stream/stream/dap_stream_cluster.c @@ -422,7 +422,7 @@ dap_stream_node_addr_t *dap_cluster_get_all_members_addrs(dap_cluster_t *a_clust } } if (l_bias < l_count) - ret = DAP_REALLOC(ret, sizeof(dap_stream_node_addr_t) * l_bias); + ret = DAP_REALLOC_COUNT(ret, l_bias); } pthread_rwlock_unlock(&a_cluster->members_lock); if (a_count) diff --git a/net/stream/stream/dap_stream_pkt.c b/net/stream/stream/dap_stream_pkt.c index 9d482f34dd732d46bf0bf5d8723595b32b077bdf..f92a12da5c7d8e8a7050fdd789ed10a95418262f 100644 --- a/net/stream/stream/dap_stream_pkt.c +++ b/net/stream/stream/dap_stream_pkt.c @@ -88,33 +88,19 @@ size_t dap_stream_pkt_write_mt(dap_worker_t * a_w,dap_events_socket_uuid_t a_es_ memcpy(l_pkt_hdr->sig, c_dap_stream_sig, sizeof(l_pkt_hdr->sig)); return dap_events_socket_write_mt(a_w, a_es_uuid, s_pkt_buf, l_full_size); #else - dap_worker_msg_io_t * l_msg = DAP_NEW_Z(dap_worker_msg_io_t); - if (!l_msg) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return 0; - } - dap_stream_pkt_hdr_t *l_pkt_hdr; + dap_worker_msg_io_t *l_msg = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_worker_msg_io_t, 0); l_msg->esocket_uuid = a_es_uuid; - l_msg->data_size = 16-a_data_size%16+a_data_size+sizeof(*l_pkt_hdr); - l_msg->data = DAP_NEW_SIZE(void,l_msg->data_size); - if (!l_msg) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - DAP_DEL_Z(l_msg); - return 0; - } - l_pkt_hdr=(dap_stream_pkt_hdr_t*) l_msg->data; - memset(l_pkt_hdr,0,sizeof(*l_pkt_hdr)); - memcpy(l_pkt_hdr->sig,c_dap_stream_sig,sizeof(l_pkt_hdr->sig)); - l_msg->data_size=sizeof (*l_pkt_hdr) +dap_enc_code(a_key, a_data,a_data_size, ((byte_t*)l_msg->data)+sizeof (*l_pkt_hdr),l_msg->data_size-sizeof (*l_pkt_hdr),DAP_ENC_DATA_TYPE_RAW); + l_msg->data_size = dap_enc_code_out_size(a_key, a_data_size, DAP_ENC_DATA_TYPE_RAW); + l_msg->data = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(void, l_msg->data_size, 0, l_msg); + dap_stream_pkt_hdr_t *l_pkt_hdr = (dap_stream_pkt_hdr_t*)l_msg->data; + memcpy(l_pkt_hdr->sig, c_dap_stream_sig, sizeof(l_pkt_hdr->sig)); + l_msg->data_size = sizeof(*l_pkt_hdr) + dap_enc_code(a_key, a_data, a_data_size, + ((byte_t*)l_msg->data) + sizeof(*l_pkt_hdr), l_msg->data_size, DAP_ENC_DATA_TYPE_RAW); - int l_ret= dap_events_socket_queue_ptr_send(a_w->queue_es_io, l_msg ); - if (l_ret!=0){ - log_it(L_ERROR, "Wasn't send pointer to queue: code %d", l_ret); - DAP_DELETE(l_msg->data); - DAP_DELETE(l_msg); - return 0; - } - return a_data_size; + int l_ret = dap_events_socket_queue_ptr_send(a_w->queue_es_io, l_msg); + return l_ret + ? log_it(L_ERROR, "Can't send msg to queue %d, error %d", a_w->queue_es_io->fd, l_ret), DAP_DEL_MULTY(l_msg->data, l_msg), 0 + : a_data_size; #endif } diff --git a/net/stream/stream/include/dap_stream_cluster.h b/net/stream/stream/include/dap_stream_cluster.h index 8e99f963cff1df8e3f45b119cb9989dbfd3c8299..4c29a9d165df8cbf463536b9bd1cd7da127e464a 100644 --- a/net/stream/stream/include/dap_stream_cluster.h +++ b/net/stream/stream/include/dap_stream_cluster.h @@ -62,7 +62,7 @@ typedef enum dap_cluster_status { } dap_cluster_status_t; typedef struct dap_cluster { - const char *mnemonim; // Field for alternative cluster finding, unique + char *mnemonim; // Field for alternative cluster finding, unique dap_guuid_t guuid; // Unique global cluster id dap_cluster_type_t type; // Link management type dap_cluster_status_t status; // Active or inactive for now diff --git a/net/stream/stream/include/dap_stream_worker.h b/net/stream/stream/include/dap_stream_worker.h index e868eb8853835ceaa3c5fb092d01cf7c12b4a408..f2f2a039f37bd511b3bcf09c1ae457e10c6d3ba7 100644 --- a/net/stream/stream/include/dap_stream_worker.h +++ b/net/stream/stream/include/dap_stream_worker.h @@ -50,7 +50,7 @@ typedef struct dap_stream_worker_msg_send { dap_events_socket_uuid_t uuid; char ch_id; uint8_t ch_pkt_type; - const void *data; + void *data; size_t data_size; } dap_stream_worker_msg_send_t; diff --git a/plugin/src/dap_plugin_manifest.c b/plugin/src/dap_plugin_manifest.c index 642beea46df02953d2ee75d5a40afaad07fa6198..ae6de2de5746c47a2175a548b9fe32ecce4b7d90 100644 --- a/plugin/src/dap_plugin_manifest.c +++ b/plugin/src/dap_plugin_manifest.c @@ -105,7 +105,7 @@ dap_plugin_manifest_t* dap_plugin_manifest_add_from_file(const char *a_file_path if(!json_object_is_type(l_json, json_type_object)) { log_it(L_ERROR, "Invalid manifest structure, shoud be a json object: %s", a_file_path); json_object_put(l_json); - return NULL; + return NULL; } json_object *j_name = json_object_object_get(l_json, "name"); @@ -128,27 +128,25 @@ dap_plugin_manifest_t* dap_plugin_manifest_add_from_file(const char *a_file_path if (!l_name || !l_version || !l_author || !l_description || !l_type) { log_it(L_ERROR, "Invalid manifest structure, insuficient fields %s", a_file_path); + return NULL; } dap_plugin_manifest_t *l_manifest = NULL; HASH_FIND_STR(s_manifests, l_name, l_manifest); - if(l_manifest){ - log_it(L_ERROR, "Plugin name \"%s\" is already present", l_name); - return NULL; - } + if (l_manifest) + return json_object_put(l_json), log_it(L_ERROR, "Plugin name \"%s\" is already present", l_name), l_manifest; + size_t l_dependencies_count = j_dependencies ? (size_t)json_object_array_length(j_dependencies) : 0; size_t l_params_count = j_params ? (size_t)json_object_array_length(j_params) : 0; - char ** l_dependencies_names = NULL, **l_params = NULL; + char **l_dependencies_names = NULL, **l_params = NULL; // Read dependencies; if(l_dependencies_count) { - l_dependencies_names = DAP_NEW_SIZE(char*, sizeof(char*)* l_dependencies_count ); - if (!l_dependencies_names) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return NULL; - } + if (!( l_dependencies_names = DAP_NEW_Z_COUNT(char*, l_dependencies_count) )) + return json_object_put(l_json), log_it(L_CRITICAL, "%s", c_error_memory_alloc), NULL; + for (size_t i = 0; i < l_dependencies_count; i++){ l_dependencies_names[i] = dap_strdup(json_object_get_string(json_object_array_get_idx(j_dependencies, i))); } @@ -157,10 +155,11 @@ dap_plugin_manifest_t* dap_plugin_manifest_add_from_file(const char *a_file_path // Read additional params if(l_params_count) { - l_params = DAP_NEW_SIZE(char*, sizeof(char*)* l_params_count ); - if (!l_params) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return NULL; + if (!( l_params = DAP_NEW_Z_COUNT(char*, l_params_count) )) { + json_object_put(l_json); + DAP_DEL_ARRAY(l_dependencies_names, l_dependencies_count); + DAP_DELETE(l_dependencies_names); + return log_it(L_CRITICAL, "%s", c_error_memory_alloc), NULL; } for (size_t i = 0; i < l_params_count; i++){ l_params[i] = dap_strdup(json_object_get_string(json_object_array_get_idx(j_params, i))); @@ -168,10 +167,12 @@ dap_plugin_manifest_t* dap_plugin_manifest_add_from_file(const char *a_file_path } // Create manifest itself - l_manifest = DAP_NEW_Z(dap_plugin_manifest_t); - if (!l_manifest) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return NULL; + if (!( l_manifest = DAP_NEW_Z(dap_plugin_manifest_t) )) { + json_object_put(l_json); + DAP_DEL_ARRAY(l_dependencies_names, l_dependencies_count); + DAP_DEL_ARRAY(l_params, l_params_count); + DAP_DEL_MULTY(l_dependencies_names, l_params); + return log_it(L_CRITICAL, "%s", c_error_memory_alloc), NULL; } strncpy(l_manifest->name,l_name, sizeof(l_manifest->name)-1); @@ -183,22 +184,14 @@ dap_plugin_manifest_t* dap_plugin_manifest_add_from_file(const char *a_file_path l_manifest->dependencies_count = l_dependencies_count; l_manifest->params_count = l_params_count; l_manifest->params = l_params; + l_manifest->path = l_path ? dap_strdup(l_path) : dap_path_get_dirname(a_file_path); - if(l_path){ // If targeted manualy plugin's path - l_manifest->path = l_path; - }else{ // Compose it from plugin root path - l_manifest->path = dap_path_get_dirname(a_file_path); - } - - char * l_config_path = dap_strdup_printf("%s/%s", l_manifest->path,l_manifest->name ); - char * l_config_path_test = dap_strdup_printf("%s.cfg", l_config_path); + char *l_config_path = dap_strdup_printf("%s/%s", l_manifest->path, l_manifest->name), + *l_config_path_test = dap_strdup_printf("%s.cfg", l_config_path); if(dap_file_test(l_config_path_test)) // If present custom config l_manifest->config = dap_config_open(l_config_path); - DAP_DELETE(l_config_path); - DAP_DELETE(l_config_path_test); - - HASH_ADD_STR(s_manifests,name,l_manifest); - + DAP_DEL_MULTY(l_config_path, l_config_path_test); + HASH_ADD_STR(s_manifests, name, l_manifest); json_object_put(l_json); return l_manifest; } @@ -253,15 +246,10 @@ char* dap_plugin_manifests_get_list_dependencies(dap_plugin_manifest_t *a_elemen */ static void s_manifest_delete(dap_plugin_manifest_t *a_manifest) { - DAP_DELETE(a_manifest->name); - DAP_DELETE(a_manifest->version); - DAP_DELETE(a_manifest->author); - DAP_DELETE(a_manifest->description); - if(a_manifest->dependencies_names){ - for(size_t i = 0; i< a_manifest->dependencies_count; i++) - DAP_DELETE(a_manifest->dependencies_names[i]); - DAP_DELETE(a_manifest->dependencies_names); - } + DAP_DEL_ARRAY(a_manifest->dependencies_names, a_manifest->dependencies_count); + DAP_DEL_ARRAY(a_manifest->params, a_manifest->params_count); + DAP_DEL_MULTY(a_manifest->name, a_manifest->version, a_manifest->author, a_manifest->description, + a_manifest->type, (char*)a_manifest->path, a_manifest->dependencies_names, a_manifest->params); dap_plugin_manifest_dependence_t * l_dep, *l_tmp; HASH_ITER(hh,a_manifest->dependencies,l_dep,l_tmp){ HASH_DELETE(hh, a_manifest->dependencies, l_dep);