@@ -258,20 +258,16 @@ int crypt_get_constant(const char* namein, int *valueout) {
258258int crypt_list_all_constants (char * names_list , unsigned int * names_list_size ) {
259259 int i ;
260260 unsigned int total_len = 0 ;
261- char number [ 32 ], * ptr ;
261+ char * ptr ;
262262 int number_len ;
263263 int count = sizeof (_crypt_constants ) / sizeof (_crypt_constants [0 ]);
264264
265265 /* calculate amount of memory required for the list */
266266 for (i = 0 ; i < count ; i ++ ) {
267- total_len += (unsigned int )strlen (_crypt_constants [i ].name ) + 1 ;
268- /* the above +1 is for the commas */
269- number_len = snprintf (number , sizeof (number ), "%d" , _crypt_constants [i ].value );
270- if ((number_len < 0 ) ||
271- ((unsigned int )number_len >= sizeof (number )))
267+ number_len = snprintf (NULL , 0 , "%s,%d\n" , _crypt_constants [i ].name , _crypt_constants [i ].value );
268+ if (number_len < 0 )
272269 return -1 ;
273- total_len += number_len + 1 ;
274- /* this last +1 is for newlines (and ending NULL) */
270+ total_len += number_len ;
275271 }
276272
277273 if (names_list == NULL ) {
@@ -283,16 +279,11 @@ int crypt_list_all_constants(char *names_list, unsigned int *names_list_size) {
283279 /* build the names list */
284280 ptr = names_list ;
285281 for (i = 0 ; i < count ; i ++ ) {
286- strcpy (ptr , _crypt_constants [i ].name );
287- ptr += strlen (_crypt_constants [i ].name );
288- strcpy (ptr , "," );
289- ptr += 1 ;
290-
291- number_len = snprintf (number , sizeof (number ), "%d" , _crypt_constants [i ].value );
292- strcpy (ptr , number );
282+ number_len = snprintf (ptr , total_len , "%s,%d\n" , _crypt_constants [i ].name , _crypt_constants [i ].value );
283+ if (number_len < 0 ) return -1 ;
284+ if ((unsigned int )number_len > total_len ) return -1 ;
285+ total_len -= number_len ;
293286 ptr += number_len ;
294- strcpy (ptr , "\n" );
295- ptr += 1 ;
296287 }
297288 /* to remove the trailing new-line */
298289 ptr -= 1 ;
0 commit comments