Skip to content

Commit d100084

Browse files
committed
fix: improve ffi safety and add comments where handling is critical
1 parent de1d195 commit d100084

4 files changed

Lines changed: 127 additions & 11 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

litehtml-sys/csrc/litehtml_c.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,30 +522,35 @@ extern "C" {
522522

523523
const char* lh_font_description_family(const lh_font_description_t* fd)
524524
{
525+
if (!fd) return "";
525526
const auto* d = reinterpret_cast<const litehtml::font_description*>(fd);
526527
return d->family.c_str();
527528
}
528529

529530
float lh_font_description_size(const lh_font_description_t* fd)
530531
{
532+
if (!fd) return 0.0f;
531533
const auto* d = reinterpret_cast<const litehtml::font_description*>(fd);
532534
return d->size;
533535
}
534536

535537
int lh_font_description_style(const lh_font_description_t* fd)
536538
{
539+
if (!fd) return 0;
537540
const auto* d = reinterpret_cast<const litehtml::font_description*>(fd);
538541
return static_cast<int>(d->style);
539542
}
540543

541544
int lh_font_description_weight(const lh_font_description_t* fd)
542545
{
546+
if (!fd) return 0;
543547
const auto* d = reinterpret_cast<const litehtml::font_description*>(fd);
544548
return d->weight;
545549
}
546550

547551
int lh_font_description_decoration_line(const lh_font_description_t* fd)
548552
{
553+
if (!fd) return 0;
549554
const auto* d = reinterpret_cast<const litehtml::font_description*>(fd);
550555
return d->decoration_line;
551556
}
@@ -556,42 +561,49 @@ int lh_font_description_decoration_line(const lh_font_description_t* fd)
556561

557562
const char* lh_list_marker_image(const lh_list_marker_t* m)
558563
{
564+
if (!m) return "";
559565
const auto* mk = reinterpret_cast<const litehtml::list_marker*>(m);
560566
return mk->image.c_str();
561567
}
562568

563569
const char* lh_list_marker_baseurl(const lh_list_marker_t* m)
564570
{
571+
if (!m) return "";
565572
const auto* mk = reinterpret_cast<const litehtml::list_marker*>(m);
566573
return mk->baseurl;
567574
}
568575

569576
int lh_list_marker_type(const lh_list_marker_t* m)
570577
{
578+
if (!m) return 0;
571579
const auto* mk = reinterpret_cast<const litehtml::list_marker*>(m);
572580
return static_cast<int>(mk->marker_type);
573581
}
574582

575583
lh_web_color_t lh_list_marker_color(const lh_list_marker_t* m)
576584
{
585+
if (!m) return {};
577586
const auto* mk = reinterpret_cast<const litehtml::list_marker*>(m);
578587
return to_c(mk->color);
579588
}
580589

581590
lh_position_t lh_list_marker_pos(const lh_list_marker_t* m)
582591
{
592+
if (!m) return {};
583593
const auto* mk = reinterpret_cast<const litehtml::list_marker*>(m);
584594
return to_c(mk->pos);
585595
}
586596

587597
int lh_list_marker_index(const lh_list_marker_t* m)
588598
{
599+
if (!m) return 0;
589600
const auto* mk = reinterpret_cast<const litehtml::list_marker*>(m);
590601
return mk->index;
591602
}
592603

593604
uintptr_t lh_list_marker_font(const lh_list_marker_t* m)
594605
{
606+
if (!m) return 0;
595607
const auto* mk = reinterpret_cast<const litehtml::list_marker*>(m);
596608
return mk->font;
597609
}
@@ -602,42 +614,49 @@ uintptr_t lh_list_marker_font(const lh_list_marker_t* m)
602614

603615
lh_position_t lh_background_layer_border_box(const lh_background_layer_t* layer)
604616
{
617+
if (!layer) return {};
605618
const auto* bl = reinterpret_cast<const litehtml::background_layer*>(layer);
606619
return to_c(bl->border_box);
607620
}
608621

609622
lh_border_radiuses_t lh_background_layer_border_radius(const lh_background_layer_t* layer)
610623
{
624+
if (!layer) return {};
611625
const auto* bl = reinterpret_cast<const litehtml::background_layer*>(layer);
612626
return to_c(bl->border_radius);
613627
}
614628

615629
lh_position_t lh_background_layer_clip_box(const lh_background_layer_t* layer)
616630
{
631+
if (!layer) return {};
617632
const auto* bl = reinterpret_cast<const litehtml::background_layer*>(layer);
618633
return to_c(bl->clip_box);
619634
}
620635

621636
lh_position_t lh_background_layer_origin_box(const lh_background_layer_t* layer)
622637
{
638+
if (!layer) return {};
623639
const auto* bl = reinterpret_cast<const litehtml::background_layer*>(layer);
624640
return to_c(bl->origin_box);
625641
}
626642

627643
int lh_background_layer_attachment(const lh_background_layer_t* layer)
628644
{
645+
if (!layer) return 0;
629646
const auto* bl = reinterpret_cast<const litehtml::background_layer*>(layer);
630647
return static_cast<int>(bl->attachment);
631648
}
632649

633650
int lh_background_layer_repeat(const lh_background_layer_t* layer)
634651
{
652+
if (!layer) return 0;
635653
const auto* bl = reinterpret_cast<const litehtml::background_layer*>(layer);
636654
return static_cast<int>(bl->repeat);
637655
}
638656

639657
int lh_background_layer_is_root(const lh_background_layer_t* layer)
640658
{
659+
if (!layer) return 0;
641660
const auto* bl = reinterpret_cast<const litehtml::background_layer*>(layer);
642661
return bl->is_root ? 1 : 0;
643662
}
@@ -648,20 +667,23 @@ int lh_background_layer_is_root(const lh_background_layer_t* layer)
648667

649668
lh_point_t lh_linear_gradient_start(const lh_linear_gradient_t* g)
650669
{
670+
if (!g) return {};
651671
const auto* lg = reinterpret_cast<
652672
const litehtml::background_layer::linear_gradient*>(g);
653673
return to_c(lg->start);
654674
}
655675

656676
lh_point_t lh_linear_gradient_end(const lh_linear_gradient_t* g)
657677
{
678+
if (!g) return {};
658679
const auto* lg = reinterpret_cast<
659680
const litehtml::background_layer::linear_gradient*>(g);
660681
return to_c(lg->end);
661682
}
662683

663684
int lh_linear_gradient_color_points_count(const lh_linear_gradient_t* g)
664685
{
686+
if (!g) return 0;
665687
const auto* lg = reinterpret_cast<
666688
const litehtml::background_layer::linear_gradient*>(g);
667689
return static_cast<int>(lg->color_points.size());
@@ -670,6 +692,7 @@ int lh_linear_gradient_color_points_count(const lh_linear_gradient_t* g)
670692
float lh_linear_gradient_color_point_offset(const lh_linear_gradient_t* g,
671693
int idx)
672694
{
695+
if (!g) return 0.0f;
673696
const auto* lg = reinterpret_cast<
674697
const litehtml::background_layer::linear_gradient*>(g);
675698
if (idx < 0 || idx >= static_cast<int>(lg->color_points.size()))
@@ -680,6 +703,7 @@ float lh_linear_gradient_color_point_offset(const lh_linear_gradient_t* g,
680703
lh_web_color_t lh_linear_gradient_color_point_color(
681704
const lh_linear_gradient_t* g, int idx)
682705
{
706+
if (!g) return {};
683707
const auto* lg = reinterpret_cast<
684708
const litehtml::background_layer::linear_gradient*>(g);
685709
if (idx < 0 || idx >= static_cast<int>(lg->color_points.size()))
@@ -696,20 +720,23 @@ lh_web_color_t lh_linear_gradient_color_point_color(
696720

697721
lh_point_t lh_radial_gradient_position(const lh_radial_gradient_t* g)
698722
{
723+
if (!g) return {};
699724
const auto* rg = reinterpret_cast<
700725
const litehtml::background_layer::radial_gradient*>(g);
701726
return to_c(rg->position);
702727
}
703728

704729
lh_point_t lh_radial_gradient_radius(const lh_radial_gradient_t* g)
705730
{
731+
if (!g) return {};
706732
const auto* rg = reinterpret_cast<
707733
const litehtml::background_layer::radial_gradient*>(g);
708734
return to_c(rg->radius);
709735
}
710736

711737
int lh_radial_gradient_color_points_count(const lh_radial_gradient_t* g)
712738
{
739+
if (!g) return 0;
713740
const auto* rg = reinterpret_cast<
714741
const litehtml::background_layer::radial_gradient*>(g);
715742
return static_cast<int>(rg->color_points.size());
@@ -718,6 +745,7 @@ int lh_radial_gradient_color_points_count(const lh_radial_gradient_t* g)
718745
float lh_radial_gradient_color_point_offset(const lh_radial_gradient_t* g,
719746
int idx)
720747
{
748+
if (!g) return 0.0f;
721749
const auto* rg = reinterpret_cast<
722750
const litehtml::background_layer::radial_gradient*>(g);
723751
if (idx < 0 || idx >= static_cast<int>(rg->color_points.size()))
@@ -728,6 +756,7 @@ float lh_radial_gradient_color_point_offset(const lh_radial_gradient_t* g,
728756
lh_web_color_t lh_radial_gradient_color_point_color(
729757
const lh_radial_gradient_t* g, int idx)
730758
{
759+
if (!g) return {};
731760
const auto* rg = reinterpret_cast<
732761
const litehtml::background_layer::radial_gradient*>(g);
733762
if (idx < 0 || idx >= static_cast<int>(rg->color_points.size()))
@@ -744,20 +773,23 @@ lh_web_color_t lh_radial_gradient_color_point_color(
744773

745774
lh_point_t lh_conic_gradient_position(const lh_conic_gradient_t* g)
746775
{
776+
if (!g) return {};
747777
const auto* cg = reinterpret_cast<
748778
const litehtml::background_layer::conic_gradient*>(g);
749779
return to_c(cg->position);
750780
}
751781

752782
float lh_conic_gradient_angle(const lh_conic_gradient_t* g)
753783
{
784+
if (!g) return 0.0f;
754785
const auto* cg = reinterpret_cast<
755786
const litehtml::background_layer::conic_gradient*>(g);
756787
return cg->angle;
757788
}
758789

759790
int lh_conic_gradient_color_points_count(const lh_conic_gradient_t* g)
760791
{
792+
if (!g) return 0;
761793
const auto* cg = reinterpret_cast<
762794
const litehtml::background_layer::conic_gradient*>(g);
763795
return static_cast<int>(cg->color_points.size());
@@ -766,6 +798,7 @@ int lh_conic_gradient_color_points_count(const lh_conic_gradient_t* g)
766798
float lh_conic_gradient_color_point_offset(const lh_conic_gradient_t* g,
767799
int idx)
768800
{
801+
if (!g) return 0.0f;
769802
const auto* cg = reinterpret_cast<
770803
const litehtml::background_layer::conic_gradient*>(g);
771804
if (idx < 0 || idx >= static_cast<int>(cg->color_points.size()))
@@ -776,6 +809,7 @@ float lh_conic_gradient_color_point_offset(const lh_conic_gradient_t* g,
776809
lh_web_color_t lh_conic_gradient_color_point_color(
777810
const lh_conic_gradient_t* g, int idx)
778811
{
812+
if (!g) return {};
779813
const auto* cg = reinterpret_cast<
780814
const litehtml::background_layer::conic_gradient*>(g);
781815
if (idx < 0 || idx >= static_cast<int>(cg->color_points.size()))

litehtml/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "litehtml"
33
version = "0.1.0"
44
edition = "2021"
5-
license = "MIT AND BSD-3-Clause AND Apache-2.0"
5+
license = "MIT"
66
authors = ["Franz Geffke <mail@gofranz.com>"]
77
description = "Safe Rust bindings for litehtml — a lightweight HTML/CSS rendering engine"
88
repository = "https://github.com/franzos/litehtml-rs"
@@ -18,6 +18,7 @@ email = ["encoding_rs", "base64"]
1818

1919
[dependencies]
2020
litehtml-sys = { path = "../litehtml-sys", version = "0.1.0", default-features = false }
21+
log = "0.4"
2122
tiny-skia = { version = "0.11", optional = true }
2223
cosmic-text = { version = "0.14", optional = true }
2324
image = { version = "0.25", optional = true, default-features = false, features = ["png", "jpeg", "gif"] }

0 commit comments

Comments
 (0)