@@ -474,7 +474,11 @@ pub unsafe extern "C" fn cass_data_type_new(
474
474
pub unsafe extern "C" fn cass_data_type_new_from_existing (
475
475
data_type : CassBorrowedSharedPtr < CassDataType , CConst > ,
476
476
) -> CassOwnedSharedPtr < CassDataType , CMut > {
477
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
477
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
478
+ tracing:: error!( "Provided null data type pointer to cass_data_type_new_from_existing!" ) ;
479
+ return ArcFFI :: null ( ) ;
480
+ } ;
481
+
478
482
ArcFFI :: into_ptr ( CassDataType :: new_arced (
479
483
unsafe { data_type. get_unchecked ( ) } . clone ( ) ,
480
484
) )
@@ -507,15 +511,23 @@ pub unsafe extern "C" fn cass_data_type_free(data_type: CassOwnedSharedPtr<CassD
507
511
pub unsafe extern "C" fn cass_data_type_type (
508
512
data_type : CassBorrowedSharedPtr < CassDataType , CConst > ,
509
513
) -> CassValueType {
510
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
514
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
515
+ tracing:: error!( "Provided null data type pointer to cass_data_type_type!" ) ;
516
+ return CassValueType :: CASS_VALUE_TYPE_UNKNOWN ;
517
+ } ;
518
+
511
519
unsafe { data_type. get_unchecked ( ) } . get_value_type ( )
512
520
}
513
521
514
522
#[ unsafe( no_mangle) ]
515
523
pub unsafe extern "C" fn cass_data_type_is_frozen (
516
524
data_type : CassBorrowedSharedPtr < CassDataType , CConst > ,
517
525
) -> cass_bool_t {
518
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
526
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
527
+ tracing:: error!( "Provided null data type pointer to cass_data_type_is_frozen!" ) ;
528
+ return cass_false;
529
+ } ;
530
+
519
531
let is_frozen = match unsafe { data_type. get_unchecked ( ) } {
520
532
CassDataTypeInner :: UDT ( udt) => udt. frozen ,
521
533
CassDataTypeInner :: List { frozen, .. } => * frozen,
@@ -533,7 +545,11 @@ pub unsafe extern "C" fn cass_data_type_type_name(
533
545
type_name : * mut * const c_char ,
534
546
type_name_length : * mut size_t ,
535
547
) -> CassError {
536
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
548
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
549
+ tracing:: error!( "Provided null data type pointer to cass_data_type_type_name!" ) ;
550
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
551
+ } ;
552
+
537
553
match unsafe { data_type. get_unchecked ( ) } {
538
554
CassDataTypeInner :: UDT ( UDTDataType { name, .. } ) => {
539
555
unsafe { write_str_to_c ( name, type_name, type_name_length) } ;
@@ -557,7 +573,11 @@ pub unsafe extern "C" fn cass_data_type_set_type_name_n(
557
573
type_name : * const c_char ,
558
574
type_name_length : size_t ,
559
575
) -> CassError {
560
- let data_type = ArcFFI :: as_ref ( data_type_raw) . unwrap ( ) ;
576
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type_raw) else {
577
+ tracing:: error!( "Provided null data type pointer to cass_data_type_set_type_name_n!" ) ;
578
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
579
+ } ;
580
+
561
581
let type_name_string = unsafe { ptr_to_cstr_n ( type_name, type_name_length) }
562
582
. unwrap ( )
563
583
. to_string ( ) ;
@@ -577,7 +597,11 @@ pub unsafe extern "C" fn cass_data_type_keyspace(
577
597
keyspace : * mut * const c_char ,
578
598
keyspace_length : * mut size_t ,
579
599
) -> CassError {
580
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
600
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
601
+ tracing:: error!( "Provided null data type pointer to cass_data_type_keyspace!" ) ;
602
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
603
+ } ;
604
+
581
605
match unsafe { data_type. get_unchecked ( ) } {
582
606
CassDataTypeInner :: UDT ( UDTDataType { name, .. } ) => {
583
607
unsafe { write_str_to_c ( name, keyspace, keyspace_length) } ;
@@ -601,7 +625,11 @@ pub unsafe extern "C" fn cass_data_type_set_keyspace_n(
601
625
keyspace : * const c_char ,
602
626
keyspace_length : size_t ,
603
627
) -> CassError {
604
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
628
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
629
+ tracing:: error!( "Provided null data type pointer to cass_data_type_set_keyspace_n!" ) ;
630
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
631
+ } ;
632
+
605
633
let keyspace_string = unsafe { ptr_to_cstr_n ( keyspace, keyspace_length) }
606
634
. unwrap ( )
607
635
. to_string ( ) ;
@@ -621,7 +649,11 @@ pub unsafe extern "C" fn cass_data_type_class_name(
621
649
class_name : * mut * const :: std:: os:: raw:: c_char ,
622
650
class_name_length : * mut size_t ,
623
651
) -> CassError {
624
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
652
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
653
+ tracing:: error!( "Provided null data type pointer to cass_data_type_class_name!" ) ;
654
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
655
+ } ;
656
+
625
657
match unsafe { data_type. get_unchecked ( ) } {
626
658
CassDataTypeInner :: Custom ( name) => {
627
659
unsafe { write_str_to_c ( name, class_name, class_name_length) } ;
@@ -645,7 +677,11 @@ pub unsafe extern "C" fn cass_data_type_set_class_name_n(
645
677
class_name : * const :: std:: os:: raw:: c_char ,
646
678
class_name_length : size_t ,
647
679
) -> CassError {
648
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
680
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
681
+ tracing:: error!( "Provided null data type pointer to cass_data_type_set_class_name_n!" ) ;
682
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
683
+ } ;
684
+
649
685
let class_string = unsafe { ptr_to_cstr_n ( class_name, class_name_length) }
650
686
. unwrap ( )
651
687
. to_string ( ) ;
@@ -662,7 +698,11 @@ pub unsafe extern "C" fn cass_data_type_set_class_name_n(
662
698
pub unsafe extern "C" fn cass_data_type_sub_type_count (
663
699
data_type : CassBorrowedSharedPtr < CassDataType , CConst > ,
664
700
) -> size_t {
665
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
701
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
702
+ tracing:: error!( "Provided null data type pointer to cass_data_type_sub_type_count!" ) ;
703
+ return 0 ;
704
+ } ;
705
+
666
706
match unsafe { data_type. get_unchecked ( ) } {
667
707
CassDataTypeInner :: Value ( ..) => 0 ,
668
708
CassDataTypeInner :: UDT ( udt_data_type) => udt_data_type. field_types . len ( ) as size_t ,
@@ -691,7 +731,11 @@ pub unsafe extern "C" fn cass_data_type_sub_data_type(
691
731
data_type : CassBorrowedSharedPtr < CassDataType , CConst > ,
692
732
index : size_t ,
693
733
) -> CassBorrowedSharedPtr < CassDataType , CConst > {
694
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
734
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
735
+ tracing:: error!( "Provided null data type pointer to cass_data_type_sub_data_type!" ) ;
736
+ return ArcFFI :: null ( ) ;
737
+ } ;
738
+
695
739
let sub_type: Option < & Arc < CassDataType > > =
696
740
unsafe { data_type. get_unchecked ( ) } . get_sub_data_type ( index as usize ) ;
697
741
@@ -716,7 +760,13 @@ pub unsafe extern "C" fn cass_data_type_sub_data_type_by_name_n(
716
760
name : * const :: std:: os:: raw:: c_char ,
717
761
name_length : size_t ,
718
762
) -> CassBorrowedSharedPtr < CassDataType , CConst > {
719
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
763
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
764
+ tracing:: error!(
765
+ "Provided null data type pointer to cass_data_type_sub_data_type_by_name_n!"
766
+ ) ;
767
+ return ArcFFI :: null ( ) ;
768
+ } ;
769
+
720
770
let name_str = unsafe { ptr_to_cstr_n ( name, name_length) } . unwrap ( ) ;
721
771
match unsafe { data_type. get_unchecked ( ) } {
722
772
CassDataTypeInner :: UDT ( udt) => match udt. get_field_by_name ( name_str) {
@@ -734,7 +784,11 @@ pub unsafe extern "C" fn cass_data_type_sub_type_name(
734
784
name : * mut * const :: std:: os:: raw:: c_char ,
735
785
name_length : * mut size_t ,
736
786
) -> CassError {
737
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
787
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
788
+ tracing:: error!( "Provided null data type pointer to cass_data_type_sub_type_name!" ) ;
789
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
790
+ } ;
791
+
738
792
match unsafe { data_type. get_unchecked ( ) } {
739
793
CassDataTypeInner :: UDT ( udt) => match udt. field_types . get ( index as usize ) {
740
794
None => CassError :: CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS ,
@@ -752,10 +806,16 @@ pub unsafe extern "C" fn cass_data_type_add_sub_type(
752
806
data_type : CassBorrowedSharedPtr < CassDataType , CMut > ,
753
807
sub_data_type : CassBorrowedSharedPtr < CassDataType , CConst > ,
754
808
) -> CassError {
755
- let data_type = ArcFFI :: as_ref ( data_type) . unwrap ( ) ;
756
- match unsafe { data_type. get_mut_unchecked ( ) }
757
- . add_sub_data_type ( ArcFFI :: cloned_from_ptr ( sub_data_type) . unwrap ( ) )
758
- {
809
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type) else {
810
+ tracing:: error!( "Provided null data type pointer to cass_data_type_add_sub_type!" ) ;
811
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
812
+ } ;
813
+ let Some ( sub_data_type) = ArcFFI :: cloned_from_ptr ( sub_data_type) else {
814
+ tracing:: error!( "Provided null sub data type pointer to cass_data_type_add_sub_type!" ) ;
815
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
816
+ } ;
817
+
818
+ match unsafe { data_type. get_mut_unchecked ( ) } . add_sub_data_type ( sub_data_type) {
759
819
Ok ( ( ) ) => CassError :: CASS_OK ,
760
820
Err ( e) => e,
761
821
}
@@ -777,12 +837,23 @@ pub unsafe extern "C" fn cass_data_type_add_sub_type_by_name_n(
777
837
name_length : size_t ,
778
838
sub_data_type_raw : CassBorrowedSharedPtr < CassDataType , CConst > ,
779
839
) -> CassError {
840
+ let Some ( data_type) = ArcFFI :: as_ref ( data_type_raw) else {
841
+ tracing:: error!(
842
+ "Provided null data type pointer to cass_data_type_add_sub_type_by_name_n!"
843
+ ) ;
844
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
845
+ } ;
846
+ let Some ( sub_data_type) = ArcFFI :: cloned_from_ptr ( sub_data_type_raw) else {
847
+ tracing:: error!(
848
+ "Provided null sub data type pointer to cass_data_type_add_sub_type_by_name_n!"
849
+ ) ;
850
+ return CassError :: CASS_ERROR_LIB_BAD_PARAMS ;
851
+ } ;
852
+
780
853
let name_string = unsafe { ptr_to_cstr_n ( name, name_length) }
781
854
. unwrap ( )
782
855
. to_string ( ) ;
783
- let sub_data_type = ArcFFI :: cloned_from_ptr ( sub_data_type_raw) . unwrap ( ) ;
784
856
785
- let data_type = ArcFFI :: as_ref ( data_type_raw) . unwrap ( ) ;
786
857
match unsafe { data_type. get_mut_unchecked ( ) } {
787
858
CassDataTypeInner :: UDT ( udt_data_type) => {
788
859
// The Cpp Driver does not check whether field_types size
0 commit comments