@@ -780,7 +780,7 @@ int writeIndex(bigWigFile_t *fp) {
780
780
//This may or may not produce the requested number of zoom levels
781
781
int makeZoomLevels (bigWigFile_t * fp ) {
782
782
uint32_t meanBinSize , i ;
783
- uint32_t multiplier = 4 , zoom = 10 ;
783
+ uint32_t multiplier = 4 , zoom = 10 , maxZoom = 0 ;
784
784
uint16_t nLevels = 0 ;
785
785
786
786
meanBinSize = ((double ) fp -> writeBuffer -> runningWidthSum )/(fp -> writeBuffer -> nEntries );
@@ -801,7 +801,15 @@ int makeZoomLevels(bigWigFile_t *fp) {
801
801
if (!fp -> hdr -> zoomHdrs -> indexOffset ) return 4 ;
802
802
if (!fp -> hdr -> zoomHdrs -> idx ) return 5 ;
803
803
804
+ //There's no point in having a zoom level larger than the largest chromosome
805
+ //This will none the less allow at least one zoom level, which is generally needed for IGV et al.
806
+ for (i = 0 ; i < fp -> cl -> nKeys ; i ++ ) {
807
+ if (fp -> cl -> len [i ] > maxZoom ) maxZoom = fp -> cl -> len [i ];
808
+ }
809
+ if (zoom > maxZoom ) zoom = maxZoom ;
810
+
804
811
for (i = 0 ; i < fp -> hdr -> nLevels ; i ++ ) {
812
+ if (zoom > maxZoom ) break ; //prevent absurdly large zoom levels
805
813
fp -> hdr -> zoomHdrs -> level [i ] = zoom ;
806
814
nLevels ++ ;
807
815
if (((uint32_t )-1 )/multiplier < zoom ) break ;
@@ -887,6 +895,10 @@ uint32_t updateInterval(bigWigFile_t *fp, bwZoomBuffer_t *buffer, double *sum, d
887
895
uint32_t rv = 0 , offset = 0 ;
888
896
if (!buffer ) return 0 ;
889
897
if (buffer -> l + 32 >= buffer -> m ) return 0 ;
898
+
899
+ //Make sure that we don't overflow a uint32_t by adding some huge value to start
900
+ if (start + size < start ) size = ((uint32_t ) -1 ) - start ;
901
+
890
902
if (buffer -> l ) {
891
903
offset = buffer -> l /32 ;
892
904
} else {
0 commit comments