2
0
mirror of https://github.com/HDFGroup/hdf5.git synced 2025-03-19 16:50:46 +08:00

[svn-r25215] Description:

Bring changes from Coverity branch back to trunk:

r20914:
    Use HDstrncpy and HDstrncat! --gh

20915:
    Use HDstrncpy and HDstrncat! --gh

Tested on:
    Mac OSX/64 10.9.3 (amazon) w/gcc 4.9.0, C++, FORTRAN & parallel
    (too minor to require h5committest)
This commit is contained in:
Quincey Koziol 2014-05-25 00:55:39 -05:00
parent a8b48bc7f5
commit 60f8a4100e
8 changed files with 181 additions and 135 deletions

@ -457,6 +457,9 @@
/* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine H5_HAVE_UNISTD_H @H5_HAVE_UNISTD_H@
/* Define to 1 if you have the `asprintf' function. */
#cmakedefine H5_HAVE_ASPRINTF @H5_HAVE_ASPRINTF@
/* Define to 1 if you have the `vasprintf' function. */
#cmakedefine H5_HAVE_VASPRINTF @H5_HAVE_VASPRINTF@

2
configure vendored

@ -27284,7 +27284,7 @@ _ACEOF
fi
done
for ac_func in tmpfile vasprintf waitpid
for ac_func in tmpfile asprintf vasprintf waitpid
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"

@ -2197,7 +2197,7 @@ AC_CHECK_FUNCS([gethostname getpwuid getrusage lstat])
AC_CHECK_FUNCS([rand_r random setsysinfo])
AC_CHECK_FUNCS([signal longjmp setjmp siglongjmp sigsetjmp sigprocmask])
AC_CHECK_FUNCS([snprintf srandom strdup symlink system])
AC_CHECK_FUNCS([tmpfile vasprintf waitpid])
AC_CHECK_FUNCS([tmpfile asprintf vasprintf waitpid])
## Check for vsnprintf() separately, so we can detect situations where it
## doesn't return the correct size for formatted strings that are too large

@ -79,6 +79,7 @@
#endif /* H5_HAVE_ALARM */
#define HDasctime(T) asctime(T)
#define HDasin(X) asin(X)
#define HDasprintf asprintf /*varargs*/
#define HDassert(X) assert(X)
#define HDatan(X) atan(X)
#define HDatan2(X,Y) atan2(X,Y)

@ -402,6 +402,9 @@
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the `asprintf' function. */
#undef HAVE_ASPRINTF
/* Define to 1 if you have the `vasprintf' function. */
#undef HAVE_VASPRINTF

@ -542,6 +542,9 @@ typedef struct {
#ifndef HDasin
#define HDasin(X) asin(X)
#endif /* HDasin */
#ifndef HDasprintf
#define HDasprintf asprintf /*varargs*/
#endif /* HDasprintf */
#ifndef HDassert
#define HDassert(X) assert(X)
#endif /* HDassert */

@ -470,75 +470,81 @@ static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo,
switch(linfo->type)
{
case H5L_TYPE_SOFT:
ret = H5tools_get_symlink_info(tinfo->fid, path, &lnk_info, opts->follow_links);
/* error */
if (ret < 0)
goto done;
/* no dangling link option given and detect dangling link */
else if (ret == 0)
{
tinfo->symlink_visited.dangle_link = TRUE;
trav_info_visit_lnk(path, linfo, tinfo);
if (opts->no_dangle_links)
opts->err_stat = 1; /* make dgangling link is error */
goto done;
}
case H5L_TYPE_SOFT:
ret = H5tools_get_symlink_info(tinfo->fid, path, &lnk_info, opts->follow_links);
/* error */
if (ret < 0)
goto done;
/* no dangling link option given and detect dangling link */
else if (ret == 0)
{
tinfo->symlink_visited.dangle_link = TRUE;
trav_info_visit_lnk(path, linfo, tinfo);
if (opts->no_dangle_links)
opts->err_stat = 1; /* make dgangling link is error */
goto done;
}
/* check if already visit the target object */
if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path))
goto done;
/* check if already visit the target object */
if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path))
goto done;
/* add this link as visited link */
if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path) < 0)
goto done;
if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
{
parallel_print("Error: Could not get file contents\n");
/* add this link as visited link */
if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, NULL, lnk_info.trg_path) < 0)
goto done;
if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
{
parallel_print("Error: Could not get file contents\n");
opts->err_stat = 1;
goto done;
}
break;
case H5L_TYPE_EXTERNAL:
ret = H5tools_get_symlink_info(tinfo->fid, path, &lnk_info, opts->follow_links);
/* error */
if (ret < 0)
goto done;
/* no dangling link option given and detect dangling link */
else if (ret == 0)
{
tinfo->symlink_visited.dangle_link = TRUE;
trav_info_visit_lnk(path, linfo, tinfo);
if (opts->no_dangle_links)
opts->err_stat = 1; /* make dgangling link is error */
goto done;
}
if(H5Lunpack_elink_val(lnk_info.trg_path, linfo->u.val_size, NULL, &ext_fname, &ext_path) < 0)
goto done;
/* check if already visit the target object */
if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path))
goto done;
/* add this link as visited link */
if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path) < 0)
goto done;
if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
{
parallel_print("Error: Could not get file contents\n");
opts->err_stat = 1;
goto done;
}
break;
case H5L_TYPE_HARD:
case H5L_TYPE_MAX:
case H5L_TYPE_ERROR:
default:
parallel_print("Error: Invalid link type\n");
opts->err_stat = 1;
goto done;
}
break;
case H5L_TYPE_EXTERNAL:
ret = H5tools_get_symlink_info(tinfo->fid, path, &lnk_info, opts->follow_links);
/* error */
if (ret < 0)
goto done;
/* no dangling link option given and detect dangling link */
else if (ret == 0)
{
tinfo->symlink_visited.dangle_link = TRUE;
trav_info_visit_lnk(path, linfo, tinfo);
if (opts->no_dangle_links)
opts->err_stat = 1; /* make dgangling link is error */
goto done;
}
if(H5Lunpack_elink_val(lnk_info.trg_path, linfo->u.val_size, NULL, &ext_fname, &ext_path) < 0)
goto done;
/* check if already visit the target object */
if(symlink_is_visited( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path))
goto done;
/* add this link as visited link */
if(symlink_visit_add( &(tinfo->symlink_visited), linfo->type, ext_fname, ext_path) < 0)
goto done;
if(h5trav_visit(tinfo->fid, path, TRUE, TRUE,
trav_grp_objs,trav_grp_symlinks, tinfo) < 0)
{
parallel_print("Error: Could not get file contents\n");
opts->err_stat = 1;
goto done;
}
break;
default:
;
break;
break;
} /* end of switch */
done:
@ -572,7 +578,6 @@ hsize_t h5diff(const char *fname1,
hid_t file2_id = (-1);
char filenames[2][MAX_FILENAME];
hsize_t nfound = 0;
int i;
int l_ret1 = -1;
int l_ret2 = -1;
char * obj1fullname = NULL;
@ -653,27 +658,37 @@ hsize_t h5diff(const char *fname1,
/* if any object is specified */
if (objname1)
{
/* malloc 2 more for "/" and end-of-line */
obj1fullname = (char*)HDcalloc(HDstrlen(objname1) + 2, sizeof(char));
obj2fullname = (char*)HDcalloc(HDstrlen(objname2) + 2, sizeof(char));
/* make the given object1 fullpath, start with "/" */
if (HDstrncmp(objname1, "/", 1))
{
#ifdef H5_HAVE_ASPRINTF
/* Use the asprintf() routine, since it does what we're trying to do below */
HDasprintf(&obj1fullname, "/%s", objname1);
#else /* H5_HAVE_ASPRINTF */
/* (malloc 2 more for "/" and end-of-line) */
obj1fullname = (char*)HDmalloc(HDstrlen(objname1) + 2);
HDstrcpy(obj1fullname, "/");
HDstrcat(obj1fullname, objname1);
#endif /* H5_HAVE_ASPRINTF */
}
else
HDstrcpy(obj1fullname, objname1);
obj1fullname = HDstrdup(objname1);
/* make the given object2 fullpath, start with "/" */
if (HDstrncmp(objname2, "/", 1))
{
#ifdef H5_HAVE_ASPRINTF
/* Use the asprintf() routine, since it does what we're trying to do below */
HDasprintf(&obj2fullname, "/%s", objname2);
#else /* H5_HAVE_ASPRINTF */
/* (malloc 2 more for "/" and end-of-line) */
obj2fullname = (char*)HDmalloc(HDstrlen(objname2) + 2);
HDstrcpy(obj2fullname, "/");
HDstrcat(obj2fullname, objname2);
#endif /* H5_HAVE_ASPRINTF */
}
else
HDstrcpy(obj2fullname, objname2);
obj2fullname = HDstrdup(objname2);
/*----------------------------------------------------------
* check if obj1 is root, group, single object or symlink
@ -706,7 +721,8 @@ hsize_t h5diff(const char *fname1,
*/
if(src_linfo1.type == H5L_TYPE_HARD)
{
int idx = 0;
size_t idx;
/* optional data pass */
info1_obj->opts = (diff_opt_t*)options;
@ -716,7 +732,7 @@ hsize_t h5diff(const char *fname1,
options->err_stat = 1;
goto out;
}
obj1type = oinfo1.type;
obj1type = (h5trav_type_t)oinfo1.type;
trav_info_add(info1_obj, obj1fullname, obj1type);
idx = info1_obj->nused - 1;
info1_obj->paths[idx].objno = oinfo1.addr;
@ -765,7 +781,8 @@ hsize_t h5diff(const char *fname1,
*/
if(src_linfo2.type == H5L_TYPE_HARD)
{
int idx = 0;
size_t idx;
/* optional data pass */
info2_obj->opts = (diff_opt_t*)options;
@ -775,7 +792,7 @@ hsize_t h5diff(const char *fname1,
options->err_stat = 1;
goto out;
}
obj2type = oinfo2.type;
obj2type = (h5trav_type_t)oinfo2.type;
trav_info_add(info2_obj, obj2fullname, obj2type);
idx = info2_obj->nused - 1;
info2_obj->paths[idx].objno = oinfo2.addr;
@ -798,11 +815,9 @@ hsize_t h5diff(const char *fname1,
{
h5difftrace("h5diff no object specified\n");
/* set root group */
obj1fullname = (char*)HDcalloc((size_t)2, sizeof(char));
HDstrcat(obj1fullname, "/");
obj1fullname = (char*)HDstrdup("/");
obj1type = H5TRAV_TYPE_GROUP;
obj2fullname = (char*)HDcalloc((size_t)2, sizeof(char));
HDstrcat(obj2fullname, "/");
obj2fullname = (char*)HDstrdup("/");
obj2type = H5TRAV_TYPE_GROUP;
}
@ -856,12 +871,13 @@ hsize_t h5diff(const char *fname1,
}
else if(l_ret1 != 2) /* symbolic link */
{
obj1type = trg_linfo1.trg_type;
obj1type = (h5trav_type_t)trg_linfo1.trg_type;
h5difftrace("h5diff ... ... trg_linfo1.trg_type == H5L_TYPE_HARD\n");
if (info1_lp != NULL) {
int idx = info1_lp->nused - 1;
size_t idx = info1_lp->nused - 1;
h5difftrace("h5diff ... ... ... info1_obj not null\n");
info1_lp->paths[idx].type = trg_linfo1.trg_type;
info1_lp->paths[idx].type = (h5trav_type_t)trg_linfo1.trg_type;
info1_lp->paths[idx].objno = trg_linfo1.objno;
info1_lp->paths[idx].fileno = trg_linfo1.fileno;
}
@ -904,11 +920,12 @@ hsize_t h5diff(const char *fname1,
}
else if(l_ret2 != 2) /* symbolic link */
{
obj2type = trg_linfo2.trg_type;
obj2type = (h5trav_type_t)trg_linfo2.trg_type;
if (info2_lp != NULL) {
int idx = info2_lp->nused - 1;
size_t idx = info2_lp->nused - 1;
h5difftrace("h5diff ... ... ... info2_obj not null\n");
info2_lp->paths[idx].type = trg_linfo2.trg_type;
info2_lp->paths[idx].type = (h5trav_type_t)trg_linfo2.trg_type;
info2_lp->paths[idx].objno = trg_linfo2.objno;
info2_lp->paths[idx].fileno = trg_linfo2.fileno;
}
@ -972,6 +989,8 @@ hsize_t h5diff(const char *fname1,
#ifdef H5_HAVE_PARALLEL
if(g_Parallel)
{
int i;
if((HDstrlen(fname1) > MAX_FILENAME) || (HDstrlen(fname2) > MAX_FILENAME))
{
HDfprintf(stderr, "The parallel diff only supports path names up to %d characters\n", MAX_FILENAME);
@ -997,6 +1016,8 @@ hsize_t h5diff(const char *fname1,
*/
if(options->m_verbose)
{
unsigned u;
parallel_print("\n");
/* if given objects is group under root */
if (HDstrcmp (obj1fullname,"/") || HDstrcmp (obj2fullname,"/"))
@ -1004,12 +1025,12 @@ hsize_t h5diff(const char *fname1,
else
parallel_print("file1 file2\n");
parallel_print("---------------------------------------\n");
for(i = 0; i < match_list->nobjs; i++)
for(u = 0; u < match_list->nobjs; u++)
{
char c1, c2;
c1 = (match_list->objs[i].flags[0]) ? 'x' : ' ';
c2 = (match_list->objs[i].flags[1]) ? 'x' : ' ';
parallel_print("%5c %6c %-15s\n", c1, c2, match_list->objs[i].name);
c1 = (match_list->objs[u].flags[0]) ? 'x' : ' ';
c2 = (match_list->objs[u].flags[1]) ? 'x' : ' ';
parallel_print("%5c %6c %-15s\n", c1, c2, match_list->objs[u].name);
} /* end for */
parallel_print ("\n");
} /* end if */
@ -1092,8 +1113,8 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
hsize_t nfound = 0;
unsigned i;
char * grp1_path = "";
char * grp2_path = "";
const char * grp1_path = "";
const char * grp2_path = "";
char * obj1_fullpath = NULL;
char * obj2_fullpath = NULL;
diff_args_t argdata;
@ -1106,10 +1127,10 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
* if not root, prepare object name to be pre-appended to group path to
* make full path
*/
if (HDstrcmp (grp1, "/"))
grp1_path = (char *)grp1;
if (HDstrcmp (grp2, "/"))
grp2_path = (char *)grp2;
if(HDstrcmp(grp1, "/"))
grp1_path = grp1;
if(HDstrcmp(grp2, "/"))
grp2_path = grp2;
/*-------------------------------------------------------------------------
* regarding the return value of h5diff (0, no difference in files, 1 difference )
@ -1163,22 +1184,32 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
if( table->objs[i].flags[0] && table->objs[i].flags[1])
{
/* make full path for obj1 */
obj1_fullpath = (char*)HDcalloc (HDstrlen(grp1_path) + strlen (table->objs[i].name) + 1, sizeof (char));
#ifdef H5_HAVE_ASPRINTF
/* Use the asprintf() routine, since it does what we're trying to do below */
HDasprintf(&obj1_fullpath, "%s%s", grp1_path, table->objs[i].name);
#else /* H5_HAVE_ASPRINTF */
obj1_fullpath = (char*)HDmalloc(HDstrlen(grp1_path) + HDstrlen(table->objs[i].name) + 1);
HDstrcpy(obj1_fullpath, grp1_path);
HDstrcat(obj1_fullpath, table->objs[i].name);
#endif /* H5_HAVE_ASPRINTF */
/* make full path for obj2 */
obj2_fullpath = (char*)HDcalloc (HDstrlen(grp2_path) + strlen (table->objs[i].name) + 1, sizeof (char));
#ifdef H5_HAVE_ASPRINTF
/* Use the asprintf() routine, since it does what we're trying to do below */
HDasprintf(&obj2_fullpath, "%s%s", grp2_path, table->objs[i].name);
#else /* H5_HAVE_ASPRINTF */
obj2_fullpath = (char*)HDmalloc(HDstrlen(grp2_path) + HDstrlen(table->objs[i].name) + 1);
HDstrcpy(obj2_fullpath, grp2_path);
HDstrcat(obj2_fullpath, table->objs[i].name);
#endif /* H5_HAVE_ASPRINTF */
/* get index to figure out type of the object in file1 */
while ( info1->paths[idx1].path &&
(HDstrcmp (obj1_fullpath, info1->paths[idx1].path) != 0) )
while(info1->paths[idx1].path &&
(HDstrcmp(obj1_fullpath, info1->paths[idx1].path) != 0))
idx1++;
/* get index to figure out type of the object in file2 */
while ( info2->paths[idx2].path &&
(HDstrcmp (obj2_fullpath, info2->paths[idx2].path) != 0) )
while(info2->paths[idx2].path &&
(HDstrcmp(obj2_fullpath, info2->paths[idx2].path) != 0))
idx2++;
/* Set argdata to pass other args into diff() */
@ -1363,10 +1394,10 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
} /* end if */
} /* end else */
#endif /* H5_HAVE_PARALLEL */
if (obj1_fullpath)
HDfree (obj1_fullpath);
if (obj2_fullpath)
HDfree (obj2_fullpath);
if(obj1_fullpath)
HDfree(obj1_fullpath);
if(obj2_fullpath)
HDfree(obj2_fullpath);
} /* end if */
} /* end for */
h5difftrace("done with for loop\n");
@ -1586,12 +1617,12 @@ hsize_t diff(hid_t file1_id,
if (options->follow_links)
{
if (linkinfo1.linfo.type == H5L_TYPE_SOFT ||
linkinfo1.linfo.type == H5L_TYPE_EXTERNAL)
argdata->type[0] = linkinfo1.trg_type;
linkinfo1.linfo.type == H5L_TYPE_EXTERNAL)
argdata->type[0] = (h5trav_type_t)linkinfo1.trg_type;
if (linkinfo2.linfo.type == H5L_TYPE_SOFT ||
linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
argdata->type[1] = linkinfo2.trg_type;
linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
argdata->type[1] = (h5trav_type_t)linkinfo2.trg_type;
}
}
/* if objects are not the same type */
@ -1633,29 +1664,30 @@ hsize_t diff(hid_t file1_id,
{
switch(object_type)
{
case H5TRAV_TYPE_DATASET:
do_print_objname("dataset", path1, path2, options);
break;
case H5TRAV_TYPE_NAMED_DATATYPE:
do_print_objname("datatype", path1, path2, options);
break;
case H5TRAV_TYPE_GROUP:
do_print_objname("group", path1, path2, options);
break;
case H5TRAV_TYPE_LINK:
do_print_objname("link", path1, path2, options);
break;
case H5TRAV_TYPE_UDLINK:
if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL && linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
do_print_objname("external link", path1, path2, options);
else
do_print_objname ("user defined link", path1, path2, options);
break;
default:
parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
path1, path2, get_type(object_type) );
options->not_cmp = 1;
break;
case H5TRAV_TYPE_DATASET:
do_print_objname("dataset", path1, path2, options);
break;
case H5TRAV_TYPE_NAMED_DATATYPE:
do_print_objname("datatype", path1, path2, options);
break;
case H5TRAV_TYPE_GROUP:
do_print_objname("group", path1, path2, options);
break;
case H5TRAV_TYPE_LINK:
do_print_objname("link", path1, path2, options);
break;
case H5TRAV_TYPE_UDLINK:
if(linkinfo1.linfo.type == H5L_TYPE_EXTERNAL && linkinfo2.linfo.type == H5L_TYPE_EXTERNAL)
do_print_objname("external link", path1, path2, options);
else
do_print_objname ("user defined link", path1, path2, options);
break;
case H5TRAV_TYPE_UNKNOWN:
default:
parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",
path1, path2, get_type(object_type) );
options->not_cmp = 1;
break;
} /* switch(type)*/
print_found(nfound);
@ -1862,6 +1894,7 @@ hsize_t diff(hid_t file1_id,
}
break;
case H5TRAV_TYPE_UNKNOWN:
default:
if(options->m_verbose)
parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n",

@ -405,6 +405,9 @@
/* Define to 1 if you have the <unistd.h> header file. */
#define H5_HAVE_UNISTD_H 1
/* Define to 1 if you have the `asprintf' function. */
/* #undef H5_HAVE_ASPRINTF */
/* Define to 1 if you have the `vasprintf' function. */
/* #undef H5_HAVE_VASPRINTF */