Enable opening of downloaded fonts only in ForKit in Online
We want that only the ForKit process needs to have access to new font
files added to a Collabora Online instance dynamically by downloading
from a server. There are however many locations in the Kit process, in
core and in external libraries like harfbuzz, where the code wants to
open a font file.
Handle this so that the ForKit process opens such a downloaded font
file and doesn't close it. The file descriptor is thus inherited by
Kit processes. The font file pathname passed on to other code is a
fake on in the format "/:FD:/%d" where the %d is the file descriptor
of the opened font file. Add checks in all places where font files are
opened, look for this special pathname format, and modify the code to
just dup() the already open file descriptor in that case.
All this is relevant for Linux only, as Collabora Online runs on
Linux.
Do the above for harfbuzz, cairo, fontconfig, and freetype.
In addition make sure that these libraries (except harfbuzz which
needs to be a static library and freetype) when bundled, on Linux, are
built as shared libraries, and won't be confused with the
corresponding system libraries by making sure their sonames are
different.
Change-Id: Ib059cb27e1637d07bb709249abd0d984f948caa9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140714
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Tor Lillqvist <tml@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146341
Tested-by: Jenkins
2022-09-20 08:07:14 -05:00
|
|
|
# -*- Mode: Diff -*-
|
|
|
|
--- src/base/ftsystem.c
|
|
|
|
+++ src/base/ftsystem.c
|
2023-02-10 03:15:21 -06:00
|
|
|
@@ -24,6 +24,7 @@
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
+#include <unistd.h>
|
|
|
|
|
|
|
|
#include <ft2build.h>
|
|
|
|
#include FT_CONFIG_CONFIG_H
|
2023-02-21 05:14:33 -06:00
|
|
|
@@ -238,6 +239,8 @@
|
Enable opening of downloaded fonts only in ForKit in Online
We want that only the ForKit process needs to have access to new font
files added to a Collabora Online instance dynamically by downloading
from a server. There are however many locations in the Kit process, in
core and in external libraries like harfbuzz, where the code wants to
open a font file.
Handle this so that the ForKit process opens such a downloaded font
file and doesn't close it. The file descriptor is thus inherited by
Kit processes. The font file pathname passed on to other code is a
fake on in the format "/:FD:/%d" where the %d is the file descriptor
of the opened font file. Add checks in all places where font files are
opened, look for this special pathname format, and modify the code to
just dup() the already open file descriptor in that case.
All this is relevant for Linux only, as Collabora Online runs on
Linux.
Do the above for harfbuzz, cairo, fontconfig, and freetype.
In addition make sure that these libraries (except harfbuzz which
needs to be a static library and freetype) when bundled, on Linux, are
built as shared libraries, and won't be confused with the
corresponding system libraries by making sure their sonames are
different.
Change-Id: Ib059cb27e1637d07bb709249abd0d984f948caa9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140714
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Tor Lillqvist <tml@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146341
Tested-by: Jenkins
2022-09-20 08:07:14 -05:00
|
|
|
const char* filepathname )
|
|
|
|
{
|
|
|
|
FT_FILE* file;
|
|
|
|
+ int nFD;
|
|
|
|
+ int n;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !stream )
|
2023-02-21 05:14:33 -06:00
|
|
|
@@ -250,7 +253,13 @@
|
Enable opening of downloaded fonts only in ForKit in Online
We want that only the ForKit process needs to have access to new font
files added to a Collabora Online instance dynamically by downloading
from a server. There are however many locations in the Kit process, in
core and in external libraries like harfbuzz, where the code wants to
open a font file.
Handle this so that the ForKit process opens such a downloaded font
file and doesn't close it. The file descriptor is thus inherited by
Kit processes. The font file pathname passed on to other code is a
fake on in the format "/:FD:/%d" where the %d is the file descriptor
of the opened font file. Add checks in all places where font files are
opened, look for this special pathname format, and modify the code to
just dup() the already open file descriptor in that case.
All this is relevant for Linux only, as Collabora Online runs on
Linux.
Do the above for harfbuzz, cairo, fontconfig, and freetype.
In addition make sure that these libraries (except harfbuzz which
needs to be a static library and freetype) when bundled, on Linux, are
built as shared libraries, and won't be confused with the
corresponding system libraries by making sure their sonames are
different.
Change-Id: Ib059cb27e1637d07bb709249abd0d984f948caa9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140714
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Tor Lillqvist <tml@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146341
Tested-by: Jenkins
2022-09-20 08:07:14 -05:00
|
|
|
stream->read = NULL;
|
|
|
|
stream->close = NULL;
|
|
|
|
|
|
|
|
- file = ft_fopen( filepathname, "rb" );
|
|
|
|
+ if ( sscanf( filepathname, "/:FD:/%d%n", &nFD, &n ) == 1 && filepathname[n] == '\0')
|
|
|
|
+ {
|
|
|
|
+ lseek( nFD, 0, SEEK_SET );
|
|
|
|
+ file = fdopen( dup( nFD ), "rb" );
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ file = ft_fopen( filepathname, "rb" );
|
|
|
|
if ( !file )
|
|
|
|
{
|
|
|
|
FT_ERROR(( "FT_Stream_Open:"
|
|
|
|
--- builds/unix/ftsystem.c
|
|
|
|
+++ builds/unix/ftsystem.c
|
2023-02-21 05:14:33 -06:00
|
|
|
@@ -249,13 +249,21 @@
|
Enable opening of downloaded fonts only in ForKit in Online
We want that only the ForKit process needs to have access to new font
files added to a Collabora Online instance dynamically by downloading
from a server. There are however many locations in the Kit process, in
core and in external libraries like harfbuzz, where the code wants to
open a font file.
Handle this so that the ForKit process opens such a downloaded font
file and doesn't close it. The file descriptor is thus inherited by
Kit processes. The font file pathname passed on to other code is a
fake on in the format "/:FD:/%d" where the %d is the file descriptor
of the opened font file. Add checks in all places where font files are
opened, look for this special pathname format, and modify the code to
just dup() the already open file descriptor in that case.
All this is relevant for Linux only, as Collabora Online runs on
Linux.
Do the above for harfbuzz, cairo, fontconfig, and freetype.
In addition make sure that these libraries (except harfbuzz which
needs to be a static library and freetype) when bundled, on Linux, are
built as shared libraries, and won't be confused with the
corresponding system libraries by making sure their sonames are
different.
Change-Id: Ib059cb27e1637d07bb709249abd0d984f948caa9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140714
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Tor Lillqvist <tml@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146341
Tested-by: Jenkins
2022-09-20 08:07:14 -05:00
|
|
|
{
|
|
|
|
int file;
|
|
|
|
struct stat stat_buf;
|
|
|
|
+ int nFD;
|
|
|
|
+ int n;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !stream )
|
|
|
|
return FT_THROW( Invalid_Stream_Handle );
|
|
|
|
|
|
|
|
/* open the file */
|
|
|
|
- file = open( filepathname, O_RDONLY );
|
|
|
|
+ if ( sscanf( filepathname, "/:FD:/%d%n", &nFD, &n ) == 1 && filepathname[n] == '\0')
|
|
|
|
+ {
|
|
|
|
+ lseek( nFD, 0, SEEK_SET );
|
|
|
|
+ file = dup( nFD );
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ file = open( filepathname, O_RDONLY );
|
|
|
|
if ( file < 0 )
|
|
|
|
{
|
|
|
|
FT_ERROR(( "FT_Stream_Open:" ));
|