Jan Breuer
2016-04-24 1f77a03fa02b0cdbaa878cd7015838638eedc4a8
Fix strndup of NULL, add auto length for SCPI_ErrorPushEx
2个文件已修改
14 ■■■■ 已修改文件
libscpi/inc/scpi/config.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/error.c 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/inc/scpi/config.h
@@ -277,7 +277,7 @@
#endif
#else
#define SCPIDEFINE_DESCRIPTION_MAX_PARTS                1
#define SCPIDEFINE_strdup(h, s, l)                      NULL
#define SCPIDEFINE_strndup(h, s, l)                     NULL
#define SCPIDEFINE_free(h, s, r)
#endif
libscpi/src/error.c
@@ -40,6 +40,7 @@
#include "scpi/ieee488.h"
#include "scpi/error.h"
#include "fifo_private.h"
#include "scpi/constants.h"
#if USE_DEVICE_DEPENDENT_ERROR_INFORMATION
#define SCPI_ERROR_SETVAL(e, c, i) do { (e)->error_code = (c); (e)->device_dependent_info = (i); } while(0)
@@ -129,7 +130,8 @@
static scpi_bool_t SCPI_ErrorAddInternal(scpi_t * context, int16_t err, char * info, size_t info_len) {
    scpi_error_t error_value;
    SCPI_ERROR_SETVAL(&error_value, err, SCPIDEFINE_strndup(&context->error_info_heap, info, info_len));
    char * info_ptr = info ? SCPIDEFINE_strndup(&context->error_info_heap, info, info_len) : NULL;
    SCPI_ERROR_SETVAL(&error_value, err, info_ptr);
    if (!fifo_add(&context->error_queue, &error_value)) {
        SCPIDEFINE_free(&context->error_info_heap, error_value.device_dependent_info, true);
        fifo_remove_last(&context->error_queue, &error_value);
@@ -163,11 +165,17 @@
/**
 * Push error to queue
 * @param context - scpi context
 * @param context
 * @param err - error number
 * @param info - additional text information or NULL for no text
 * @param info_len - length of text or 0 for automatic length
 */
void SCPI_ErrorPushEx(scpi_t * context, int16_t err, char * info, size_t info_len) {
    int i;
    /* automatic calculation of length */
    if (info && info_len == 0) {
        info_len = SCPIDEFINE_strnlen(info, SCPI_STD_ERROR_DESC_MAX_STRING_LENGTH);
    }
    scpi_bool_t queue_overflow = !SCPI_ErrorAddInternal(context, err, info, info_len);
    for (i = 0; i < ERROR_DEFS_N; i++) {