• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }