@@ -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