Skip to content

Commit 1f5915e

Browse files
refactored hexToBin function to reduct code paths and increase code coverage.
made error cleanup more robust
1 parent e3d8ab6 commit 1f5915e

1 file changed

Lines changed: 29 additions & 55 deletions

File tree

src/tools/clu_hex_to_bin.c

Lines changed: 29 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -63,66 +63,40 @@ int wolfCLU_hexToBin(const char* h1, byte** b1, word32* b1Sz,
6363
const char* h3, byte** b3, word32* b3Sz,
6464
const char* h4, byte** b4, word32* b4Sz)
6565
{
66-
int ret;
66+
int ret = 0;
67+
const char* hex[4] = {h1,h2,h3,h4};
68+
byte** bs[4] = {b1,b2,b3,b4};
69+
word32* bSz[4] = {b1Sz,b2Sz,b3Sz,b4Sz};
70+
int i = 0;
6771

68-
/* b1 */
69-
if (h1 && b1 && b1Sz) {
70-
*b1Sz = (int)XSTRLEN(h1) / 2;
71-
*b1 = XMALLOC(*b1Sz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
72-
if (*b1 == NULL)
73-
return MEMORY_E;
74-
ret = Base16_Decode((const byte*)h1, (int)XSTRLEN(h1), *b1, b1Sz);
75-
if (ret != 0) {
76-
wolfCLU_freeBins(*b1, NULL, NULL, NULL, NULL);
77-
return ret;
72+
for (;i < 4; i++) {
73+
if (hex[i] && bs[i] && bSz[i]) {
74+
*bSz[i] = (int)XSTRLEN(hex[i]) / 2;
75+
*bs[i] = XMALLOC(*bSz[i], NULL, DYNAMIC_TYPE_TMP_BUFFER);
76+
if (*bs[i] == NULL) {
77+
ret = MEMORY_E;
78+
break;
79+
}
80+
ret = Base16_Decode((const byte*)hex[i], (int)XSTRLEN(hex[i]),
81+
*bs[i], bSz[i]);
82+
if (ret != 0) {
83+
break;
84+
}
7885
}
7986
}
8087

81-
/* b2 */
82-
if (h2 && b2 && b2Sz) {
83-
*b2Sz = (int)XSTRLEN(h2) / 2;
84-
*b2 = XMALLOC(*b2Sz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
85-
if (*b2 == NULL) {
86-
wolfCLU_freeBins(b1 ? *b1 : NULL, NULL, NULL, NULL, NULL);
87-
return MEMORY_E;
88-
}
89-
ret = Base16_Decode((const byte*)h2, (int)XSTRLEN(h2), *b2, b2Sz);
90-
if (ret != 0) {
91-
wolfCLU_freeBins(b1 ? *b1 : NULL, *b2, NULL, NULL, NULL);
92-
return ret;
93-
}
94-
}
95-
96-
/* b3 */
97-
if (h3 && b3 && b3Sz) {
98-
*b3Sz = (int)XSTRLEN(h3) / 2;
99-
*b3 = XMALLOC(*b3Sz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
100-
if (*b3 == NULL) {
101-
wolfCLU_freeBins(b1 ? *b1 : NULL, b2 ? *b2 : NULL, NULL, NULL, NULL);
102-
return MEMORY_E;
103-
}
104-
ret = Base16_Decode((const byte*)h3, (int)XSTRLEN(h3), *b3, b3Sz);
105-
if (ret != 0) {
106-
wolfCLU_freeBins(b1 ? *b1 : NULL, b2 ? *b2 : NULL, *b3, NULL, NULL);
107-
return ret;
108-
}
109-
}
110-
111-
/* b4 */
112-
if (h4 && b4 && b4Sz) {
113-
*b4Sz = (int)XSTRLEN(h4) / 2;
114-
*b4 = XMALLOC(*b4Sz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
115-
if (*b4 == NULL) {
116-
wolfCLU_freeBins(b1 ? *b1 : NULL,b2 ? *b2 : NULL,b3 ? *b3 :
117-
NULL,NULL,NULL);
118-
return MEMORY_E;
119-
}
120-
ret = Base16_Decode((const byte*)h4, (int)XSTRLEN(h4), *b4, b4Sz);
121-
if (ret != 0) {
122-
wolfCLU_freeBins(b1 ? *b1 : NULL, b2 ? *b2 : NULL, b3 ? *b3 : NULL,
123-
*b4, NULL);
124-
return ret;
88+
if (ret != 0) {
89+
/* free all allocations made before error */
90+
for (; i >= 0; i--) {
91+
if (hex[i] && bs[i] && bSz[i]) {
92+
if (*bs[i] != NULL) {
93+
XFREE(*bs[i], NULL, DYNAMIC_TYPE_TMP_BUFFER);
94+
*bs[i] = NULL;
95+
}
96+
*bSz[i] = 0;
97+
}
12598
}
99+
return ret;
126100
}
127101

128102
return WOLFCLU_SUCCESS;

0 commit comments

Comments
 (0)