Commit graph

12790 commits

Author SHA1 Message Date
Emmanuele Bassi
86d7025af5 Merge branch 'wip-fix-352' into 'master'
Avoid assert when drawing arcs with NaN angles

Closes #352

See merge request cairo/cairo!515
2023-09-23 11:10:16 +00:00
Uli Schlachter
ed86d953a6 Merge branch 'leak' into 'master'
Fix font options leak in _cairo_gstate_ensure_scaled_font()

See merge request cairo/cairo!514
2023-09-20 14:28:47 +00:00
Tim Serong
09643ee1ab Avoid assert when drawing arcs with NaN angles
I hit the problem with _cairo_arc_in_direction() failing the
angle_max >= angle_min assertion earlier this year when using
Thunderbird on openSUSE Tumbleweed.  Thunderbird would crash
when rendering some (but not all) HTML email due to this
assert.  For some reason, one of the angles passed in was
NaN.  Making _cairo_arc_in_direction() return immediately if
either angle is not finite fixed the problem for me, but I
don't know enough about the internals of Cairo to know if
this is, strictly speaking, the "right" fix.  Also, having
tested again today _without_ this change applied, I am now
no longer able to reproduce the problem :-/  I still have the
same version of Cairo installed (1.17.8), but various other
packages on that system have been updated in the meantime,
so maybe that's a factor.  Or maybe I'm just lucky and
haven't hit a "bad" HTML email this time...?

Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/352
Signed-off-by: Tim Serong <tserong@suse.com>
2023-09-19 18:26:39 +10:00
Christian Hesse
e364946957 Fix font options leak in _cairo_gstate_ensure_scaled_font()
Font options are allocated in _cairo_gstate_ensure_scaled_font() for local
processing, but never freed. Run _cairo_font_options_fini() on these and
fix the leak.

Signed-off-by: Christian Hesse <mail@eworm.de>
2023-09-18 23:31:23 +02:00
Emmanuele Bassi
c45e373fb4 Merge branch 'font-option-leaks' into 'master'
Fix font options leak in gstate

Closes #795

See merge request cairo/cairo!512
2023-09-18 17:40:52 +00:00
Uli Schlachter
06864022c8 Fix font options leak in cairo script surface
I added options->variations = strdup("slnt=0,wght=400,wdth=100"); to the
end of _cairo_font_options_init_default(). This makes all font option
objects own some memory that needs to be freed. Then I ran some random
test under valgrind and found memory leaks.

This commit makes the script surface finish the font options that it
contains. This fixes the following valgrind report:

 25 bytes in 1 blocks are definitely lost in loss record 8 of 21
    at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x4ECBC99: strdup (strdup.c:42)
    by 0x4886B7F: _cairo_font_options_init_default (cairo-font-options.c:86)
    by 0x49768F4: _cairo_script_implicit_context_init (cairo-script-surface.c:3676)
    by 0x4976B22: _cairo_script_surface_create_internal (cairo-script-surface.c:3733)
    by 0x4976EA1: cairo_script_surface_create (cairo-script-surface.c:3962)
    by 0x1B0A97: _cairo_boilerplate_script_create_surface (cairo-boilerplate-script.c:63)
    by 0x129B7F: cairo_test_for_target (cairo-test.c:824)
    by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545)
    by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258)
    by 0x12DEB5: main (cairo-test-runner.c:962)

Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-17 10:00:51 +02:00
Uli Schlachter
29087868cd Fix font options leak in _cairo_surface_copy_similar_properties()
I added options->variations = strdup("slnt=0,wght=400,wdth=100"); to the
end of _cairo_font_options_init_default(). This makes all font option
objects own some memory that needs to be freed. Then I ran some random
test under valgrind and found memory leaks.

_cairo_surface_copy_similar_properties() gets the font options of a
surface via cairo_surface_get_font_options(). This creates a copy of the
font variations that I added above. _cairo_surface_set_font_options()
then copies this again (it calls _cairo_font_options_init_copy). Thus,
the original copy is still owned by
_cairo_surface_copy_similar_properties() and needs to be freed.

