1 /*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 * http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15 #include "hitls_build.h"
16 #include "securec.h"
17 #include "bsl_sal.h"
18 #include "bsl_list.h"
19 #include "bsl_err_internal.h"
20 #include "tls_binlog_id.h"
21 #include "bsl_log_internal.h"
22 #include "hitls_error.h"
23 #include "tls.h"
24 #include "record.h"
25 #include "rec_buf.h"
26
RecBufNew(uint32_t bufSize)27 RecBuf *RecBufNew(uint32_t bufSize)
28 {
29 RecBuf *buf = (RecBuf *)BSL_SAL_Calloc(1, sizeof(RecBuf));
30 if (buf == NULL) {
31 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID17210, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "Calloc fail", 0, 0, 0, 0);
32 return NULL;
33 }
34
35 buf->buf = (uint8_t *)BSL_SAL_Calloc(1, bufSize);
36 if (buf->buf == NULL) {
37 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID17211, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "Calloc fail", 0, 0, 0, 0);
38 BSL_SAL_FREE(buf);
39 return NULL;
40 }
41 buf->isHoldBuffer = true;
42 buf->bufSize = bufSize;
43 return buf;
44 }
45
RecBufResize(RecBuf * recBuf,uint32_t size)46 int32_t RecBufResize(RecBuf *recBuf, uint32_t size)
47 {
48 if (recBuf == NULL || recBuf->bufSize == size || recBuf->end - recBuf->start > size) {
49 return HITLS_SUCCESS;
50 }
51 uint8_t *newBuf = BSL_SAL_Calloc(size, sizeof(uint8_t));
52 if (newBuf == NULL) {
53 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID17212, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "Calloc fail", 0, 0, 0, 0);
54 BSL_ERR_PUSH_ERROR(HITLS_MEMALLOC_FAIL);
55 return HITLS_MEMALLOC_FAIL;
56 }
57 (void)memcpy_s(newBuf, size, &recBuf->buf[recBuf->start], recBuf->end - recBuf->start);
58 recBuf->end = recBuf->end - recBuf->start;
59 recBuf->start = 0;
60 BSL_SAL_FREE(recBuf->buf);
61 recBuf->buf = newBuf;
62 recBuf->bufSize = size;
63 return HITLS_SUCCESS;
64 }
65
RecBufFree(RecBuf * buf)66 void RecBufFree(RecBuf *buf)
67 {
68 if (buf != NULL) {
69 if (buf->isHoldBuffer) {
70 BSL_SAL_FREE(buf->buf);
71 }
72 BSL_SAL_FREE(buf);
73 }
74 return;
75 }
76
RecBufClean(RecBuf * buf)77 void RecBufClean(RecBuf *buf)
78 {
79 buf->start = 0;
80 buf->end = 0;
81 return;
82 }
83
RecBufListNew(void)84 RecBufList *RecBufListNew(void)
85 {
86 return BSL_LIST_New(sizeof(RecBuf));
87 }
88
RecBufListFree(RecBufList * bufList)89 void RecBufListFree(RecBufList *bufList)
90 {
91 BSL_LIST_FREE(bufList, (void(*)(void*))RecBufFree);
92 }
93
RecBufListDereference(RecBufList * bufList)94 int32_t RecBufListDereference(RecBufList *bufList)
95 {
96 RecBuf *recBuf = (RecBuf *)BSL_LIST_GET_FIRST(bufList);
97 while (recBuf != NULL) {
98 if (!recBuf->isHoldBuffer) {
99 uint8_t *buf = (uint8_t *)BSL_SAL_Dump(recBuf->buf, recBuf->bufSize);
100 if (buf == NULL) {
101 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID17215, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
102 "Dump fail", 0, 0, 0, 0);
103 BSL_ERR_PUSH_ERROR(HITLS_MEMALLOC_FAIL);
104 return HITLS_MEMALLOC_FAIL;
105 }
106 recBuf->buf = buf;
107 recBuf->isHoldBuffer = true;
108 }
109 recBuf = (RecBuf *)BSL_LIST_GET_NEXT(bufList);
110 }
111 return HITLS_SUCCESS;
112 }
113
RecBufListEmpty(RecBufList * bufList)114 bool RecBufListEmpty(RecBufList *bufList)
115 {
116 return BSL_LIST_GET_FIRST(bufList) == NULL;
117 }
118
RecBufListGetBuffer(RecBufList * bufList,uint8_t * buf,uint32_t bufLen,uint32_t * getLen,bool isPeek)119 int32_t RecBufListGetBuffer(RecBufList *bufList, uint8_t *buf, uint32_t bufLen, uint32_t *getLen, bool isPeek)
120 {
121 RecBuf *recBuf = (RecBuf *)BSL_LIST_GET_FIRST(bufList);
122 if (recBuf == NULL || recBuf->buf == NULL) {
123 *getLen = 0;
124 return HITLS_SUCCESS;
125 }
126 uint32_t remain = recBuf->end - recBuf->start;
127 uint32_t copyLen = (remain > bufLen) ? bufLen : remain;
128 if (copyLen == 0) {
129 if (recBuf->start == recBuf->end) {
130 BSL_LIST_DeleteCurrent(bufList, (void(*)(void*))RecBufFree);
131 }
132 *getLen = 0;
133 return HITLS_SUCCESS;
134 }
135 uint8_t *startBuf = &recBuf->buf[recBuf->start];
136 int32_t ret = memcpy_s(buf, bufLen, startBuf, copyLen);
137 if (ret != EOK) {
138 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16242, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
139 "RecBufListGetBuffer memcpy_s failed; buf may be nullptr", 0, 0, 0, 0);
140 BSL_ERR_PUSH_ERROR(HITLS_MEMCPY_FAIL);
141 return HITLS_MEMCPY_FAIL;
142 }
143 if (!isPeek) {
144 recBuf->start += copyLen;
145 }
146 *getLen = copyLen;
147 if (recBuf->start == recBuf->end) {
148 BSL_LIST_DeleteCurrent(bufList, (void(*)(void*))RecBufFree);
149 }
150 return HITLS_SUCCESS;
151 }
152
RecBufListAddBuffer(RecBufList * bufList,RecBuf * buf)153 int32_t RecBufListAddBuffer(RecBufList *bufList, RecBuf *buf)
154 {
155 RecBuf *newBuf = BSL_SAL_Calloc(1U, sizeof(RecBuf));
156 if (newBuf == NULL) {
157 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID17216, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "Calloc fail", 0, 0, 0, 0);
158 BSL_ERR_PUSH_ERROR(HITLS_MEMALLOC_FAIL);
159 return HITLS_MEMALLOC_FAIL;
160 }
161 (void)memcpy_s(newBuf, sizeof(RecBuf), buf, sizeof(RecBuf));
162 if (BSL_LIST_AddElement(bufList, newBuf, BSL_LIST_POS_END) != BSL_SUCCESS) {
163 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID17217, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
164 "AddElement fail", 0, 0, 0, 0);
165 BSL_SAL_FREE(newBuf);
166 return HITLS_MEMCPY_FAIL;
167 }
168 return HITLS_SUCCESS;
169 }