1414// GridFTP-HDFS block size (1MB).
1515#define CVMFS_CHUNK_SIZE (24*1024*1024)
1616
17- // TODO: resizable output buffer.
1817#define OUTPUT_BUFFER_STARTING_SIZE (4*1024)
19- #define OUTPUT_BUFFER_SIZE (256*1024)
2018
2119// CRC table taken from POSIX description of algorithm.
2220static uint32_t const crctab [256 ] =
@@ -105,6 +103,7 @@ char *concatenate(char *buffer, globus_off_t *offset, globus_size_t *length, con
105103 va_list args ;
106104 va_start (args , format );
107105 int rc = vsnprintf (cur , remaining_length , format , args );
106+ va_end (args );
108107 if (rc < 0 ) {
109108 free (buffer );
110109 return NULL ;
@@ -115,15 +114,16 @@ char *concatenate(char *buffer, globus_off_t *offset, globus_size_t *length, con
115114 cur = realloc (buffer , * length );
116115 if (cur == NULL ) {
117116 free (buffer );
118- va_end (args );
119117 return NULL ;
120118 }
121119 buffer = cur ;
122120 cur = buffer + * offset ;
123- rc = vsnprintf (cur , remaining_length , format , args );
121+ va_list args2 ;
122+ va_start (args2 , format );
123+ rc = vsnprintf (cur , remaining_length , format , args2 );
124+ va_end (args2 );
124125 assert ((rc >= 0 ) && (rc < remaining_length ));
125126 }
126- va_end (args );
127127 * offset += rc ;
128128 return buffer ;
129129}
@@ -374,7 +374,7 @@ globus_result_t hdfs_save_checksum(hdfs_handle_t *hdfs_handle) {
374374 if (buffer == NULL ) {
375375 MemoryError (hdfs_handle , "Failed to allocate checksum string" , rc );
376376 // Returns # of bytes, -1 on err
377- } else if (hdfsWrite (fs , fh , buffer , size ) < 0 ) {
377+ } else if (hdfsWrite (fs , fh , buffer , strlen ( buffer ) ) < 0 ) {
378378 SystemError (hdfs_handle , "Failed to write checksum file" , rc );
379379 }
380380
@@ -511,30 +511,30 @@ globus_result_t hdfs_get_checksum_internal(hdfs_handle_t *hdfs_handle, const cha
511511 do {
512512 do {
513513 errno = 0 ; // Some versions of libhdfs forget to clear errno internally.
514- retval = hdfsRead (fs , fh , read_buffer , OUTPUT_BUFFER_SIZE - 1 );
514+ retval = hdfsRead (fs , fh , read_buffer , OUTPUT_BUFFER_STARTING_SIZE - 1 );
515515 } while ((retval < 0 ) && errno == EINTR );
516516
517517 if (retval > 0 ) {
518+ read_buffer [retval ] = '\0' ;
518519 buffer = concatenate (buffer , & off , & size , "%s" , read_buffer );
519520 }
520521 } while (retval > 0 );
522+ free (read_buffer );
521523
522524 if (retval < 0 ) {
523525 SystemError (hdfs_handle , "Failed to read checksum file" , rc );
524526 free (buffer );
525- free (read_buffer );
526527 return rc ;
527528 }
528529
529- unsigned length = 0 ;
530+ unsigned int length = 0 ;
530531 const char * ptr = buffer ;
531- char * cksm = malloc (length );
532+ char * cksm = malloc (size );
532533 char * val ;
533534 * cksm_value = NULL ;
534535 if (!cksm || !buffer ) {
535536 MemoryError (hdfs_handle , "Failed to allocate checksum parse buffers" , rc );
536537 free (buffer );
537- free (read_buffer );
538538 return rc ;
539539 }
540540 // Raise your hand if you hate string parsing in C.
@@ -570,23 +570,24 @@ globus_result_t hdfs_get_checksum_internal(hdfs_handle_t *hdfs_handle, const cha
570570 }
571571 ptr += 1 ;
572572 if (* ptr == '\0' ) {
573- if (recurse && hdfs_checksum_type_supported (hdfs_handle , requested_cksm )) {
574- // Try clearing the current checksum file and re-opening.
575- hdfsCloseFile (fs , fh );
576- hdfsDelete (fs , filename , 0 );
577- fh = hdfsOpenFile (fs , filename , O_RDONLY , 0 , 0 , 0 );
578- rc = hdfs_get_checksum_internal (hdfs_handle , pathname , requested_cksm , cksm_value , 0 );
579- } else {
580- char * err_str = globus_common_create_string ("Requested checksum type %s not found." , requested_cksm );
581- GenericError (hdfs_handle , err_str , rc );
582- globus_free (err_str );
583- }
573+ char * err_str = globus_common_create_string ("Requested checksum type %s not found." , requested_cksm );
574+ GenericError (hdfs_handle , err_str , rc );
575+ globus_free (err_str );
584576 break ;
585577 }
586578 }
587579
588580 if (* cksm_value == NULL ) {
589- GenericError (hdfs_handle , "Failed to retrieve checksum" , rc );
581+ if (recurse && hdfs_checksum_type_supported (hdfs_handle , requested_cksm )) {
582+ // Try clearing the current checksum file and re-opening.
583+ hdfsCloseFile (fs , fh );
584+ hdfsDelete (fs , filename , 0 );
585+ rc = hdfs_get_checksum_internal (hdfs_handle , pathname , requested_cksm , cksm_value , 0 );
586+ fh = hdfsOpenFile (fs , filename , O_RDONLY , 0 , 0 , 0 );
587+ }
588+ if ((* cksm_value == NULL ) && (rc == GLOBUS_SUCCESS )) {
589+ GenericError (hdfs_handle , "Failed to retrieve checksum" , rc );
590+ }
590591 }
591592
592593 // return -1 on err; we check for fh being null here as it may have been re-opened if we regenerate the checksum file above.
@@ -603,7 +604,6 @@ globus_result_t hdfs_get_checksum_internal(hdfs_handle_t *hdfs_handle, const cha
603604 }
604605 free (cksm );
605606 free (buffer );
606- free (read_buffer );
607607 // Note we purposely leak the filesystem handle (fs), as Hadoop has disconnect issues.
608608 return rc ;
609609}
0 commit comments