Commit Graph

1334 Commits

Author SHA1 Message Date
Akira TAGOH fc0e9a78d2 Real fix of 91114d18c
The change in 91114d18c broke remapping font paths.

Patch from Mattias Clasen

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/331
2022-09-28 21:39:09 +09:00
Taylor R Campbell 7dfde9b736 Avoid misuse of ctype(3)
The ctype(3) functions take arguments of type int that are either

(a) EOF, or
(b) unsigned char values, {0, 1, 2, ..., 255} if char is 8-bit.

Passing values of type char, on platforms where it is signed, can go
wrong -- negative values may be confused with EOF (typically -1) or
may lead to undefined behaviour ranging in practice from returning
garbage data (possibly out of an adjacent buffer in memory that may
contain secrets) to crashing with SIGSEGV (if the page preceding the
ctype table is unmapped).

The ctype(3) functions can't themselves convert to unsigned char
because then they would give the wrong answers for EOF, for use with
functions like getchar and fgetc; the user has to cast char to
unsigned char.
2022-04-11 12:27:04 +00:00
Akira TAGOH 875878efb7 Fix possible memory leaks in FcPatternObjectAddWithBinding
Reported by Ruth Ivimey-Cook

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/302
2022-01-31 19:03:29 +09:00
Francesco Pretto 16bbb5340b WIN32: Fix pGetSystemWindowsDirectory found initialized during FcConfigParseAndLoadFromMemory
Trying to early loading a custom fonts.xml created on the
fly results in the pGetSystemWindowsDirectory function
pointer being found intialized. Normally the initialization
is performed in the default configuration loading.
The commit factorizes the lazy initialization of both
WIN32 getters (together with pSHGetFolderPathA) in a
function and call it when actually needed.
2022-01-31 07:52:09 +00:00
Akira TAGOH 55eb1ef89b Add an user font directory for Win32 to the default font path
Patch from @takase1121

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/144
2022-01-17 16:19:22 +09:00
Akira TAGOH 4238402f1c Initialize variable 2021-12-09 20:29:06 +09:00
Akira TAGOH 3196e1815e Apply the change made by 23e46d1 again
Regression by d62d984e2b
2021-12-09 20:28:16 +09:00
Akira TAGOH 92fbf14b0d Fix the issue fail to obtain the style name
The number of a couple of 'family' and 'familylang' and 'style' and 'stylelang'
is different. need to reset the counter to get the property regarding to regarding to the lang.

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/303
2021-12-09 20:26:10 +09:00
Ben Wagner ce00010b1f Actually skip leading spaces in style name
Because the loop body is just 'break' the loop never loops and at most
one leading space is skipped. Remove the body to allow the loop to
continue. Found with ClangTidy.
2021-12-06 16:55:12 -05:00
Ben Wagner 8d3425b8b8 Back FcSerialize with open addressing hash table.
Instead of fixed number of buckets with chaining use an open addressing
hash table with linear probing, max load factor 0.75, and a power of two
number of buckets.
2021-11-16 15:48:56 -05:00
Ryan Gonzalez be453bd159 Ensure config.h is always included before stdlib headers
In particular, if an stdlib header goes first, it includes features.h
which only checks _FILE_OFFSET_BITS *once*, meaning that these files end
up compiled *without* _FILE_OFFSET_BITS taking effect, which affects
fcxml's operations in listing directories.

Signed-off-by: Ryan Gonzalez <ryan.gonzalez@collabora.com>
2021-11-10 19:41:50 -06:00
Akira TAGOH 5841bd012d Fix some testcase fails for 14c265a1
Add an extra code to ignore an error of FT_Get_MM_Var()
only when FT_MM_Var variable isn't used in any case.
2021-11-09 20:42:52 +09:00
Behdad Esfahbod 14c265a10a If a varfont has 'opsz' axis, set FC_SIZE on default instant pattern
Otherwise default-instance pattern would match as an "all sizes",
which would be wrong. See:

https://gitlab.gnome.org/GNOME/pango/-/issues/621#note_1305844
2021-11-09 20:04:52 +09:00
Ben Wagner a204489885 Fix warning about os2->achVendID cannot be NULL
FreeType's TT_OS2::achVendID is a FT_Char[4] array and not a pointer,
so it does not need to be checked for NULL.
2021-10-28 16:17:48 -04:00
Akira TAGOH 1d76699927 Resolves symlinks against <dir prefix="relative">
When a config file is symlinked and obtaining an relative path from it for <dir>,
it behaved like:

$ realpath /path/to/foo.conf
/path/to/realpath/foo.conf
$ FONTCONFIG_FILE=/path/to/foo.conf fc-cache -v
Font directories:
        /path/to/fonts
/path/to/fonts: skipping, existing cache is valid: 1 fonts, 0 dirs
/path/to/cachedir: cleaning cache directory
fc-cache: succeeded

And after this change:

$ FONTCONFIG_FILE=/path/to/foo.conf fc-cache -v
Font directories:
        /path/to/relpath/fonts
/path/to/realpath/fonts: skipping, existing cache is valid: 1 fonts, 0 dirs
/path/to/cachedir: cleaning cache directory
fc-cache: succeeded

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/290
2021-10-11 18:43:12 +09:00
Akira TAGOH 2d17232a45 Fix score estimation for postscriptname
Before this fix:
$ fc-match :postscriptname=LiberationSans
LiberationSansNarrow.ttf: "Liberation Sans Narrow" "Regular"

After this fix:
$ fc-match :postscriptname=LiberationSans
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"

See https://bugzilla.redhat.com/show_bug.cgi?id=1946871
2021-10-08 18:30:09 +09:00
Ben Wagner efc71a3c13 Free local FcCache lock on contention
If two threads attempt to create the FcCache lock in lock_cache at the
same time, both threads may create and initialize a local FcMutex. One
thread will atomically make cache_lock point to its FcMutex. The other
thread currently calls FcMutexFinish on the local lock, but does not
free it. Change this behavior to free the unused lock.

Found with test/test-pthread on an LeakSanitizer enabled build.
2021-09-06 03:20:31 +00:00
Ben Wagner 6e68763085 Add memory order constraints to C11 atomics
Reduce the strength of the C11 atomics from memory_order_seq_cst to the
actually required memory order constraints for each operation. In
addition to reflecting the already documented memory order constraints,
this should allow for better code generation.
2021-08-31 12:38:50 -04:00
Akira TAGOH 57032f489b Fix a memory leak when trying to open a non-existing file
https://bugzilla.redhat.com/show_bug.cgi?id=1914716
2021-08-25 15:52:53 +09:00
Akira TAGOH c7891755cb Reflect matching results to binding in FcPattern
This change allows applications to see what property was matched perfectly
and help to filter out for their needs.

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/294
2021-08-24 19:32:09 +09:00
Alex Richardson 92ed966b74 FcCharSetPutLeaf(): Fix missing move of new_leaves contents
If the `realloc(numbers)` call fails, shrinking the leaves allocation
back to the old size is not guaranteed to return the old pointer value.
While this might be the case with some malloc() implementations, realloc()
could also just mark the following area as free.
To make this less error-prone, we grow numbers first and then grow leaves
since the numbers content does not need to be relocated, but leaves does.

See https://bugs.freedesktop.org/show_bug.cgi?id=90867
2021-08-18 10:36:47 +01:00
Alex Richardson 012ffaac75 Add support for C11 stdatomic atomics
This fixes deprecation warnings when building for macOS >= 10.12 systems.
Additionally, using stdatomic.h (or the more modern __atomic_ builtins)
is required when targeting CHERI-enabled architectures such as
CHERI-RISC-V or Arm's Morello since the compiler rejects __sync_* atomic
for pointer types (they only work with integers).
2021-07-20 09:32:52 +01:00
Alex Richardson ab4761ff87 fcint: add casts to allow building with stricter compilers
When targeting CHERI, casts between pointers and integers must use
(u)intptr_t. uintptr_t values contains pointer bounds (and additional
metadata), whereas other integer types do not. This change also adds a
cast to FcOffsetToPtr() to silence a compiler warning that triggers if
the compiler cannot statically infer which side of an arithmetic operation
is the pointer operand and which one is the offset/mask.
2021-07-20 03:31:47 +00:00
Ryan Schmidt 3a7ad1b49f Restore fcatomic compatibility with Mac OS X 10.4.
Reverts the part of 6def66164a that
removed the fc_atomic_ptr_cmpexch compatibility code for systems earlier
than Mac OS X 10.5.

Reverts the part of 447b9ccc7d that moved
the definition of fc_atomic_ptr_get into the Mac OS X > 10.4 block. That
code is still needed on 10.4 and is implemented using functions that are
available on 10.4.