This commit fixes four leaks in "valgrind --leak-check=full
./cairo-test-suite -f leaks-set-scaled-font". A random example is:

 25 bytes in 1 blocks are definitely lost in loss record 4 of 25
    at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x4ECBC99: strdup (strdup.c:42)
    by 0x4886C0C: _cairo_font_options_init_copy (cairo-font-options.c:99)
    by 0x48F1DDE: cairo_surface_get_font_options (cairo-surface.c:1620)
    by 0x48F0691: _cairo_surface_copy_similar_properties (cairo-surface.c:454)
    by 0x48F087C: cairo_surface_create_similar (cairo-surface.c:528)
    by 0x1B168A: _cairo_boilerplate_pdf_create_surface (cairo-boilerplate-pdf.c:92)
    by 0x129B7F: cairo_test_for_target (cairo-test.c:824)
    by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545)
    by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258)
    by 0x12DEB5: main (cairo-test-runner.c:962)

Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-17 09:51:51 +02:00
Uli Schlachter
4c1987b0f0 Fix font options leak in cairo-surface.c
When calling cairo_surface_get_font_options(), a font options instance
is allocated for the surface. Normally, this just initialised some
otherwise uninitialised fields in cairo_surface_t. Since commit
67eeed44, cairo_font_options_t can contain an extra allocation for a
custom palette. Since commit edf9497c3a, cairo_font_options_t can
contain an extra allocation for a string. Before these commit, font
options could just be dropped, but now they need to be freed.

This commit makes cairo_surface_destroy() finish the contained font
options if they were initialised.

I didn't manage to produce a self-contained test case for this leak. I
found it by just looking at the code. However, I found a way to force a
leak: By adding options->variations=strdtup("slnt=0,wght=400,wdth=100");
to the end of _cairo_font_options_init_default(), all font option
instances now cause a leak unless they are finished. With this extra
change, this commit fixes a memory leak that is simply caused by calling
cairo_surface_get_font_options().

Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-17 09:45:04 +02:00
Uli Schlachter
7bf743a92f Fix font options leak in scaled font
A scaled font contains font options. Since commit 67eeed44, this can
contain an extra allocation for a custom palette. Since commit
edf9497c3a, this contains an extra allocation for a string. Before these
commit, font options could just be dropped, but now they need to be
freed.

This commit makes the relevant code for creating and finishing scaled
fonts also clean up the font options.

The test added in the previous commit also hits this bug (I only found
these leaks accidentially!). Running "valgrind --leak-check=full
./cairo-test-suite -f leaks-set-scaled-font" no longer reports the following
after this change:

 40 bytes in 1 blocks are definitely lost in loss record 1 of 11
    at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x4886C62: _cairo_font_options_init_copy (cairo-font-options.c:105)
    by 0x48DAFFB: _cairo_scaled_font_init_key (cairo-scaled-font.c:675)
    by 0x48DC077: cairo_scaled_font_create (cairo-scaled-font.c:1096)
    by 0x15BF08: leaks_set_scaled_font (leaks.c:43)
    by 0x129EF0: cairo_test_for_target (cairo-test.c:938)
    by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545)
    by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258)
    by 0x12DEB5: main (cairo-test-runner.c:962)

 40 bytes in 1 blocks are definitely lost in loss record 2 of 11
    at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x4886C62: _cairo_font_options_init_copy (cairo-font-options.c:105)
    by 0x49337BB: _cairo_ft_font_face_scaled_font_create (cairo-ft-font.c:2073)
    by 0x48DC340: cairo_scaled_font_create (cairo-scaled-font.c:1176)
    by 0x15BF08: leaks_set_scaled_font (leaks.c:43)
    by 0x129EF0: cairo_test_for_target (cairo-test.c:938)
    by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545)
    by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258)
    by 0x12DEB5: main (cairo-test-runner.c:962)

 40 bytes in 1 blocks are definitely lost in loss record 3 of 11
    at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x4886C62: _cairo_font_options_init_copy (cairo-font-options.c:105)
    by 0x48DB280: _cairo_scaled_font_init (cairo-scaled-font.c:742)
    by 0x4933804: _cairo_ft_font_face_scaled_font_create (cairo-ft-font.c:2076)
    by 0x48DC340: cairo_scaled_font_create (cairo-scaled-font.c:1176)
    by 0x15BF08: leaks_set_scaled_font (leaks.c:43)
    by 0x129EF0: cairo_test_for_target (cairo-test.c:938)
    by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545)
    by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258)
    by 0x12DEB5: main (cairo-test-runner.c:962)

Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-17 09:32:10 +02:00
Uli Schlachter
9529d02f6a Fix font options leak in gstate
cairo_gstate_t contains a cairo_font_options_t. Since commit 67eeed44,
this can contain an extra allocation for a custom palette. Since commit
edf9497c3a, this contains an extra allocation for a string. Before these
commit, font options could just be dropped, but now they need to be
freed.

