From 78e3463dbb62dcc18ebab71eaa7ec675aa9d3cae Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Wed, 27 Feb 2002 16:52:19 -0500 Subject: [PATCH] [svn-r5023] Purpose: Bug Fix Description: There was a problem with having a lot of groups nested together. We could only handle 1024 characters at most, but, in a parallel program especially, it could occur that there were lots and lots of groups and would be more than 1024. Solution: I made the "objname" part of the obj_t structure a pointer instead of a fixed size. Added code to allocate/deallocate the memory we need for it. Had to fix how the "prefix" was being handled in the h5dump program. It was also set to only 1024 characters in length. I made it dynamic. Added a test case...Go me! Platforms tested: Linux, Solaris --- tools/h5dump/h5dump.c | 26 +++++-- tools/h5dump/h5dumptst.c | 22 ++++++ tools/h5dump/testh5dump.sh | 3 + tools/lib/h5tools_utils.c | 8 ++- tools/lib/h5tools_utils.h | 2 +- tools/testfiles/tlarge_objname.ddl | 109 +++++++++++++++++++++++++++++ tools/testfiles/tlarge_objname.h5 | Bin 0 -> 57344 bytes 7 files changed, 163 insertions(+), 7 deletions(-) create mode 100644 tools/testfiles/tlarge_objname.ddl create mode 100644 tools/testfiles/tlarge_objname.h5 diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index 767a6040cf..ceb86d41c2 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -1377,6 +1377,13 @@ dump_all(hid_t group, const char *name, void * op_data) d_status = EXIT_FAILURE; ret = FAIL; } else { + int new_len = strlen(prefix) + strlen(name) + 2; + + if (prefix_len <= new_len) { + prefix_len = new_len + 1; + prefix = realloc(prefix, prefix_len); + } + strcat(strcat(prefix, "/"), name); dump_function_table->dump_group_function(obj, name); strcpy(prefix, tmp); @@ -1448,7 +1455,8 @@ dump_all(hid_t group, const char *name, void * op_data) dset_table->objs[i].displayed = 1; strcat(tmp, "/"); strcat(tmp, name); - strcpy(dset_table->objs[i].objname, tmp); + free(dset_table->objs[i].objname); + dset_table->objs[i].objname = HDstrdup(tmp); } } @@ -1590,7 +1598,8 @@ dump_group(hid_t gid, const char *name) indentation(indent); printf("%s \"%s\"\n", HARDLINK, group_table->objs[i].objname); } else { - strcpy(group_table->objs[i].objname, prefix); + free(group_table->objs[i].objname); + group_table->objs[i].objname = HDstrdup(prefix); group_table->objs[i].displayed = 1; H5Aiterate(gid, NULL, dump_attr, NULL); H5Giterate(gid, ".", NULL, dump_all, (void *) &xtype); @@ -2193,7 +2202,8 @@ handle_datasets(hid_t fid, char *dset, void *data) end_obj(dump_header_format->datasetend, dump_header_format->datasetblockend); } else { - strcpy(dset_table->objs[idx].objname, dset); + free(dset_table->objs[idx].objname); + dset_table->objs[idx].objname = HDstrdup(dset); dset_table->objs[idx].displayed = 1; dump_dataset(dsetid, dset, sset); } @@ -2237,6 +2247,13 @@ handle_groups(hid_t fid, char *group, void * UNUSED data) dump_header_format->groupblockend); d_status = EXIT_FAILURE; } else { + int new_len = strlen(group) + 1; + + if (prefix_len <= new_len) { + prefix_len = new_len; + prefix = realloc(prefix, prefix_len); + } + H5Gget_objinfo(gid, ".", TRUE, &statbuf); strcpy(prefix, group); dump_group(gid, group); @@ -4342,7 +4359,8 @@ xml_dump_group(hid_t gid, const char *name) free(t_objname); } else { /* first time this group has been seen -- describe it */ - strcpy(group_table->objs[i].objname, prefix); + free(group_table->objs[i].objname); + group_table->objs[i].objname = HDstrdup(prefix); group_table->objs[i].displayed = 1; /* 1. do all the attributes of the group */ diff --git a/tools/h5dump/h5dumptst.c b/tools/h5dump/h5dumptst.c index d26c4b80db..0fb523b29a 100644 --- a/tools/h5dump/h5dumptst.c +++ b/tools/h5dump/h5dumptst.c @@ -55,6 +55,7 @@ #define FILE34 "tsplit_file" #define FILE35 "tfamily%05d.h5" #define FILE36 "tmulti" +#define FILE37 "tlarge_objname.h5" #define LENSTR 50 #define LENSTR2 11 @@ -2811,6 +2812,25 @@ void test_multi(void) H5Pclose(fapl); } +static void test_large_objname(void) +{ + hid_t fid, group; + char grp_name[128]; + register int i; + + fid = H5Fcreate(FILE37, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + group = H5Gcreate(fid, "this_is_a_large_group_name", 0); + + for (i = 0; i < 50; ++i) { + sprintf(grp_name, "this_is_a_large_group_name%d", i); + group = H5Gcreate(group, grp_name, 0); + } + + H5Gclose(group); + H5Fclose(fid); +} + int main(void) { test_group(); @@ -2860,5 +2880,7 @@ int main(void) test_family(); test_multi(); + test_large_objname(); + return 0; } diff --git a/tools/h5dump/testh5dump.sh b/tools/h5dump/testh5dump.sh index 58f3a9ce51..83e71fc992 100755 --- a/tools/h5dump/testh5dump.sh +++ b/tools/h5dump/testh5dump.sh @@ -155,6 +155,9 @@ TOOLTEST tsplit_file.ddl --filedriver=split tsplit_file TOOLTEST tfamily.ddl --filedriver=family tfamily%05d.h5 TOOLTEST tmulti.ddl --filedriver=multi tmulti +# test for files with group names which reach > 1024 bytes in size +TOOLTEST tlarge_objname.ddl -w157 tlarge_objname.h5 + # test Subsetting TOOLTEST tall-4s.ddl --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5 TOOLTEST tall-5s.ddl -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5 diff --git a/tools/lib/h5tools_utils.c b/tools/lib/h5tools_utils.c index 9f5fa0a9c7..f7306a769b 100644 --- a/tools/lib/h5tools_utils.c +++ b/tools/lib/h5tools_utils.c @@ -318,6 +318,7 @@ init_table(table_t **tbl) table->objs[i].displayed = 0; table->objs[i].recorded = 0; table->objs[i].objflag = 0; + table->objs[i].objname = NULL; } *tbl = table; @@ -495,7 +496,8 @@ find_objs(hid_t group, const char *name, void *op_data) /* named data type */ info->type_table->objs[info->type_table->nobjs-1].objflag = 1; } else { - strcpy (info->type_table->objs[i].objname, tmp); + free(info->type_table->objs[i].objname); + info->type_table->objs[i].objname = HDstrdup(tmp); info->type_table->objs[i].recorded = 1; /* named data type */ @@ -649,11 +651,13 @@ add_obj(table_t *table, unsigned long *objno, char *objname) table->objs[i].displayed = 0; table->objs[i].recorded = 0; table->objs[i].objflag = 0; + table->objs[i].objname = NULL; } } i = table->nobjs++; table->objs[i].objno[0] = objno[0]; table->objs[i].objno[1] = objno[1]; - HDstrcpy(table->objs[i].objname, objname); + free(table->objs[i].objname); + table->objs[i].objname = HDstrdup(objname); } diff --git a/tools/lib/h5tools_utils.h b/tools/lib/h5tools_utils.h index eda8e00bf3..bb47c945ae 100644 --- a/tools/lib/h5tools_utils.h +++ b/tools/lib/h5tools_utils.h @@ -69,7 +69,7 @@ extern int get_option(int argc, const char **argv, const char *opt, /*struct taken from the dumper. needed in table struct*/ typedef struct obj_t { unsigned long objno[2]; - char objname[1024]; + char *objname; int displayed; int recorded; int objflag; diff --git a/tools/testfiles/tlarge_objname.ddl b/tools/testfiles/tlarge_objname.ddl new file mode 100644 index 0000000000..c57ae253d5 --- /dev/null +++ b/tools/testfiles/tlarge_objname.ddl @@ -0,0 +1,109 @@ +############################# +Expected output for 'h5dump -w157 tlarge_objname.h5' +############################# +HDF5 "tlarge_objname.h5" { +GROUP "/" { + GROUP "this_is_a_large_group_name" { + GROUP "this_is_a_large_group_name0" { + GROUP "this_is_a_large_group_name1" { + GROUP "this_is_a_large_group_name2" { + GROUP "this_is_a_large_group_name3" { + GROUP "this_is_a_large_group_name4" { + GROUP "this_is_a_large_group_name5" { + GROUP "this_is_a_large_group_name6" { + GROUP "this_is_a_large_group_name7" { + GROUP "this_is_a_large_group_name8" { + GROUP "this_is_a_large_group_name9" { + GROUP "this_is_a_large_group_name10" { + GROUP "this_is_a_large_group_name11" { + GROUP "this_is_a_large_group_name12" { + GROUP "this_is_a_large_group_name13" { + GROUP "this_is_a_large_group_name14" { + GROUP "this_is_a_large_group_name15" { + GROUP "this_is_a_large_group_name16" { + GROUP "this_is_a_large_group_name17" { + GROUP "this_is_a_large_group_name18" { + GROUP "this_is_a_large_group_name19" { + GROUP "this_is_a_large_group_name20" { + GROUP "this_is_a_large_group_name21" { + GROUP "this_is_a_large_group_name22" { + GROUP "this_is_a_large_group_name23" { + GROUP "this_is_a_large_group_name24" { + GROUP "this_is_a_large_group_name25" { + GROUP "this_is_a_large_group_name26" { + GROUP "this_is_a_large_group_name27" { + GROUP "this_is_a_large_group_name28" { + GROUP "this_is_a_large_group_name29" { + GROUP "this_is_a_large_group_name30" { + GROUP "this_is_a_large_group_name31" { + GROUP "this_is_a_large_group_name32" { + GROUP "this_is_a_large_group_name33" { + GROUP "this_is_a_large_group_name34" { + GROUP "this_is_a_large_group_name35" { + GROUP "this_is_a_large_group_name36" { + GROUP "this_is_a_large_group_name37" { + GROUP "this_is_a_large_group_name38" { + GROUP "this_is_a_large_group_name39" { + GROUP "this_is_a_large_group_name40" { + GROUP "this_is_a_large_group_name41" { + GROUP "this_is_a_large_group_name42" { + GROUP "this_is_a_large_group_name43" { + GROUP "this_is_a_large_group_name44" { + GROUP "this_is_a_large_group_name45" { + GROUP "this_is_a_large_group_name46" { + GROUP "this_is_a_large_group_name47" { + GROUP "this_is_a_large_group_name48" { + GROUP "this_is_a_large_group_name49" { + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} +} diff --git a/tools/testfiles/tlarge_objname.h5 b/tools/testfiles/tlarge_objname.h5 new file mode 100644 index 0000000000000000000000000000000000000000..b6fc299f3ee991f9014e108456f012c51d17e31b GIT binary patch literal 57344 zcmeI5Z>(k47{=Goa8oIRU{b*f!GvIX&S`rQ6rGw7?M~~@gmC7Pad+v=+}!EV5KIUL zK|`=Zv^NA3f`(v1Fd=9Nw*SMY`RL>R*l%^`JnI!}rO$rbm8_hdv)`M^ym#Goo^{{- z?DzMq^h4W^AG-dAD=xqCa(C%#ZOvWg_PU2J7WnJ_@Z~Nh>+qSK@ZmjSeL8$|B&-h| ze0jC_HvD|Qd@fWex7W9xobUeGnBTUsy?J!Lxqaf)*8KR!v7`8eoPR+CD^g!~^TC78 z?Q!C>RC&C^kHB|p@&l`*a$t{p*zR;V=fhJ!c9+jf>(c>XOJ|2EFp^7^x&)pNS zBRn&m=&iy5#`9T)=hFUZdEuXm4lFN9zlmX<&+@|UL%;Qt;=a?o@Zr9ZykNTc6kD;p zxTxfX#&h*_cxyb5bH*6Y?UUh06RNnA^4vWIJHj*5iQXz4U_9^p^Ku>1^1?q0{aIct z_dPA^x3j!(9v#(Bi#tp6!iW1t@`CB&Q*6cZqEhlgn^|@XU1hl>IFZFrE)7Jd3_m)$+pMh~I2^QR)p0 z`&^b6?hyK}UlsSC=7kUUjpPN>#i!Vc<;7_wFEpO3o8hhTJkA+oJh!ibA5Ey@PReul zTI>kVOecD)aDefAPT{$#&%=1}ZxFhJdp2vNsdEvu-BYDAe z@hP@qdC@9)q48Y36W$un~L~j)iFrL@`zFdd2yzs}- zpXJ4J-_x>wJIf1KqoaB=?kvpyh3C@#X?fv4jSeg?O23I=p3m~aok73#$Kt-zyzt?^k-T8K_!L{Qym0^Q_eSHn z`YiOubH9(Py32TOKZz%9LY3!FdG0=i9pRbjL~j)iFrL>Ho=f|u<%RzOIv68qd|2;H~jI&KYAox1WO_O{n5d%5(R5 z>Y1M&r5qD)h#4zmKcB%Xn_Tj3;hFmFG`+?!JN@;hE_~Zxs$Op4SzgOZ%tgh5rUR zu)HY!CWd)F%L})Ie(SsAzSF$$;l7c)V7mAeTd};@Qu0FMx%w8oHJ-;gV~pqaYw)89 zRoqE=?!Jy4;hE_~Zxs$Op3f>gm-bJ~3;$hoV0lscO$_sVmKW|U`mMhi_nqd25BH7a z1=Gc+*ox)FMI|pZo~!S}TjP10GsbvszYRZ{P{o~;=k7b$5uTY&^j6^j<9Xk|mg|s~ z7yd`+&+=lq?`c`To#lnQ2OZVli#tp6!iW1t@`CB&Q*6cZqEhlgS zh3C@#X?fv)gAOb&O23I=p3m~aokzd*FXFz_yzt?^k-T8K_!L{Qyg2ahes46MtKUIy zJoo#!s=JKm_E&h~CRBO;l;`f(*b$zYPV`pc0OPq@1SQ&G*7_1E4Vqh|Ki-F0| zEe0k-w-}fV-C|%ebc=z>&@BcgL$?^1hpwAs&dVfoUM89IGRd5mN#?vvGUsKIIWLpU zd6{I+%OrDNrkV3H&77BM=DbWZ=Vh8XFVoCmq*WEJ@