@@ -252,20 +252,16 @@ int crypt_get_constant(const char* namein, int *valueout) {
252252int crypt_list_all_constants (char * names_list , unsigned int * names_list_size ) {
253253 int i ;
254254 unsigned int total_len = 0 ;
255- char number [ 32 ], * ptr ;
255+ char * ptr ;
256256 int number_len ;
257257 int count = sizeof (_crypt_constants ) / sizeof (_crypt_constants [0 ]);
258258
259259 /* calculate amount of memory required for the list */
260260 for (i = 0 ; i < count ; i ++ ) {
261- total_len += (unsigned int )strlen (_crypt_constants [i ].name ) + 1 ;
262- /* the above +1 is for the commas */
263- number_len = snprintf (number , sizeof (number ), "%d" , _crypt_constants [i ].value );
264- if ((number_len < 0 ) ||
265- ((unsigned int )number_len >= sizeof (number )))
261+ number_len = snprintf (NULL , 0 , "%s,%d\n" , _crypt_constants [i ].name , _crypt_constants [i ].value );
262+ if (number_len < 0 )
266263 return -1 ;
267- total_len += number_len + 1 ;
268- /* this last +1 is for newlines (and ending NULL) */
264+ total_len += number_len ;
269265 }
270266
271267 if (names_list == NULL ) {
@@ -277,16 +273,11 @@ int crypt_list_all_constants(char *names_list, unsigned int *names_list_size) {
277273 /* build the names list */
278274 ptr = names_list ;
279275 for (i = 0 ; i < count ; i ++ ) {
280- strcpy (ptr , _crypt_constants [i ].name );
281- ptr += strlen (_crypt_constants [i ].name );
282- strcpy (ptr , "," );
283- ptr += 1 ;
284-
285- number_len = snprintf (number , sizeof (number ), "%d" , _crypt_constants [i ].value );
286- strcpy (ptr , number );
276+ number_len = snprintf (ptr , total_len , "%s,%d\n" , _crypt_constants [i ].name , _crypt_constants [i ].value );
277+ if (number_len < 0 ) return -1 ;
278+ if ((unsigned int )number_len > total_len ) return -1 ;
279+ total_len -= number_len ;
287280 ptr += number_len ;
288- strcpy (ptr , "\n" );
289- ptr += 1 ;
290281 }
291282 /* to remove the trailing new-line */
292283 ptr -= 1 ;
0 commit comments