Compare against MAC_OS_X_VERSION_MIN_REQUIRED using a number not a
constant because the constant is not available on earlier SDKs.
2021-07-19 07:17:34 +00:00
Akira TAGOH 4d43f84188 Do not set different score to non-string values
Non-string values in a cache is supposed to choose one from them.
Due to the change of da1c9f7a, there was a regression on scoring for
matching functions.  So reverting the behavior for evaluating non-string
values to the previous one.

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/286
2021-07-08 14:47:36 +09:00
Mehdi Sabwat fd393c53d8 fcstat: add support for wasm-emscripten
fallback to f_type statfs struct field, since f_fstypename is not supported on the platform.
2021-07-06 18:17:32 +02:00
Akira TAGOH da1c9f7a6c Fix score evaluation for multiple values in properties
Sometimes fonts has multiple values in family and sub-family in order to unify
other variants into one. they basically make difference in sub-family though,
they also still have standalone family and sub-family. in that case, sub-family is
likely to be Regular.

fontconfig couldn't recognize the difference between :family=Foo:style=Regular
and :family=Foo Caption:style=Regular for example because fontconfig didn't
give different score on matching result for the position of multiple values in
a cache.
Thus, when querying a font like :family=Foo:style=Regular may results
:family=Foo Caption:style=Regular. (see the test case for more details)

To fix this situation, giving different score according to the position
of multiple values in a cache as well as the position of multiple values
in a query.

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/283
2021-06-28 08:51:58 +00:00
Akira TAGOH d62d984e2b Revert constructing fullname property from family and style properties
This seems making a regression in Java. we will revisit this issue later.

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/277
2021-06-28 17:37:23 +09:00
Albert Astals Cid fd3eebad74 Fix potential memory leak in _get_real_paths_from_prefix 2021-04-10 00:10:20 +02:00
Akira TAGOH 6f27f42e61 Add support for XDG_DATA_DIRS
Add dirs from XDG_DATA_DIRS when <dir prefix="xdg"> appears in fonts.conf

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/271
2021-03-30 15:08:17 +09:00
Tim-Philipp Müller dba3287bf5 meson: fix subproject build regression
commit ae9ac2a1 from !165 introduced a regression when
fontconfig is built as a subproject. In that case we
would fail to correctly construct the path to the root
build dir where the meson-info subdirectory resides,
instead looking for it in the fontconfig subproject
subdir. This would result in
FAILED: subprojects/fontconfig/src/fcobjshash.gperf
errors in the cutout.py script.

Instead use the @BUILD_ROOT@ substitution to get
to the build root which will work correctly in
either scenario.
2021-02-18 11:26:26 +00:00
Ben Wagner ba15d41bdc Fix stack use after scope in FcConfigCompareValue
Discovered by AddressSanitizer. When left_o and right_o are promoted the
promoted values are placed on the stack in FcValuePromotionBuffer.
The FcValuePromotionBuffers must then continue to be in scope while
left_o and right_o point into their content. In 9d4e5d0f the
FcValuePromotionBuffers were moved into the incorrect scope, leaving
left_o and right_o pointing into an object whose lifetime has ended.
This is similar to left and right which appear to have a smaller scope
but are actually required to be in the larger scope.

Correct this by moving the FcValuePromotionBuffers to the proper scope.
Leave the left and right FcValues where they are since they are in the
correct scope already.

This also adds to test-conf the ability to create charset, langset,
range, and matrix in patterns. This allows for a simple test which fails
under AddressSanitizer before this change and passes after.
2021-02-16 11:30:32 -05:00
Tim-Philipp Müller ae9ac2a1bf meson: fix cross-compilation issues with gperf header file preprocessing
Pass c_args to the compiler when preprocessing the gperf header file,
they might contain important bits without which compilation/preprocessing
might fail (e.g. with clang on Android). cc.cmd_array() does not include
the c_args and we can't easily look them up from the meson.build file, so
we have to retrieve from the introspection info.

This is basically the Meson equivalent to commit 57103773.
2021-02-15 12:53:32 +00:00
Szunti 23e46d13c5 Fix stripping whitespace from end of family in FcPatternAddFullname 2021-01-20 16:13:18 +01:00
Tim-Philipp Müller 4b142e9241 meson: error out in script if gperf preprocessing failed 2021-01-15 11:34:43 +00:00
Jacko Dirks b7e4931582 fccfg.c: lock_config: Fix potential memory leak
We would malloc for every try, never cleaning up.
2021-01-13 14:25:59 +01:00
Tim-Philipp Müller 8657c081e9 fcformat: fix compiler warnings with clang on Android
fcformat.c:762:44: warning: expression which evaluates to zero treated as a null pointer constant of type 'FcChar8 *' (aka 'unsigned char *') [-Wnon-literal-null-conversion]
                if (!FcNameUnparseValue (buf, &l->value, '\0'))
                                                         ^~~~