This commit makes _cairo_gstate_fini() finish the font options to free
the memory allocation.

The new test was run via "valgrind --leak-check=full ./cairo-test-suite
-f leaks-set-scaled-font". The following reported leak goes away thanks
to this commit:

 1,040 bytes in 26 blocks are definitely lost in loss record 6 of 12
    at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
    by 0x4886C62: _cairo_font_options_init_copy (cairo-font-options.c:105)
    by 0x488C029: _cairo_gstate_set_font_options (cairo-gstate.c:1757)
    by 0x48841D7: _cairo_default_context_set_scaled_font (cairo-default-context.c:1310)
    by 0x490809A: cairo_set_scaled_font (cairo.c:3318)
    by 0x15BF1F: leaks_set_scaled_font (leaks.c:45)
    by 0x129EF0: cairo_test_for_target (cairo-test.c:938)
    by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545)
    by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258)
    by 0x12DEB5: main (cairo-test-runner.c:962)

Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/795
Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-17 09:22:29 +02:00
Emmanuele Bassi
7380d3dd7d Merge branch 'sphinx-static' into 'master'
Revert "Allow static builds of cairo-sphinx" and always build fdr.c as a shared library

See merge request cairo/cairo!509
2023-09-06 16:37:25 +00:00
Emmanuele Bassi
3c14ef78ab Merge branch 'ebassi/ci-static-linux-build' into 'master'
ci: Add a static build on Linux

See merge request cairo/cairo!507
2023-09-04 17:27:32 +00:00
Uli Schlachter
61e1c9fd1c Update FDO_DISTRIBUTION_TAG
The previous commit touched the list of packages that are installed in
our build container. This commit changes FDO_DISTRIBUTION_TAG to ensure
the container is rebuild with those changes.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-04 18:17:04 +02:00
Uli Schlachter
4d274aa259 Always build fdr.c into a shared library
The code in fdr.c is meant to interpose function calls, e.g. it defines
a cairo_create() function that records the call and then calls the real
cairo_create() (via dlsym(RTLD_NEXT)).

This obviously does not work in a static library. This was reported in
issue #791. This commit fixes that issue by always building this as a
shared library, even when -Ddefault_library=static is passed to meson.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-03 17:28:21 +02:00
Uli Schlachter
e453962981 Revert "Allow static builds of cairo-sphinx"
This reverts commit dfc15dd2e5.

The code in fdr.c is supposed to interpose function calls into cairo.
I.e., instead of calling cairo_create(), the application would call into
fdr.c, this call would be recorded, and then the call is forwarded to
the real cairo_create().

The commit that is being reverted here just completely broke this by
renaming the functions. Thus, no more interposition would happen.
2023-09-03 17:25:00 +02:00
Adrian Johnson
7a06f65d9b Merge branch 'bobby285271/fix-format-security' into 'master'
Fix building with -Werror=format-security

See merge request cairo/cairo!508
2023-09-02 05:49:05 +00:00
Bobby Rong
50c5f3cc76 Fix building with -Werror=format-security
../src/cairo-pdf-surface.c: In function '_cairo_pdf_surface_open_content_stream':
../src/cairo-pdf-surface.c:2537:45: error: format not a string literal and no format arguments [-Werror=format-security]
 2537 |                                             str);
      |                                             ^~~
cc1: some warnings being treated as errors
2023-09-02 00:46:45 +00:00
Emmanuele Bassi
7e3c764ff3 ci: Remove autotools from the Fedora image
We don't use Autotools any more.
2023-08-28 22:15:11 +01:00
Emmanuele Bassi
3a76936d66 ci: Add a static build on Linux
There are people building Cairo as a static library, so we should verify
that we are not breaking their builds.
2023-08-28 22:07:23 +01:00
Emmanuele Bassi
7645586223 Merge branch 'ebassi/sphinx-static-build' into 'master'
Allow static builds of cairo-sphinx

Closes #791

See merge request cairo/cairo!506
2023-08-23 10:44:27 +00:00
Emmanuele Bassi
dfc15dd2e5 Allow static builds of cairo-sphinx
The Cairo FDR trampoline code overwrites the public Cairo API used by
cairo-sphinx in order to trace the calls; when building cairo-sphinx
against a static build of Cairo, we end up with duplicated symbols.

