Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix several warnings #720

Merged
merged 1 commit into from
Sep 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion hl/src/H5LT.c
Original file line number Diff line number Diff line change
Expand Up @@ -2206,7 +2206,7 @@ realloc_and_append(hbool_t _no_user_buf, size_t *len, char *buf, const char *str
*/
if (size_str < *len - 1) {
if (size_str + size_str_to_add < *len - 1) {
HDstrncat(buf, str_to_add, size_str_to_add);
HDstrcat(buf, str_to_add);
}
else {
HDstrncat(buf, str_to_add, (*len - 1) - size_str);
Expand Down
19 changes: 3 additions & 16 deletions java/src/jni/h5util.c
Original file line number Diff line number Diff line change
Expand Up @@ -870,11 +870,8 @@ h5str_sprintf(JNIEnv *env, h5str_t *out_str, hid_t container, hid_t tid, void *i
}
else {
if (typeSize > 0) {
if (NULL == (this_str = (char *)HDmalloc(typeSize + 1)))
if (NULL == (this_str = HDstrdup(tmp_str)))
H5_OUT_OF_MEMORY_ERROR(ENVONLY, "h5str_sprintf: failed to allocate string buffer");

HDstrncpy(this_str, tmp_str, typeSize);
this_str[typeSize] = '\0';
}
}

Expand Down Expand Up @@ -3664,19 +3661,14 @@ obj_info_all(hid_t loc_id, const char *name, const H5L_info2_t *info, void *op_d
info_all_t *datainfo = (info_all_t *)op_data;
H5O_info2_t object_info;
htri_t object_exists;
size_t str_len;

datainfo->otype[datainfo->count] = -1;
datainfo->ltype[datainfo->count] = -1;
datainfo->obj_token[datainfo->count] = H5O_TOKEN_UNDEF;

str_len = HDstrlen(name);
if (NULL == (datainfo->objname[datainfo->count] = (char *)HDmalloc(str_len + 1)))
if (NULL == (datainfo->objname[datainfo->count] = HDstrdup(name)))
goto done;

HDstrncpy(datainfo->objname[datainfo->count], name, str_len);
(datainfo->objname[datainfo->count])[str_len] = '\0';

if ((object_exists = H5Oexists_by_name(loc_id, name, H5P_DEFAULT)) < 0)
goto done;

Expand All @@ -3702,21 +3694,16 @@ obj_info_max(hid_t loc_id, const char *name, const H5L_info2_t *info, void *op_d
{
info_all_t *datainfo = (info_all_t *)op_data;
H5O_info2_t object_info;
size_t str_len;

datainfo->otype[datainfo->count] = -1;
datainfo->ltype[datainfo->count] = -1;
datainfo->objname[datainfo->count] = NULL;
datainfo->obj_token[datainfo->count] = H5O_TOKEN_UNDEF;

/* This will be freed by h5str_array_free(oName, n) */
str_len = HDstrlen(name);
if (NULL == (datainfo->objname[datainfo->count] = (char *)HDmalloc(str_len + 1)))
if (NULL == (datainfo->objname[datainfo->count] = HDstrdup(name)))
goto done;

HDstrncpy(datainfo->objname[datainfo->count], name, str_len);
(datainfo->objname[datainfo->count])[str_len] = '\0';

if (H5Oget_info3(loc_id, &object_info, H5O_INFO_ALL) < 0)
goto done;

Expand Down
30 changes: 21 additions & 9 deletions src/H5Dio.c
Original file line number Diff line number Diff line change
Expand Up @@ -856,28 +856,40 @@ H5D__ioinfo_adjust(H5D_io_info_t *io_info, const H5D_t *dset, const H5S_t *file_
for (cause = 1, idx = 0;
(cause < H5D_MPIO_NO_COLLECTIVE_MAX_CAUSE) && (idx < cause_strings_len);
cause <<= 1, idx++) {
size_t cause_strlen = HDstrlen(cause_strings[idx]);

if (cause & local_no_collective_cause) {
size_t local_buffer_space = sizeof(local_no_collective_cause_string) -
HDstrlen(local_no_collective_cause_string) - 1;

/* Check if there were any previous error messages included. If so, prepend a
* semicolon to separate the messages.
*/
if (local_error_message_previously_written)
HDstrncat(local_no_collective_cause_string, "; ", 2);
if (local_buffer_space && local_error_message_previously_written) {
HDstrncat(local_no_collective_cause_string, "; ", local_buffer_space);
local_buffer_space -= MIN(local_buffer_space, 2);
}

HDstrncat(local_no_collective_cause_string, cause_strings[idx], cause_strlen);
if (local_buffer_space)
HDstrncat(local_no_collective_cause_string, cause_strings[idx],
local_buffer_space);

local_error_message_previously_written = TRUE;
} /* end if */

if (cause & global_no_collective_cause) {
size_t global_buffer_space = sizeof(global_no_collective_cause_string) -
HDstrlen(global_no_collective_cause_string) - 1;

/* Check if there were any previous error messages included. If so, prepend a
* semicolon to separate the messages.
*/
if (global_error_message_previously_written)
HDstrncat(global_no_collective_cause_string, "; ", 2);

HDstrncat(global_no_collective_cause_string, cause_strings[idx], cause_strlen);
if (global_buffer_space && global_error_message_previously_written) {
HDstrncat(global_no_collective_cause_string, "; ", global_buffer_space);
global_buffer_space -= MIN(global_buffer_space, 2);
}

if (global_buffer_space)
HDstrncat(global_no_collective_cause_string, cause_strings[idx],
global_buffer_space);

global_error_message_previously_written = TRUE;
} /* end if */
Expand Down
2 changes: 1 addition & 1 deletion src/H5E.c
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ H5E__get_class_name(const H5E_cls_t *cls, char *name, size_t size)

/* Set the user's buffer, if provided */
if (name) {
HDstrncpy(name, cls->cls_name, MIN((size_t)(len + 1), size));
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While using MIN here can make strncpy do less work in the case that len + 1 is smaller than size, GCC isn't intelligent enough to figure out what we're doing here, so stick to something sensible.

HDstrncpy(name, cls->cls_name, size);
if ((size_t)len >= size)
name[size - 1] = '\0';
} /* end if */
Expand Down
2 changes: 1 addition & 1 deletion src/H5Eint.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ H5E__get_msg(const H5E_msg_t *msg, H5E_type_t *type, char *msg_str, size_t size)

/* Copy the message into the user's buffer, if given */
if (msg_str) {
HDstrncpy(msg_str, msg->msg, MIN((size_t)(len + 1), size));
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above

HDstrncpy(msg_str, msg->msg, size);
if ((size_t)len >= size)
msg_str[size - 1] = '\0';
} /* end if */
Expand Down
4 changes: 2 additions & 2 deletions src/H5FDmulti.c
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,7 @@ H5FD_multi_sb_encode(H5FD_t *_file, char *name /*out*/, unsigned char *buf /*out
H5Eclear2(H5E_DEFAULT);

/* Name and version number */
strncpy(name, "NCSAmulti", (size_t)8);
strncpy(name, "NCSAmult", (size_t)9);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Previously was trying to copy 8 bytes out of a 10 byte (including NUL terminator) string?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope - there's only room for 8 bytes in the "Driver ID" field for the file format: https://portal.hdfgroup.org/display/HDF5/File+Format+Specification

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand that. However,

  1. "NCSAmulti" is 10 bytes long. Let's not confuse the issue by copying from a string that's larger than what we're actually using. Just format the string according to what we're actually going to use, e.g. "NCSAmult".
  2. The header comment specifically says a 9-byte buffer is used: 8 bytes for the file format piece + a NUL terminator. Therefore, I want to copy at most 9 bytes from the source. I realize that we immediately manually NUL terminate the string, but I prefer to use strncpy how it's intended.

name[8] = '\0';

assert(7 == H5FD_MEM_NTYPES);
Expand Down Expand Up @@ -682,7 +682,7 @@ H5FD_multi_sb_encode(H5FD_t *_file, char *name /*out*/, unsigned char *buf /*out
p = buf + 8 + nseen * 2 * 8;
UNIQUE_MEMBERS (file->fa.memb_map, mt) {
size_t n = strlen(file->fa.memb_name[mt]) + 1;
strncpy((char *)p, file->fa.memb_name[mt], n);
strcpy((char *)p, file->fa.memb_name[mt]);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using strcpy here is no less safe than strncpy. We don't know the total size of the output buffer (the API doesn't give us that info), and using strncpy with a size based on the source length will throw a warning anyway.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless which one, shouldn't it be HD...?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, sure, that's a good point. Let me fix all the usages that were never converted over.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out that the multi driver uses only public HDF5 headers, so it doesn't use the HD-prefixed versions of standard library/system calls.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The stdio VFD is the same way. They were intended as "demo" VFDs to show people how to write them using the public API (multi = multi-file VFD example, stdio = single-file VFD example).

p += n;
for (i = n; i % 8; i++)
*p++ = '\0';
Expand Down
22 changes: 12 additions & 10 deletions src/H5FDsplitter.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,10 +340,12 @@ H5Pset_fapl_splitter(hid_t fapl_id, H5FD_splitter_vfd_config_t *vfd_config)
HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, FAIL, "unable to allocate file access property list struct")

info->ignore_wo_errs = vfd_config->ignore_wo_errs;
HDstrncpy(info->wo_path, vfd_config->wo_path, H5FD_SPLITTER_PATH_MAX);
HDstrncpy(info->log_file_path, vfd_config->log_file_path, H5FD_SPLITTER_PATH_MAX);
info->rw_fapl_id = H5P_FILE_ACCESS_DEFAULT; /* pre-set value */
info->wo_fapl_id = H5P_FILE_ACCESS_DEFAULT; /* pre-set value */
HDstrncpy(info->wo_path, vfd_config->wo_path, H5FD_SPLITTER_PATH_MAX + 1);
info->wo_path[H5FD_SPLITTER_PATH_MAX] = '\0';
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make sure to copy the whole path and ensure it's NUL-terminated, otherwise GCC complains about truncated output.

HDstrncpy(info->log_file_path, vfd_config->log_file_path, H5FD_SPLITTER_PATH_MAX + 1);
info->log_file_path[H5FD_SPLITTER_PATH_MAX] = '\0';
info->rw_fapl_id = H5P_FILE_ACCESS_DEFAULT; /* pre-set value */
info->wo_fapl_id = H5P_FILE_ACCESS_DEFAULT; /* pre-set value */

/* Set non-default channel FAPL IDs in splitter configuration info */
if (H5P_DEFAULT != vfd_config->rw_fapl_id) {
Expand Down Expand Up @@ -412,8 +414,8 @@ H5Pget_fapl_splitter(hid_t fapl_id, H5FD_splitter_vfd_config_t *config /*out*/)
if (NULL == (fapl_ptr = (const H5FD_splitter_fapl_t *)H5P_peek_driver_info(plist_ptr)))
HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unable to get specific-driver info")

HDstrncpy(config->wo_path, fapl_ptr->wo_path, H5FD_SPLITTER_PATH_MAX);
HDstrncpy(config->log_file_path, fapl_ptr->log_file_path, H5FD_SPLITTER_PATH_MAX);
HDstrncpy(config->wo_path, fapl_ptr->wo_path, H5FD_SPLITTER_PATH_MAX + 1);
HDstrncpy(config->log_file_path, fapl_ptr->log_file_path, H5FD_SPLITTER_PATH_MAX + 1);
config->ignore_wo_errs = fapl_ptr->ignore_wo_errs;

/* Copy R/W and W/O FAPLs */
Expand Down Expand Up @@ -587,8 +589,8 @@ H5FD__splitter_fapl_copy(const void *_old_fa)
HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, NULL, "unable to allocate log file FAPL")

H5MM_memcpy(new_fa_ptr, old_fa_ptr, sizeof(H5FD_splitter_fapl_t));
HDstrncpy(new_fa_ptr->wo_path, old_fa_ptr->wo_path, H5FD_SPLITTER_PATH_MAX);
HDstrncpy(new_fa_ptr->log_file_path, old_fa_ptr->log_file_path, H5FD_SPLITTER_PATH_MAX);
HDstrncpy(new_fa_ptr->wo_path, old_fa_ptr->wo_path, H5FD_SPLITTER_PATH_MAX + 1);
HDstrncpy(new_fa_ptr->log_file_path, old_fa_ptr->log_file_path, H5FD_SPLITTER_PATH_MAX + 1);

/* Copy R/W and W/O FAPLs */
if (H5FD__copy_plist(old_fa_ptr->rw_fapl_id, &(new_fa_ptr->rw_fapl_id)) < 0)
Expand Down Expand Up @@ -688,8 +690,8 @@ H5FD__splitter_open(const char *name, unsigned flags, hid_t splitter_fapl_id, ha
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get VFL driver info")

/* Copy simpler info */
HDstrncpy(file_ptr->fa.wo_path, fapl_ptr->wo_path, H5FD_SPLITTER_PATH_MAX);
HDstrncpy(file_ptr->fa.log_file_path, fapl_ptr->log_file_path, H5FD_SPLITTER_PATH_MAX);
HDstrncpy(file_ptr->fa.wo_path, fapl_ptr->wo_path, H5FD_SPLITTER_PATH_MAX + 1);
HDstrncpy(file_ptr->fa.log_file_path, fapl_ptr->log_file_path, H5FD_SPLITTER_PATH_MAX + 1);
file_ptr->fa.ignore_wo_errs = fapl_ptr->ignore_wo_errs;

/* Copy R/W and W/O channel FAPLs. */
Expand Down
2 changes: 1 addition & 1 deletion src/H5Fsuper.c
Original file line number Diff line number Diff line change
Expand Up @@ -1043,7 +1043,7 @@ H5F__super_read(H5F_t *f, H5P_genplist_t *fa_plist, hbool_t initial_read)
HDONE_ERROR(H5E_FILE, H5E_CANTUNPIN, FAIL, "unable to unpin driver info")

/* Evict the driver info block from the cache */
if (H5AC_expunge_entry(f, H5AC_DRVRINFO, sblock->driver_addr, H5AC__NO_FLAGS_SET) < 0)
if (sblock && H5AC_expunge_entry(f, H5AC_DRVRINFO, sblock->driver_addr, H5AC__NO_FLAGS_SET) < 0)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GCC complains about a potential dereference of a NULL sblock here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is trickier than that - the sblock should be set to NULL after the H5AC_unprotect, about 15 lines earlier. But, if that's the case, how's the expunge supposed to work? There's a bigger algorithmic problem here.

Copy link
Collaborator Author

@jhendersonHDF jhendersonHDF Jun 4, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, but the algorithm is beyond me and adding an sblock check here theoretically won't do more harm than good. If sblock actually were NULL here, we'd immediately crash rather than H5AC_expunge_entry doing something "bad". Now, we just skip the expunge anyway.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as I can tell, the H5AC_unprotect call flushes the entry, but I don't see anywhere that the entry is freed/set to NULL, especially since H5AC_unprotect only accepts a single level of pointer indirection. Since the code following the expunge also checks to make sure sblock is valid before using it, this seems like a reasonable change, but maybe @jrmainzer would have a better idea?

HDONE_ERROR(H5E_FILE, H5E_CANTEXPUNGE, FAIL, "unable to expunge driver info block")
} /* end if */

Expand Down
2 changes: 1 addition & 1 deletion src/H5PL.c
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ H5PLget(unsigned int idx, char *path_buf, size_t buf_size)

/* If the path buffer is not NULL, copy the path to the buffer */
if (path_buf) {
HDstrncpy(path_buf, path, MIN((size_t)(path_len + 1), buf_size));
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment about GCC being confused about the usage of MIN here.

HDstrncpy(path_buf, path, buf_size);
if ((size_t)path_len >= buf_size)
path_buf[buf_size - 1] = '\0';
} /* end if */
Expand Down
4 changes: 2 additions & 2 deletions src/H5Pdapl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1453,7 +1453,7 @@ H5Pget_efile_prefix(hid_t plist_id, char *prefix /*out*/, size_t size)
/* Copy to user's buffer, if given */
len = HDstrlen(my_prefix);
if (prefix) {
HDstrncpy(prefix, my_prefix, MIN(len + 1, size));
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above

HDstrncpy(prefix, my_prefix, size);
if (len >= size)
prefix[size - 1] = '\0';
} /* end if */
Expand Down Expand Up @@ -1543,7 +1543,7 @@ H5Pget_virtual_prefix(hid_t plist_id, char *prefix /*out*/, size_t size)
/* Copy to user's buffer, if given */
len = HDstrlen(my_prefix);
if (prefix) {
HDstrncpy(prefix, my_prefix, MIN(len + 1, size));
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above

HDstrncpy(prefix, my_prefix, size);
if (len >= size)
prefix[size - 1] = '\0';
} /* end if */
Expand Down
2 changes: 1 addition & 1 deletion src/H5Pdxpl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1052,7 +1052,7 @@ H5Pget_data_transform(hid_t plist_id, char *expression /*out*/, size_t size)
/* Copy into application buffer */
len = HDstrlen(pexp);
if (expression) {
HDstrncpy(expression, pexp, MIN(len + 1, size));
HDstrncpy(expression, pexp, size);
if (len >= size)
expression[size - 1] = '\0';
} /* end if */
Expand Down
2 changes: 1 addition & 1 deletion src/H5Pencdec.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ H5P__encode_cb(H5P_genprop_t *prop, void *_udata)
/* Encode (or not, if the 'encode' flag is off) the property's name */
prop_name_len = HDstrlen(prop->name) + 1;
if (udata->encode) {
HDstrncpy((char *)*(udata->pp), prop->name, prop_name_len);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, we don't know the size of the output buffer, so using strcpy here is no less safe than strncpy and strncpy gives a warning since we're just giving it the length of the source being copied.

HDstrcpy((char *)*(udata->pp), prop->name);
*(uint8_t **)(udata->pp) += prop_name_len;
} /* end if */
*(udata->enc_size_ptr) += prop_name_len;
Expand Down
2 changes: 1 addition & 1 deletion src/H5Plapl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1044,7 +1044,7 @@ H5Pget_elink_prefix(hid_t plist_id, char *prefix /*out*/, size_t size)
/* Copy to user's buffer, if given */
len = HDstrlen(my_prefix);
if (prefix) {
HDstrncpy(prefix, my_prefix, MIN(len + 1, size));
HDstrncpy(prefix, my_prefix, size);
if (len >= size)
prefix[size - 1] = '\0';
} /* end if */
Expand Down
2 changes: 1 addition & 1 deletion src/H5VLint.c
Original file line number Diff line number Diff line change
Expand Up @@ -1757,7 +1757,7 @@ H5VL__get_connector_name(hid_t id, char *name /*out*/, size_t size)

len = HDstrlen(cls->name);
if (name) {
HDstrncpy(name, cls->name, MIN(len + 1, size));
HDstrncpy(name, cls->name, size);
if (len >= size)
name[size - 1] = '\0';
} /* end if */
Expand Down
4 changes: 2 additions & 2 deletions src/H5system.c
Original file line number Diff line number Diff line change
Expand Up @@ -732,8 +732,8 @@ H5_build_extpath(const char *name, char **extpath /*out*/)

HDstrncpy(full_path, cwdpath, cwdlen + 1);
if (!H5_CHECK_DELIMITER(cwdpath[cwdlen - 1]))
HDstrncat(full_path, H5_DIR_SEPS, HDstrlen(H5_DIR_SEPS));
HDstrncat(full_path, new_name, HDstrlen(new_name));
HDstrncat(full_path, H5_DIR_SEPS, path_len - (cwdlen + 1));
HDstrncat(full_path, new_name, path_len - (cwdlen + 1) - HDstrlen(H5_DIR_SEPS));
} /* end if */
} /* end else */

Expand Down
2 changes: 1 addition & 1 deletion test/ohdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,7 @@ test_unknown(unsigned bogus_id, char *filename, hid_t fapl)
done in the source directory. */
HDstrncpy(testfile, FILE_BOGUS, TESTFILE_LEN);
testfile[TESTFILE_LEN - 1] = '\0';
HDstrncat(testfile, ".copy", 5);
HDstrncat(testfile, ".copy", sizeof(testfile) - HDstrlen(testfile) - 1);

/* Make a copy of the data file from svn. */
if (h5_make_local_copy(FILE_BOGUS, testfile) < 0)
Expand Down
3 changes: 2 additions & 1 deletion tools/lib/h5tools_str.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,8 @@ h5tools_str_fmt(h5tools_str_t *str /*in,out*/, size_t start, const char *fmt)
HDassert(temp);
}

HDstrncpy(temp, str->s + start, n);
HDstrncpy(temp, str->s + start, n - 1);
temp[n - 1] = '\0';
}

/* Reset the output string and append a formatted version */
Expand Down
20 changes: 14 additions & 6 deletions tools/src/h5dump/h5dump_ddl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1343,13 +1343,21 @@ attr_search(hid_t oid, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED *a
ret = FAIL;
}
else {
size_t buffer_space = w - 1;

HDmemset(obj_name, '\0', w);
if (op_name[0] != '/') {
HDstrncat(obj_name, buf, u + 1);
if (buf[u - 1] != '/')
HDstrncat(obj_name, "/", (size_t)2);
HDstrncat(obj_name, buf, buffer_space);
buffer_space -= MIN(buffer_space, u);

if (buf[u - 1] != '/') {
HDstrncat(obj_name, "/", buffer_space);
buffer_space -= MIN(buffer_space, 2);
}
}
HDstrncat(obj_name, op_name, v + 1);

HDstrncat(obj_name, op_name, buffer_space);
buffer_space -= MIN(buffer_space, v);

handle_attributes(oid, obj_name, NULL, 0, NULL);
HDfree(obj_name);
Expand Down Expand Up @@ -1421,10 +1429,10 @@ lnk_search(const char *path, const H5L_info2_t *li, void *_op_data)
else {
if (k == 2) {
HDstrcpy(search_name, "/");
HDstrncat(search_name, op_name, search_len + 1);
HDstrcat(search_name, op_name);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Already know the buffer size, use strcat to not generate a warning.

}
else
HDstrncpy(search_name, op_name, search_len + 1);
HDstrcpy(search_name, op_name);
search_name[search_len + k - 1] = '\0';

if (HDstrcmp(path, search_name) == 0) {
Expand Down
7 changes: 5 additions & 2 deletions tools/src/h5import/h5import.c
Original file line number Diff line number Diff line change
Expand Up @@ -3771,6 +3771,7 @@ getCompressionParameter(struct Input *in, FILE *strm)
static int
getExternalFilename(struct Input *in, FILE *strm)
{
size_t temp_len;
char temp[255];
const char *err1 = "Unable to get 'string' value.\n";

Expand All @@ -3779,8 +3780,10 @@ getExternalFilename(struct Input *in, FILE *strm)
return (-1);
}

in->externFilename = (char *)HDmalloc((size_t)(HDstrlen(temp) + 1) * sizeof(char));
(void)HDstrncpy(in->externFilename, temp, HDstrlen(temp) + 1);
temp_len = HDstrlen(temp);
in->externFilename = (char *)HDmalloc((temp_len + 1) * sizeof(char));
(void)HDstrcpy(in->externFilename, temp);
in->externFilename[temp_len] = '\0';
return (0);
}

Expand Down