Skip to content

Commit 5a19bb7

Browse files
committed
Fixup bugs from buffer resizing.
1 parent 198b548 commit 5a19bb7

1 file changed

Lines changed: 24 additions & 24 deletions

File tree

src/gridftp_hdfs_cksm.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
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.
2220
static 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

Comments
 (0)