当前位置: 首页 > news >正文

织梦wap模板自适应手机网站dedecms模板下载wordpress建一个网站

织梦wap模板自适应手机网站dedecms模板下载,wordpress建一个网站,网上做网站赚钱,wordpress 128m内存一、背景 在suricata的调试过程中,使用SCLogXXX api进行信息的输出,发现输出的日志被截断了,最开始以为是解析逻辑有问题,没有解析完整,经过排查后,发现SCLogXXX api内部进行了长度限制,最长2K…

一、背景

在suricata的调试过程中,使用SCLogXXX api进行信息的输出,发现输出的日志被截断了,最开始以为是解析逻辑有问题,没有解析完整,经过排查后,发现SCLogXXX api内部进行了长度限制,最长2K。

OS:Ubuntu 22.04.5 LTS
IDE: vscode
Suricata: suricata 7.0.5

二、 问题复现

拷贝一个规则,将规则内容填充任意内容,使其达到2K以上
请添加图片描述

规则重复时,输出错误日志,日志截断
请添加图片描述

三、分析

3.1 源码实现

// src/util-debug.h
/* The maximum length of the log message */
#define SC_LOG_MAX_LOG_MSG_LEN 2048// src/util-debug.c
void SCLogErr(int x, const char *file, const char *func, const int line, const char *module,const char *fmt, ...)
{if (sc_log_global_log_level >= x &&(sc_log_fg_filters_present == 0 ||SCLogMatchFGFilterWL(file, func, line) == 1 ||SCLogMatchFGFilterBL(file, func, line) == 1) &&(sc_log_fd_filters_present == 0 ||SCLogMatchFDFilter(func) == 1)){char msg[SC_LOG_MAX_LOG_MSG_LEN];va_list ap;va_start(ap, fmt);vsnprintf(msg, sizeof(msg), fmt, ap);va_end(ap);SCLogMessage(x, file, line, func, module, msg);}
}

从实现中可以看出,首先将数据格式化到一个局部临时变量中,再将临时变量输出。
而临时变量是一个2K的字符数组,因此需要输出的数据超过2K将被截断。

3.2 为啥需要临时变量

  1. 将可变参数格式化成一个字符串,需要一个存储空间
  2. 栈变量是线程安全的
  3. 简单通用

3.3 是否可以增加空间

可以增加SC_LOG_MAX_LOG_MSG_LEN的值,但是不推荐

  1. 每条日志大小一般都很小,2K已经满足90%以上的情况
  2. 栈变量太大,递归或深层调用可能会耗尽栈空间
// 栈默认大小(KB)
$ ulimit -s
8192 // 栈最大上限,受系统内存限制
$ ulimit -Hs
unlimited// glibc 中的默认值
$ getconf PTHREAD_STACK_MIN
16384

3.4 非要解决截断问题如何处理

man vsnprintf

The  functions snprintf() and vsnprintf() do not write more than size bytes (including theterminating null byte ('\0')).  If the output was truncated due to this  limit,  then  thereturn value is the number of characters (excluding the terminating null byte) which wouldhave been written to the final string if enough space had been available.  Thus, a  returnvalue of size or more means that the output was truncated.  

根据man手册的说明,可以判断vsnprintf的返回值,返回值超过2048时,可以动态申请空间,再次进行格式化

    char msg[SC_LOG_MAX_LOG_MSG_LEN];char *real_msg = msg;va_list ap;va_start(ap, fmt);int ret = vsnprintf(msg, sizeof(msg), fmt, ap);va_end(ap);if (ret > SC_LOG_MAX_LOG_MSG_LEN) { // 被截断real_msg = SCMalloc(ret+1); // 动态分配空间if (likely(real_msg != NULL)) {va_start(ap, fmt);vsnprintf(real_msg, ret+1, fmt, ap); // 重新格式化va_end(ap);} else {real_msg = msg; // 空间申请失败}}SCLogMessage(x, file, line, func, module, real_msg);if (real_msg != msg) {SCFree(real_msg);}

结果是依然被截断了,继续分析SCLogMessage实现

SCError SCLogMessage(const SCLogLevel log_level, const char *file, const unsigned int line,const char *function, const char *module, const char *message)
{char buffer[SC_LOG_MAX_LOG_MSG_LEN] = "";...case SC_LOG_OP_IFACE_CONSOLE:if (SCLogMessageGetBuffer(ts, op_iface_ctx->use_color, op_iface_ctx->type, buffer,sizeof(buffer),op_iface_ctx->log_format ? op_iface_ctx->log_format: sc_log_config->log_format,log_level, file, line, function, module, message) == 0) {SCLogPrintToStream((log_level == SC_LOG_ERROR)? stderr: stdout, buffer);}break;...return SC_OK;
}

又一个buffer[SC_LOG_MAX_LOG_MSG_LEN], 再次被截断

3.5 为啥是两次格式化

请添加图片描述

第一次是将用户输入的信息格式化;
第二次增加额外信息(时间、函数名,行号等),可通过配置决定添加的信息
suricata.yaml

logging:default-log-format: "%D: %S:%l %M"

总结

日志截断问题的主要原因是日志内容经过两次格式化,且每次格式化都使用了固定大小的缓冲区。通过动态分配缓冲区,可以有效避免日志被截断的问题。

http://www.dtcms.com/a/533588.html

相关文章:

  • 大数据方法论与实践指南-企业目标管理举例(小红书)
  • 如何构建一个电子商务网站重庆360网络推广
  • 网站建设的功能要求一个网站的开发周期
  • 跨网络互联技术(UAC-NSSM)
  • 站外推广方式做购物商城类网站需要
  • gemini cli试用体验
  • 建设网站要多少钱wordpress插件数量
  • 自己做网站能赚钱吗做视频网站收入
  • linux做网站最近的时事新闻
  • 一文了解高压互锁功能
  • 力扣2982. 找出出现至少三次的最长特殊子字符串 II
  • 下载网站php源码公司创建网站要多少钱
  • GZ073 网络系统管理赛项赛题第9套B模块(Linux部分)
  • 上海制造网站公司著名软件开发公司
  • 常见网络端口号及端口查看命令
  • 教你如何创建自己的网站建设网站的实验目的
  • 插件开发常用api整理
  • 东莞做网站找微客巴巴wordpress底部导航栏
  • 广州免费建站哪里有网页制作培训学费
  • 怎么修改网站网页的背景图片哈尔滨工业大学包机
  • 网站能不能一边用 一边备案直接进入网址的浏览器
  • 精美网站制作公司外贸网站制作哪家快
  • 网站是用php还是asp 怎么区别云盘建设网站
  • 廉政网站 建设需求汕头建站网站模板
  • 网站需要证件WordPress到底好不好用
  • 东莞网站建设方案咨询江宁网站建设价格
  • 泉州建站哪些公司wordpress 京东插件
  • 自己电脑做服务器上传网站 需要备案吗威海做网站推广的企业
  • 手机网站首页布局设计外围网站代理怎么做
  • 软件著作权申请多少钱一个苏州做网站优化的公司