@@ -390,30 +390,44 @@ struct flb_storage_metrics *flb_storage_metrics_create(struct flb_config *ctx)
390390 return sm ;
391391}
392392
393+ static int parse_stamp (const char * p , time_t * sec , long * nsec )
394+ {
395+ uint64_t s = 0 , ns = 0 ;
396+
397+ if (!p || !sec || !nsec ) {
398+ return -1 ;
399+ }
400+ /* expected: "1234567890.123456789.flb" format */
401+ if (sscanf (p , "%" SCNu64 ".%" SCNu64 ".flb" , & s , & ns ) != 2 ) {
402+ return -1 ;
403+ }
404+ if (ns >= 1000000000ULL ) {
405+ return -1 ;
406+ }
407+
408+ * sec = (time_t )s ;
409+ * nsec = (long )ns ;
410+ return 0 ;
411+ }
412+
393413static int sort_chunk_cmp (const void * a_arg , const void * b_arg )
394414{
395- char * p ;
396415 struct cio_chunk * chunk_a = * (struct cio_chunk * * ) a_arg ;
397416 struct cio_chunk * chunk_b = * (struct cio_chunk * * ) b_arg ;
398- struct timespec tm_a ;
399- struct timespec tm_b ;
417+ const char * p ;
418+ struct timespec tm_a = { 0 }, tm_b = { 0 } ;
400419
401420 /* Scan Chunk A */
402421 p = strchr (chunk_a -> name , '-' );
403- if (!p ) {
422+ if (!p || parse_stamp ( p + 1 , & tm_a . tv_sec , & tm_a . tv_nsec ) != 0 ) {
404423 return -1 ;
405424 }
406- p ++ ;
407-
408- sscanf (p , "%lu.%lu.flb" , & tm_a .tv_sec , & tm_a .tv_nsec );
409425
410426 /* Scan Chunk B */
411427 p = strchr (chunk_b -> name , '-' );
412- if (!p ) {
428+ if (!p || parse_stamp ( p + 1 , & tm_b . tv_sec , & tm_b . tv_nsec ) != 0 ) {
413429 return -1 ;
414430 }
415- p ++ ;
416- sscanf (p , "%lu.%lu.flb" , & tm_b .tv_sec , & tm_b .tv_nsec );
417431
418432 /* Compare */
419433 if (tm_a .tv_sec != tm_b .tv_sec ) {
0 commit comments