@@ -162,27 +162,38 @@ size_t _z_str_intmap_strlen(const _z_str_intmap_t *s, uint8_t argc, _z_str_intma
162162
163163void _z_str_intmap_onto_str (char * dst , size_t dst_len , const _z_str_intmap_t * s , uint8_t argc ,
164164 _z_str_intmapping_t argv []) {
165- size_t len = dst_len ;
165+ if (dst == NULL || dst_len == 0 ) {
166+ return ;
167+ }
168+
169+ // Remaining length excluding '\0'
170+ size_t len = dst_len - (size_t )1 ;
166171 dst [0 ] = '\0' ;
167172 for (size_t i = 0 ; i < argc ; i ++ ) {
168173 char * v = _z_str_intmap_get (s , argv [i ]._key );
169174 if (v != NULL ) {
170- if (len > (size_t )0 ) {
175+ if (len > (size_t )0 && dst [ 0 ] != '\0' ) {
171176 _z_str_append (dst , INT_STR_MAP_LIST_SEPARATOR ); // List separator
172177 len = len - (size_t )1 ;
173178 }
174179
180+ size_t key_len = strlen (argv [i ]._str );
175181 if (len > (size_t )0 ) {
176- (void )strncat (dst , argv [i ]._str , len ); // Key
177- len = len - strlen (argv [i ]._str );
182+ size_t n = key_len < len ? key_len : len ;
183+ (void )strncat (dst , argv [i ]._str , n ); // Key
184+ len = len - n ;
178185 }
186+
179187 if (len > (size_t )0 ) {
180188 _z_str_append (dst , INT_STR_MAP_KEYVALUE_SEPARATOR ); // KeyValue separator
181189 len = len - (size_t )1 ;
182190 }
191+
192+ size_t value_len = strlen (v );
183193 if (len > (size_t )0 ) {
184- (void )strncat (dst , v , len ); // Value
185- len = len - strlen (v );
194+ size_t n = value_len < len ? value_len : len ;
195+ (void )strncat (dst , v , n ); // Value
196+ len = len - n ;
186197 }
187198 }
188199 }
0 commit comments