fcformat.c:769:38: warning: expression which evaluates to zero treated as a null pointer constant of type 'FcChar8 *' (aka 'unsigned char *') [-Wnon-literal-null-conversion]
            FcNameUnparseValueList (buf, l, '\0');
                                            ^~~~
2021-01-08 11:39:25 +00:00
Szunti df29933e1a Check qual and compare for family tests
Fixes #267. Hash table lookups assumed qual="any" compare="eq".
Add a test too.
2020-12-17 04:51:20 +00:00
Ben Wagner d55eaa6b31 Fix leaks in fcxml.c, fc-match.c, and tests.
Fix leaks reported by AddressSanitizer when running 'make check'.
2020-12-14 10:54:11 +00:00
Ben Wagner 97d5418554 Remove abort from FcCompareSize.
There doesn't appear to be a good reason to abort when 'v1' has type
FcTypeRange. If there does turn out to be a good reason for this then it
should be better documented and the code for handling this case removed.
At worst it seems -1 should be returned as it is for other unknown
types. It is possible this is left over debug code from the initial
implementation.
2020-12-07 04:21:38 +00:00
Ben Wagner 3d6926380d Skip leading whitespace in style name.
Found by Clang-Tidy. The intent seems to have been to skip all leading
whitespace in the 'style' string, but instead this loop was an odd
looking no-op. Remove the 'break' from the loop so that it will
continue until end of string or a non-space character is found.
2020-12-04 15:05:38 -05:00
Akira TAGOH 93c93689f5 Add back fullname property at scan matching phase
There seems to be a lot of config files using fullname property in the world.
To keep the backward compatibility, fullname property is back to a cache at
the scan matching phase but will be rebuilt once it is done according to family
and style property in the pattern no matter what changes one made in fullname
property during that.

Ref. https://bugzilla.redhat.com/show_bug.cgi?id=1902881
2020-12-04 18:18:03 +09:00
Niklas Guertler bc84228a2e Allow multiple default system font directories in the fallback config, and set them to the default dirs on Darwin. 2020-11-28 01:16:36 +00:00
Chun-wei Fan 89f7bcac08 meson: Don't use .def files for Visual Studio builds
Instead, when building with Visual Studio-style compilers, define 'FcPublic' as
appropriate so that symbols will be exported without the need to maintain a
.def file.
2020-11-19 11:22:29 +08:00
Akira TAGOH 8815641571 Use memcpy instead of strcpy
To work around a warning with GCC10 on Win32

warning: '__builtin___strncpy_chk' specified bound depends on the length of the source argument [-Wstringop-overflow=]
2020-11-02 14:25:01 +09:00
Ben Wagner 447b9ccc7d Fix fc_atomic_ptr_get and use.
Before this change building with ThreadSanitizer and running
test/test-pthread generated a large number of threading issues. These
mostly stemmed from fc_atomic_ptr_get not doing an atomic load and using
"acquire load" instead of "load acquire". After making these changes it
was still necessary to use fc_atomic_ptr_get where it was needed.

This also documents the current memory barrier requirements for the
atomic primitives.
2020-11-02 05:05:24 +00:00
Xavier Claessens abc723366d meson: Fix build failure when compiler is not in PATH
When cross compiling gcc/clang could not exist in PATH and Meson could
be using aarch64-linux-android-clang set in a cross file for example.
2020-10-03 22:07:54 -04:00
Akira TAGOH dc1443ac83 Split up a code again coming from different copyright notice
to show up easier in COPYING.
it was originally merged from separate file by 2e2121f9 though.
2020-09-29 15:37:14 +09:00
Akira TAGOH dbef9d10de Make sure a combination of family and familylang is available 2020-09-21 14:55:21 +09:00
Akira TAGOH 5a291467a7 Add Regular style when no meta data available to guess a style
This makes sure that fullname can be constructed at least even if a style is missing
and "Regular" is omitted for fullname so this change won't affect in that case.

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/259
2020-09-21 14:55:18 +09:00