From a928a40866027764441bcaaf0792422bb8122160 Mon Sep 17 00:00:00 2001 From: sachintu47 Date: Tue, 12 May 2026 01:57:25 -0400 Subject: [PATCH 1/3] fix: initialization order for error reporting and ensure zero-initialized buffers --- src/libdio.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/libdio.c b/src/libdio.c index c7f17ca..9a389a1 100644 --- a/src/libdio.c +++ b/src/libdio.c @@ -433,6 +433,7 @@ struct DFILE* open_dataset(const char* dataset_name, FILE* logstream) dfile->msgbufflen = DIO_MSG_BUFF_LEN; dfile->logstream = logstream; dfile->opts = calloc(1, sizeof(DBG_Opts)); + init_opts(dfile->opts, dfile); struct DIFILE* difile = calloc(1, sizeof(struct DIFILE)); if (!difile) { @@ -465,7 +466,6 @@ struct DFILE* open_dataset(const char* dataset_name, FILE* logstream) struct s99_common_text_unit dd = { DALRTDDN, 1, sizeof(DD_SYSTEM)-1, DD_SYSTEM }; struct s99_common_text_unit stats = { DALSTATS, 1, 1, { DALSTATS_SHR } }; - init_opts(dfile->opts, dfile); rc = init_dsnam_text_unit(difile->dataset_name, &dsn, dfile->opts); if (rc) { dfile->err = rc; @@ -682,13 +682,16 @@ static enum DIOERR read_dataset_internal(struct DFILE* dfile) if ((difile->read_buffer_size == 0) || (dfile->buffer == NULL)) { difile->read_buffer_size = INIT_READ_BUFFER_SIZE; - dfile->buffer = malloc(difile->read_buffer_size); + dfile->buffer = calloc(1, difile->read_buffer_size); if (!dfile->buffer) { errmsg(dfile->opts, "Unable to acquire storage to read dataset %s.", difile->dataset_name); return DIOERR_READ_BUFFER_ALLOC_FAILED; } + } else { + memset(dfile->buffer, 0, difile->read_buffer_size); } difile->cur_read_offset = 0; + dfile->bufflen = 0; // Initialize to 0 in case file is empty/new int length_prefix = has_length_prefix(dfile->recfm); @@ -874,16 +877,21 @@ static enum DIOERR read_dataset_internal_bpam(struct DFILE* dfile) if ((difile->read_buffer_size == 0) || (dfile->buffer == NULL)) { difile->read_buffer_size = INIT_READ_BUFFER_SIZE; - dfile->buffer = malloc(difile->read_buffer_size); + dfile->buffer = calloc(1, difile->read_buffer_size); if (!dfile->buffer) { errmsg(dfile->opts, "Unable to acquire storage to read dataset %s.", difile->dataset_name); return DIOERR_READ_BUFFER_ALLOC_FAILED; } + } else { + memset(dfile->buffer, 0, difile->read_buffer_size); } + dfile->bufflen = 0; + dfile->txtflag = 1; // Default to text + dfile->ccsid = 1047; // Default to EBCDIC ssize_t bytes_read; if ((bytes_read = read_member(difile->bpamhandle, difile->dataset_name, difile->member_name, dfile->buffer, INIT_READ_BUFFER_SIZE, dfile->opts, dfile)) < 0 ) { - info(dfile->opts, "Unable to read back dataset %s. rc:%d", difile->dataset_full_name, rc); + info(dfile->opts, "Unable to read back dataset %s. rc:%zd", difile->dataset_full_name, bytes_read); } #if 0 if (bytes_read != first_file_len || !memcmp(buffer, ascii_data, first_file_len)) { From 5a5abdce96ffdcab61cae6f0224af7d025d87fb8 Mon Sep 17 00:00:00 2001 From: sachintu47 Date: Tue, 12 May 2026 02:16:41 -0400 Subject: [PATCH 2/3] handle BPAM member read errors to prevent buffer length overflow --- src/libdio.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/libdio.c b/src/libdio.c index 9a389a1..b8f814d 100644 --- a/src/libdio.c +++ b/src/libdio.c @@ -432,14 +432,6 @@ struct DFILE* open_dataset(const char* dataset_name, FILE* logstream) } dfile->msgbufflen = DIO_MSG_BUFF_LEN; dfile->logstream = logstream; - dfile->opts = calloc(1, sizeof(DBG_Opts)); - init_opts(dfile->opts, dfile); - - struct DIFILE* difile = calloc(1, sizeof(struct DIFILE)); - if (!difile) { - dfile->err = DIOERR_MALLOC_FAILED; - return dfile; - } // Check if LIBDIO_DEBUG environment variable is set if (!dfile->debug) { @@ -449,6 +441,15 @@ struct DFILE* open_dataset(const char* dataset_name, FILE* logstream) } } + dfile->opts = calloc(1, sizeof(DBG_Opts)); + init_opts(dfile->opts, dfile); + + struct DIFILE* difile = calloc(1, sizeof(struct DIFILE)); + if (!difile) { + dfile->err = DIOERR_MALLOC_FAILED; + return dfile; + } + dfile->internal = difile; char* dataset_name_copy = strdup(dataset_name); @@ -887,20 +888,12 @@ static enum DIOERR read_dataset_internal_bpam(struct DFILE* dfile) } dfile->bufflen = 0; - dfile->txtflag = 1; // Default to text - dfile->ccsid = 1047; // Default to EBCDIC ssize_t bytes_read; if ((bytes_read = read_member(difile->bpamhandle, difile->dataset_name, difile->member_name, dfile->buffer, INIT_READ_BUFFER_SIZE, dfile->opts, dfile)) < 0 ) { info(dfile->opts, "Unable to read back dataset %s. rc:%zd", difile->dataset_full_name, bytes_read); + return DIOERR_READ_FAILED; } -#if 0 - if (bytes_read != first_file_len || !memcmp(buffer, ascii_data, first_file_len)) { - fprintf(stderr, "Expected to read %d bytes with value:\n%s but got %d bytes of value:\n%s", - first_file_len, ascii_data, bytes_read, buffer); - } -#endif - dfile->bufflen = bytes_read; dfile->is_binary = 0; return DIOERR_NOERROR; From b51330f9463e63a164053f1a734f3c7b143ff89c Mon Sep 17 00:00:00 2001 From: sachintu47 Date: Tue, 12 May 2026 06:54:21 -0400 Subject: [PATCH 3/3] Add llq as part of unix file mapping --- src/libdio.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libdio.c b/src/libdio.c index b8f814d..ca712e4 100644 --- a/src/libdio.c +++ b/src/libdio.c @@ -1112,15 +1112,15 @@ const char* map_to_unixfile(struct DFILE* dfile, char* unixfile) { if (has_member(dfile)) { if (has_mlqs(difile)) { - sprintf(unixfile, "%s.%s.%s.%s", difile->hlq, difile->mlqs, difile->member_name, difile->unix_extension); + sprintf(unixfile, "%s.%s.%s.%s.%s", difile->hlq, difile->mlqs, difile->llq, difile->member_name, difile->unix_extension); } else { - sprintf(unixfile, "%s.%s.%s", difile->hlq, difile->member_name, difile->unix_extension); + sprintf(unixfile, "%s.%s.%s.%s", difile->hlq, difile->llq, difile->member_name, difile->unix_extension); } } else { if (has_mlqs(difile)) { - sprintf(unixfile, "%s.%s.%s", difile->hlq, difile->mlqs, difile->unix_extension); + sprintf(unixfile, "%s.%s.%s.%s", difile->hlq, difile->mlqs, difile->llq, difile->unix_extension); } else { - sprintf(unixfile, "%s.%s", difile->hlq, difile->unix_extension); + sprintf(unixfile, "%s.%s.%s", difile->hlq, difile->llq, difile->unix_extension); } }