@@ -548,7 +548,7 @@ ImagingDestroyArrow(Imaging im) {
548548 }
549549}
550550
551- Imaging
551+ int
552552ImagingBorrowArrow (
553553 Imaging im ,
554554 struct ArrowArray * external_array ,
@@ -571,9 +571,8 @@ ImagingBorrowArrow(
571571 }
572572
573573 if (!borrowed_buffer ) {
574- return (Imaging )ImagingError_ValueError (
575- "Arrow Array, exactly 2 buffers required"
576- );
574+ ImagingError_ValueError ("Arrow Array, exactly 2 buffers required" );
575+ return 0 ;
577576 }
578577
579578 for (y = i = 0 ; y < im -> ysize ; y ++ ) {
@@ -585,7 +584,7 @@ ImagingBorrowArrow(
585584 im -> arrow_array_capsule = arrow_capsule ;
586585 im -> destroy = ImagingDestroyArrow ;
587586
588- return im ;
587+ return 1 ;
589588}
590589
591590/* --------------------------------------------------------------------
@@ -709,9 +708,11 @@ ImagingNewArrow(
709708 && im -> bands == 1 )) // Single band match
710709 && pixels == external_array -> length ) {
711710 // one arrow element per, and it matches a pixelsize*char
712- if (ImagingBorrowArrow (im , external_array , im -> pixelsize , array_capsule )) {
713- return im ;
711+ if (!ImagingBorrowArrow (im , external_array , im -> pixelsize , array_capsule )) {
712+ ImagingDelete (im );
713+ return NULL ;
714714 }
715+ return im ;
715716 }
716717 // Stored as [[r,g,b,a],...]
717718 if (strcmp (schema -> format , "+w:4" ) == 0 // 4 up array
@@ -725,9 +726,11 @@ ImagingNewArrow(
725726 && external_array -> children // array is well formed
726727 && 4 * pixels == external_array -> children [0 ]-> length ) {
727728 // 4 up element of char into pixelsize == 4
728- if (ImagingBorrowArrow (im , external_array , 1 , array_capsule )) {
729- return im ;
729+ if (!ImagingBorrowArrow (im , external_array , 1 , array_capsule )) {
730+ ImagingDelete (im );
731+ return NULL ;
730732 }
733+ return im ;
731734 }
732735 // Stored as [r,g,b,a,r,g,b,a,...]
733736 if (strcmp (schema -> format , "C" ) == 0 // uint8
@@ -736,13 +739,17 @@ ImagingNewArrow(
736739 && strcmp (im -> arrow_band_format , "C" ) == 0 // expected format
737740 && 4 * pixels == external_array -> length ) { // expected length
738741 // single flat array, interleaved storage.
739- if (ImagingBorrowArrow (im , external_array , 1 , array_capsule )) {
740- return im ;
742+ if (!ImagingBorrowArrow (im , external_array , 1 , array_capsule )) {
743+ ImagingDelete (im );
744+ return NULL ;
741745 }
746+ return im ;
742747 }
743748 // fmt: on
744749 ImagingDelete (im );
745- return NULL ;
750+ return (Imaging )ImagingError_ValueError (
751+ "Invalid Arrow array mode or size mismatch"
752+ );
746753}
747754
748755Imaging
0 commit comments