diff --git a/dasdblks.h b/dasdblks.h index f386df473..1409ee068 100644 --- a/dasdblks.h +++ b/dasdblks.h @@ -386,5 +386,5 @@ int create_compressed_fba (char *fname, U16 devtype, U32 sectsz, int get_verbose_util(void); DUT_DLL_IMPORT void set_verbose_util(int v); - +DUT_DLL_IMPORT int valid_dsname( const char *pszdsname ); #define DEFAULT_FBA_TYPE 0x3370 diff --git a/dasdls.c b/dasdls.c index 4497c4fda..b94066875 100644 --- a/dasdls.c +++ b/dasdls.c @@ -51,15 +51,21 @@ int list_contents(CIFBLK *cif, char *volser, DSXTENT *extent) ptr = cif->trkbuf + CKDDASD_TRKHDR_SIZE; - while (!end_of_track(ptr)) { + while (!end_of_track(ptr)) + { char dsname[45]; + CKDDASD_RECHDR *rechdr = (CKDDASD_RECHDR*)ptr; int kl = rechdr->klen; int dl = (rechdr->dlen[0] << 8) | rechdr->dlen[1]; + make_asciiz(dsname, sizeof(dsname), ptr + CKDDASD_RECHDR_SIZE, kl); - /* XXXX Is this a suitable sanity check for a legal dsname? */ - if (isalnum(*dsname)) - printf("%s\n", dsname); + + dsname[44] = '\0'; + + if ( valid_dsname( dsname ) ) + printf("%s\n", dsname); + ptr += CKDDASD_RECHDR_SIZE + kl + dl; } diff --git a/dasdutil.c b/dasdutil.c index 48b6dab83..7abd71e79 100644 --- a/dasdutil.c +++ b/dasdutil.c @@ -2205,3 +2205,35 @@ DLL_EXPORT void set_verbose_util(int v) { verbose = v; } + +DLL_EXPORT int valid_dsname( const char *pszdsname ) +{ + int i; + int iLen = (int)strlen(pszdsname); + + if ( iLen > 44 || iLen == 0 ) return FALSE; + + for ( i = 0; i < iLen; i++ ) + { + BYTE c = pszdsname[i]; + if ( isalnum( c ) ) + continue; + else if ( c == '$' ) + continue; + else if ( c == '@' ) + continue; + else if ( c == '#' ) + continue; + else if ( c == '-' ) + continue; + else if ( c == '.' ) + continue; + else if ( c == '{' ) + continue; + else if ( i > 1 && c == '\0' ) + break; + else + return FALSE; + } + return TRUE; +}