From 57049f51b300929ce236cc4bfabffce0840c5c8e Mon Sep 17 00:00:00 2001 From: Timothe Litt Date: Sat, 5 Mar 2016 17:29:58 -0500 Subject: [PATCH] Implement correct HOM block search 1) Check for the alternate HOM block LBN 2) Continue search on checksum or consistency failure 3) Validate all fields in the ODS-2 specification 4) Compute BOTH checksums. 5) Mask checksum result to 16 bits, always. Also, call phyio_done on errors mounting physical devices. --- extracters/ods2/ODS2.exe | Bin 80384 -> 80896 bytes extracters/ods2/access.c | 77 ++++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/extracters/ods2/ODS2.exe b/extracters/ods2/ODS2.exe index 2ec3d87bc2006d9ca6107077ef2cfd7df146d2d4..9585a51d68f8546883337858f84c8a8336c01c38 100644 GIT binary patch delta 25383 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 R>kV}V%68xdHJvT|{{RKrK#u?b delta 24851 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 YekUf~C4IA=k{vv(r89*%_>29204pk^!2kdN diff --git a/extracters/ods2/access.c b/extracters/ods2/access.c index 7bd65fd..375d2ec 100644 --- a/extracters/ods2/access.c +++ b/extracters/ods2/access.c @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -57,19 +58,22 @@ unsigned deallocfile(struct FCB *fcb); /* Update.c */ /* checksum() to produce header checksum values... */ -vmsword checksum( vmsword *block ) { - register int count; +vmsword checksumn( vmsword *block, int count ) { register unsigned result; register unsigned short *ptr; register unsigned data; ptr = block; result = 0; - for ( count = 255; count > 0; --count ) { + for ( ; count > 0; --count ) { data = *ptr++; result += VMSWORD(data); } - return result; + return (vmsword)(result & 0xFFFF); +} + +vmsword checksum( vmsword *block ) { + return checksumn( block, 255 ); } /***************************************************************** fid_copy() */ @@ -821,7 +825,7 @@ unsigned dismount(struct VCB * vcb) /******************************************************************** mount() */ #ifdef DEBUG -#define HOME_LIMIT 1 +#define HOME_LIMIT 5 #else #define HOME_LIMIT 100 #endif @@ -885,36 +889,53 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], break; } for (hba = 1; hba <= HOME_LIMIT; hba++) { + struct HOME *hom; + sts = phyio_read( vcbdev->dev, hba, sizeof( struct HOME ), (char *) &vcbdev->home ); if (!(sts & STS$M_SUCCESS)) break; + hom = &vcbdev->home; #ifdef DEBUG printf( "--->mount(): LBA=%u, HM2$L_HOMELBN=%u, " "HM2$T_FORMAT=\"%12.12s\", memcmp()=%u\n", - hba, VMSLONG( vcbdev->home.hm2$l_homelbn ), - vcbdev->home.hm2$t_format, - memcmp( vcbdev->home.hm2$t_format, "DECFILE11B ", 12 ) + hba, VMSLONG( hom->hm2$l_homelbn ), + hom->hm2$t_format, + memcmp( hom->hm2$t_format, "DECFILE11B ", 12 ) ); #endif - if (hba == VMSLONG(vcbdev->home.hm2$l_homelbn) && - memcmp(vcbdev->home.hm2$t_format,"DECFILE11B ",12) == 0) { + if( (hba == VMSLONG(hom->hm2$l_homelbn) || + hba == VMSLONG(hom->hm2$l_alhomelbn)) && + (VMSLONG(hom->hm2$l_alhomelbn) != 0) && + (VMSLONG(hom->hm2$l_altidxlbn) != 0) && + (VMSWORD(hom->hm2$w_homevbn) != 0) && + (VMSLONG(hom->hm2$l_ibmaplbn) != 0) && + (VMSWORD(hom->hm2$w_ibmapsize) != 0) && + (VMSWORD(hom->hm2$w_resfiles) >= 5) && + (VMSWORD(hom->hm2$w_checksum1) == + checksumn( (vmsword *)hom, + (offsetof( struct HOME, hm2$w_checksum1 )/2) )) && + (VMSWORD(hom->hm2$w_checksum2) == + checksum( (vmsword *)hom )) && + (memcmp(hom->hm2$t_format,"DECFILE11B ",12) == 0) ) { break; } - sts = SS$_DATACHECK; +#ifdef DEBUG + printf( "--->mount(): Home block validation failure\n" ); + printf( "(VMSLONG(hom->hm2$l_alhomelbn) != 0) %u\n", (VMSLONG(hom->hm2$l_alhomelbn) != 0) ); + printf( "(VMSLONG(hom->hm2$l_altidxlbn) != 0) %u\n", (VMSLONG(hom->hm2$l_altidxlbn) != 0) ); + printf( "(VMSWORD(hom->hm2$w_homevbn) != 0) %u\n", (VMSWORD(hom->hm2$w_homevbn) != 0)); + printf( "(VMSLONG(hom->hm2$l_ibmaplbn) != 0) %u\n", (VMSLONG(hom->hm2$l_ibmaplbn) != 0) ); + printf( "(VMSWORD(hom->hm2$w_ibmapsize) != 0) %u\n", (VMSWORD(hom->hm2$w_ibmapsize) != 0)); + printf( "(VMSWORD(hom->hm2$w_resfiles) >= 5) %u\n", (VMSWORD(hom->hm2$w_resfiles) >= 5)); + printf( "(VMSWORD(hom->hm2$w_checksum1) = %u %u\n", VMSWORD(hom->hm2$w_checksum1), + checksumn( (vmsword *)hom, + (offsetof( struct HOME, hm2$w_checksum1 )/2) ) ); + printf( "(VMSWORD(hom->hm2$w_checksum2) = %u %u\n", VMSWORD(hom->hm2$w_checksum2), + checksum( (vmsword *)hom )); +#endif + sts = SS$_ENDOFFILE; } if( !(sts & 1) ) break; - if (VMSWORD(vcbdev->home.hm2$w_checksum2) != - checksum( (vmsword *) &vcbdev->home ) ) { -#ifdef DEBUG - printf( "--->mount(): Home block checksum failure: " ); - printf( "HM2$W_CHECKSUM=%u, checksum()=%u\n", - VMSWORD( vcbdev->home.hm2$w_checksum2 ), - checksum( (vmsword *) &vcbdev->home ) - ); -#endif - sts = SS$_DATACHECK; - break; - } if( label[device] != NULL ) { int i; char lbl[12+1]; /* Pad CLI-supplied label to match ODS */ @@ -929,7 +950,7 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], } if (!(sts & STS$M_SUCCESS)) break; if (flags & MOU_WRITE && !(vcbdev->dev->access & MOU_WRITE)) { - printf("%%MOUNT-I-WRITELOCK, %s is write locked\n", + printf("%%MOUNT-W-WRITELOCK, %s is write locked\n", dname); vcb->status &= ~VCB_WRITE; } @@ -1104,11 +1125,9 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], while( vcb->dircache ) cache_delete( (struct CACHE *) vcb->dircache ); } } else { /* *** DECREF *** */ - if( flags & MOU_VIRTUAL ) { - vcbdev = vcb->vcbdev; - for( device = 0; device < vcb->devices; device++, vcbdev++ ) { - phyio_done( vcbdev->dev ); - } + vcbdev = vcb->vcbdev; + for( device = 0; device < vcb->devices; device++, vcbdev++ ) { + phyio_done( vcbdev->dev ); } free(vcb); vcb = NULL;