To avoid that, we can rename the symbols to avoid the conflict, and then
provide the original symbol as a C pre-processor macro.

Fixes: #791
2023-08-22 13:01:14 +01:00
Emmanuele Bassi
42c986fef3 Merge branch 'cairo-tee-checks' into 'master'
tee: Remove questionable terminology

See merge request cairo/cairo!505
2023-08-17 18:59:04 +00:00
Emmanuele Bassi
98e9a40985 build: Enable cairo-sphinx only if we have SysV's SHM
Otherwise the build fails on Android when enabling the tee surface.
2023-08-17 19:18:12 +01:00
Emmanuele Bassi
77cdde124a build: Move 'tee' from disabled to auto
The 'tee' surface is used by Firefox and Thunderbird, so we should at
least have it built automatically, to ensure we catch eventual build
issues.

Tee does not have specific tests, so this does not influence our test
suite.
2023-08-17 17:30:06 +01:00
Emmanuele Bassi
335c713ed7 tee: Remove questionable terminology
The master/slave terms are both inappropriate and inaccurate: the tee
surface replicates the rendering commands from a primary surface to
other surfaces.

This change is a mechanical search-and-replace.
2023-08-17 17:28:56 +01:00
Emmanuele Bassi
1d3d24a48e Merge branch 'no-slim-symbols' into 'master'
Drop "slim" symbols

Closes #582

See merge request cairo/cairo!343
2023-08-17 16:23:27 +00:00
Emmanuele Bassi
eaffbc19d7 Merge branch 'issue-642' into 'master'
docs: Add override for feature symbols

Closes #642

See merge request cairo/cairo!501
2023-08-16 15:35:01 +00:00
Emmanuele Bassi
31fc7233a4 build: Remove unused files
We do not use slim symbols, and all the symbols are hidden by default;
this means we don't need to test those things any more.
2023-08-16 16:33:04 +01:00
Emmanuele Bassi
ba4d5fbd5d Build with hidden symbols by default
We should default on every platform we care about to hidden symbols, to
avoid leaking private symbols.

On Windows this is the default state of affairs with the MSVC toolchain;
with GCC and GCC-compatible toolchains, we need to opt into this
behaviour. Luckily for us, Cairo already has an annotation for public
symbols, so we can easily tweak it to include the visibility attribute.

When building ancillary libraries as part of the Cairo compilation on
Windows, we use a pre-processor symbol to ensure that we keep the
dllexport annotation. This avoids including the cairoint.h header file.

Fixes: #582
2023-08-16 16:33:04 +01:00
Emmanuele Bassi
ff02c2c268 Add surface-to-png in the quartz boilerplate
The cairo-boilerplate static library cannot use private API defined in
the main Cairo shared library, because it has no access to those
symbols.

Since the code is small, we can just dump it into the boilerplate
library.
2023-08-16 16:33:04 +01:00
Emmanuele Bassi
77c2820840 Drop "slim" symbols
The original "slim" symbol rewriting was added without any shred of a
set of performance evaluation, and mostly copy-pasted from a very early
version of pixman. Pixman itself never used them, and most C
libraries—like GLib and GTK—have dropped similar mechanisms over the
past 15 years, as linkers have improved considerably in the meantime.

Modern linkers provide functionality to avoid intra-library PLT jump
through flags like `-Bsymbolic-functions`; we should use that, instead,
and keep the code base more maintainable and debuggable.
2023-08-16 16:33:04 +01:00
Emmanuele Bassi
8dbc2fd5ae Merge branch 'ebassi/drop-autotools-check' into 'master'
build: Drop legacy build

See merge request cairo/cairo!502
2023-08-13 23:00:56 +00:00
Emmanuele Bassi
c68766370d build: Drop legacy build
It's been a while since we dropped the Autotools build; it's time to let
go of the past.
2023-08-13 16:45:24 +01:00
Emmanuele Bassi
8730e185cb docs: Add override for feature symbols
The old Autotools build generated a cairo-supported-features.h file for
the benefit of gtk-doc. These days, with a smaller features set, we can
get away with an override file.

Fixes: #642
2023-08-13 16:41:20 +01:00
Adrian Johnson
542bfac286 Merge branch 'big-endian-swap' into 'master'
Fix FT color glyphs on big endian systems

Closes #787

