cryptoengine TRNG模块内存泄露
-
写了个afalg测试 TRNG 接口,发现有内存泄露,肉眼可见的内存泄露。应该是发生在内核层面的。
我的芯片是 R328-S3,Tina 3.5 SDK
测试代码如下,原厂大神来看看吧。运行前free一下,然后等跑了几千轮几万轮后再free一下,少了很多MB内存。
用top看一下,发现测试程序没有占用多少内存,所以基本可以石锤是内核层面内存泄露。我这边也慢慢分析下 sunxi-ss 模块哪里有泄露。
#include <errno.h> #include <stdint.h> #include <sys/uio.h> #include <sys/syscall.h> #include <sys/socket.h> #include <linux/if_alg.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #ifndef SOL_ALG #define SOL_ALG 279 #endif int os_get_random(unsigned char *buf, size_t len) { int trng_tfmfd = 0; int trng_opfd = 0; int retval = -1; do { struct sockaddr_alg sa = { .salg_family = AF_ALG, .salg_type = "rng", .salg_name = "trng" }; int ret; trng_tfmfd = socket(AF_ALG, SOCK_SEQPACKET, 0); if (trng_tfmfd < 0) { printf("socket failed\n"); break; } ret = bind(trng_tfmfd, (struct sockaddr *)&sa, sizeof(sa)); if (ret) { printf("bind failed\n"); break; } trng_opfd = accept(trng_tfmfd, NULL, 0); if (trng_opfd < 0) { printf("accept failed\n"); break; } retval = 0; while (len > 0) { ret = read(trng_opfd, buf, len); if (ret < 0) { retval = -1; break; } buf += ret; len -= ret; } } while (0); if (trng_opfd > 0) close(trng_opfd); if (trng_tfmfd > 0) close(trng_tfmfd); return retval; } #if 1 unsigned char trng_buf[65536]; void Test_TRNG(void) { int i = 0; while(1) { os_get_random(trng_buf, 512); if(!(i++ % 1000)) printf("random %d\n", i); } } int main(void) { Test_TRNG(); return 0; } #endif
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号