See merge request cairo/cairo!500
2023-07-30 10:45:38 +00:00
Uli Schlachter
05ba8e9751 Fix FT color glyphs on big endian systems
Andreas Falkenhahn reported the issue below and indicated that the color
channels are swapped. This commit fixes the byte swap.

The problem is that be32_to_cpu() is a no-op on big endian systems.
However, we also have a bswap_32() function available that always works.

Testing done: None by me, but Andreas Falkenhahn reported that his patch
fixes colors on a PowerPC system.

Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/787
Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-07-30 11:15:49 +02:00
Tim-Philipp Müller
00d8d3117d Merge branch 'ci-remove-meson-prefix-from-job-names' into 'master'
ci: remove meson from job names

See merge request cairo/cairo!499
2023-07-29 10:00:57 +00:00
Tim-Philipp Müller
711f71e21d ci: remove meson from job names
Autotools is gone after all, it's all meson now.
2023-07-29 10:17:01 +01:00
Uli Schlachter
89f272e3d9 Merge branch 'master' into 'master'
fix SEGV in cairo_type1_font functioons

See merge request cairo/cairo!497
2023-07-22 06:08:22 +00:00
iasunsea
35da42b681 fix SEGV in cairo_type1_font functioons 2023-07-22 11:58:20 +08:00
Adrian Johnson
0560aa5819 Merge branch 'master' into 'master'
fix read memory access

See merge request cairo/cairo!496
2023-07-20 22:24:05 +00:00
iasunsea
9a2385d412 fix read memory access 2023-07-21 00:46:44 +08:00
Tim-Philipp Müller
48a4466631 Merge branch 'fix-pulling-ft2-and-fc' into 'master'
Don't pull in FreeType and Fontconfig on Windows and Darwin

See merge request cairo/cairo!495
2023-07-20 14:50:07 +00:00
Adrian Johnson
3f732bd3d9 Merge branch 'master' into 'master'
cairo truetype reverse cmap detected memory leaks

See merge request cairo/cairo!494
2023-07-18 21:53:09 +00:00
Adrian Johnson
35a38406f5 Merge branch '5898791338508288' into 'master'
Fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=56152

See merge request cairo/cairo!493
2023-07-18 21:33:01 +00:00
Alex
af83da70f5 Refix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=56152 according to recommendations 2023-07-18 12:04:59 +00:00
Sergey Bugaev
7fe4f00721 Apply 1 suggestion(s) to 1 file(s) 2023-07-17 15:28:32 +00:00
Sergey Bugaev
bcb7937545 Consistently spell "FreeType" with capital T
Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2023-07-17 15:35:40 +03:00
Sergey Bugaev
a3a7ca452f meson: Don't pull in FreeType and Fontconfig by default
Commit f6a3f6d8ad
"Don't build fontconfig on Windows" made an attempt to prevent Meson
from automatically building Fontconfig as a subproject on Windows when
the 'fontconfig' option has its default value of 'auto'.

Unfortunately, this only made things worse instead of fixing them.

Meson feature options can have three states: 'enabled', 'auto', and
'disabled'. They are primarily intended to be used as a value for the
'required' option of the 'dependency()' function. When the system
dependency is not found, but a fallback subproject is provided
explicitly with the 'fallback' option, a feature option in the 'auto'
state still causes the subproject to get built.

Since there's no apparent way to produce a value of the "feature option
object" type in a specific state, commit f6a3f6d8ad instead
set fontconfig_option = false (when it wasn't set to 'enabled', i.e. it
was either 'auto' or 'disabled') in an attempt to disable building the
subproject. However, a boolean value of false is equivalent to 'auto',
not to 'disabled'. This is documented at
https://mesonbuild.com/Build-options.html#features

So commit f6a3f6d8ad wanted to convert
'auto' to 'disabled', but instead effectively converted 'disabled' to
'auto', causing the Fontconfig subproject to be always built on Windows,
even when explicitly turned off with -D fontconfig=disabled.

A way to accomplish the original goal is available since Meson 0.59;
feature option objects gained the '.disable_auto_if()' method that
exactly converts 'auto' to 'disabled' if the boolean condition is true.
So make use of this method to properly turn off building Fontconfig on
Windows, unless explicitly enabled with -D fontconfig=enabled.

Apply the same for FreeType, which is also not very useful on Windows.

See also: 7f8135bfeb

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2023-07-17 15:34:44 +03:00
iasunsea
e2e826b0b1 cairo truetype reverse cmap detected memory leaks 2023-07-14 23:01:14 +08:00