Skip to content
Permalink
Browse files Browse the repository at this point in the history
Merge branch 'no-xrefs-in-paint-servers'
  • Loading branch information
federicomenaquintero committed Dec 5, 2017
2 parents 75c1080 + 5fc44d9 commit c6ddf2e
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 96 deletions.
15 changes: 13 additions & 2 deletions rsvg-base-file-util.c
Expand Up @@ -87,11 +87,22 @@ rsvg_handle_new_from_file (const gchar * file_name, GError ** error)
char *data;
gsize data_len;
RsvgHandle *handle = NULL;
GFile *file;

rsvg_return_val_if_fail (file_name != NULL, NULL, error);

base_uri = rsvg_get_base_uri_from_filename (file_name);
data = _rsvg_io_acquire_data (file_name, base_uri, NULL, &data_len, NULL, error);
file = g_file_new_for_path (file_name);
base_uri = g_file_get_uri (file);
if (!base_uri) {
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_FAILED,
_("Cannot obtain URI from '%s'"), file_name);
g_object_unref (file);
return NULL;
}

data = _rsvg_io_acquire_data (base_uri, base_uri, NULL, &data_len, NULL, error);

if (data) {
handle = rsvg_handle_new ();
Expand Down
36 changes: 19 additions & 17 deletions rsvg-base.c
Expand Up @@ -1206,14 +1206,13 @@ rsvg_path_is_uri (char const *path)
return (p[0] == ':' && p[1] == '/' && p[2] == '/');
}

gchar *
static gchar *
rsvg_get_base_uri_from_filename (const gchar * filename)
{
gchar *current_dir;
gchar *absolute_filename;
gchar *base_uri;


if (g_path_is_absolute (filename))
return g_filename_to_uri (filename, NULL, NULL);

Expand Down Expand Up @@ -2665,16 +2664,17 @@ rsvg_return_if_fail_warning (const char *pretty_function, const char *expression
g_set_error (error, RSVG_ERROR, 0, _("%s: assertion `%s' failed"), pretty_function, expression);
}

static gboolean
_rsvg_handle_allow_load (RsvgHandle *handle,
const char *uri,
GError **error)
gboolean
rsvg_allow_load (GFile *base_gfile,
const char *uri,
GError **error)
{
RsvgHandlePrivate *priv = handle->priv;
GFile *base;
char *path, *dir;
char *scheme = NULL, *cpath = NULL, *cdir = NULL;

g_assert (error == NULL || *error == NULL);

scheme = g_uri_parse_scheme (uri);

/* Not a valid URI */
Expand All @@ -2686,11 +2686,11 @@ _rsvg_handle_allow_load (RsvgHandle *handle,
goto allow;

/* No base to compare to? */
if (priv->base_gfile == NULL)
if (base_gfile == NULL)
goto deny;

/* Deny loads from differing URI schemes */
if (!g_file_has_uri_scheme (priv->base_gfile, scheme))
if (!g_file_has_uri_scheme (base_gfile, scheme))
goto deny;

/* resource: is allowed to load anything from other resources */
Expand All @@ -2701,7 +2701,7 @@ _rsvg_handle_allow_load (RsvgHandle *handle,
if (!g_str_equal (scheme, "file"))
goto deny;

base = g_file_get_parent (priv->base_gfile);
base = g_file_get_parent (base_gfile);
if (base == NULL)
goto deny;

Expand Down Expand Up @@ -2746,9 +2746,9 @@ _rsvg_handle_allow_load (RsvgHandle *handle,
return FALSE;
}

static char *
_rsvg_handle_resolve_uri (RsvgHandle *handle,
const char *uri)
char *
rsvg_handle_resolve_uri (RsvgHandle *handle,
const char *uri)
{
RsvgHandlePrivate *priv = handle->priv;
char *scheme, *resolved_uri;
Expand Down Expand Up @@ -2782,12 +2782,13 @@ _rsvg_handle_acquire_data (RsvgHandle *handle,
gsize *len,
GError **error)
{
RsvgHandlePrivate *priv = handle->priv;
char *uri;
char *data;

uri = _rsvg_handle_resolve_uri (handle, url);
uri = rsvg_handle_resolve_uri (handle, url);

if (_rsvg_handle_allow_load (handle, uri, error)) {
if (rsvg_allow_load (priv->base_gfile, uri, error)) {
data = _rsvg_io_acquire_data (uri,
rsvg_handle_get_base_uri (handle),
content_type,
Expand All @@ -2808,12 +2809,13 @@ _rsvg_handle_acquire_stream (RsvgHandle *handle,
char **content_type,
GError **error)
{
RsvgHandlePrivate *priv = handle->priv;
char *uri;
GInputStream *stream;

uri = _rsvg_handle_resolve_uri (handle, url);
uri = rsvg_handle_resolve_uri (handle, url);

if (_rsvg_handle_allow_load (handle, uri, error)) {
if (rsvg_allow_load (priv->base_gfile, uri, error)) {
stream = _rsvg_io_acquire_stream (uri,
rsvg_handle_get_base_uri (handle),
content_type,
Expand Down
54 changes: 26 additions & 28 deletions rsvg-defs.c
Expand Up @@ -50,52 +50,50 @@ rsvg_defs_new (RsvgHandle *handle)
return result;
}

static int
rsvg_defs_load_extern (const RsvgDefs * defs, const char *name)
static RsvgHandle *
rsvg_defs_load_extern (const RsvgDefs * defs, const char *uri)
{
RsvgHandle *handle;
gchar *filename, *base_uri;
RsvgHandle *handle = NULL;
char *data;
gsize data_len;
gboolean rv;

filename = _rsvg_io_get_file_path (name, rsvg_handle_get_base_uri (defs->ctx));

data = _rsvg_handle_acquire_data (defs->ctx, name, NULL, &data_len, NULL);
data = _rsvg_handle_acquire_data (defs->ctx, uri, NULL, &data_len, NULL);

if (data) {
handle = rsvg_handle_new ();

base_uri = rsvg_get_base_uri_from_filename (filename);
rsvg_handle_set_base_uri (handle, base_uri);
g_free (base_uri);

rv = rsvg_handle_write (handle, (guchar *) data, data_len, NULL);
rv = rsvg_handle_close (handle, NULL) && rv;
if (rv) {
g_hash_table_insert (defs->externs, g_strdup (name), handle);
rsvg_handle_set_base_uri (handle, uri);

if (rsvg_handle_write (handle, (guchar *) data, data_len, NULL)
&& rsvg_handle_close (handle, NULL)) {
g_hash_table_insert (defs->externs, g_strdup (uri), handle);
} else {
g_object_unref (handle);
handle = NULL;
}

g_free (data);
}

g_free (filename);
return 0;
return handle;
}

static RsvgNode *
rsvg_defs_extern_lookup (const RsvgDefs * defs, const char *filename, const char *name)
rsvg_defs_extern_lookup (const RsvgDefs * defs, const char *possibly_relative_uri, const char *name)
{
RsvgHandle *file;
file = (RsvgHandle *) g_hash_table_lookup (defs->externs, filename);
if (file == NULL) {
if (rsvg_defs_load_extern (defs, filename))
return NULL;
file = (RsvgHandle *) g_hash_table_lookup (defs->externs, filename);
RsvgHandle *handle;
char *uri;

uri = rsvg_handle_resolve_uri (defs->ctx, possibly_relative_uri);
if (!uri)
return NULL;

handle = (RsvgHandle *) g_hash_table_lookup (defs->externs, uri);
if (handle == NULL) {
handle = rsvg_defs_load_extern (defs, uri);
}

if (file != NULL)
return g_hash_table_lookup (file->priv->defs->hash, name);
if (handle != NULL)
return g_hash_table_lookup (handle->priv->defs->hash, name);
else
return NULL;
}
Expand Down
63 changes: 20 additions & 43 deletions rsvg-io.c
@@ -1,3 +1,4 @@
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2000 Eazel, Inc.
Copyright (C) 2002, 2003, 2004, 2005 Dom Lachowicz <cinamod@hotmail.com>
Expand Down Expand Up @@ -66,11 +67,10 @@ uri_decoded_copy (const char *part,
#define BASE64_INDICATOR_LEN (sizeof (";base64") - 1)

static char *
rsvg_acquire_data_data (const char *uri,
const char *base_uri,
char **out_mime_type,
gsize *out_len,
GError **error)
rsvg_decode_data_uri (const char *uri,
char **out_mime_type,
gsize *out_len,
GError **error)
{
const char *comma, *start, *end;
char *mime_type;
Expand Down Expand Up @@ -124,56 +124,32 @@ rsvg_acquire_data_data (const char *uri,
return data;
}

gchar *
_rsvg_io_get_file_path (const gchar * filename,
const gchar * base_uri)
{
gchar *absolute_filename;

if (g_file_test (filename, G_FILE_TEST_EXISTS) || g_path_is_absolute (filename)) {
absolute_filename = g_strdup (filename);
} else {
gchar *tmpcdir;
gchar *base_filename;

if (base_uri) {
base_filename = g_filename_from_uri (base_uri, NULL, NULL);
if (base_filename != NULL) {
tmpcdir = g_path_get_dirname (base_filename);
g_free (base_filename);
} else
return NULL;
} else
tmpcdir = g_get_current_dir ();

absolute_filename = g_build_filename (tmpcdir, filename, NULL);
g_free (tmpcdir);
}

return absolute_filename;
}

static char *
rsvg_acquire_file_data (const char *filename,
const char *base_uri,
rsvg_acquire_file_data (const char *uri,
char **out_mime_type,
gsize *out_len,
GCancellable *cancellable,
GError **error)
{
GFile *file;
gchar *path, *data;
gsize len;
char *content_type;

rsvg_return_val_if_fail (filename != NULL, NULL, error);
rsvg_return_val_if_fail (uri != NULL, NULL, error);
g_assert (out_len != NULL);

path = _rsvg_io_get_file_path (filename, base_uri);
if (path == NULL)
file = g_file_new_for_uri (uri);
path = g_file_get_path (file);

if (path == NULL) {
g_object_unref (file);
return NULL;
}

if (!g_file_get_contents (path, &data, &len, error)) {
g_free (path);
g_object_unref (file);
return NULL;
}

Expand All @@ -184,6 +160,7 @@ rsvg_acquire_file_data (const char *filename,
}

g_free (path);
g_object_unref (file);

*out_len = len;
return data;
Expand Down Expand Up @@ -313,9 +290,9 @@ _rsvg_io_acquire_data (const char *href,
len = &llen;

if (strncmp (href, "data:", 5) == 0)
return rsvg_acquire_data_data (href, NULL, mime_type, len, error);
return rsvg_decode_data_uri (href, mime_type, len, error);

if ((data = rsvg_acquire_file_data (href, base_uri, mime_type, len, cancellable, NULL)))
if ((data = rsvg_acquire_file_data (href, mime_type, len, cancellable, NULL)))
return data;

if ((data = rsvg_acquire_gvfs_data (href, base_uri, mime_type, len, cancellable, error)))
Expand All @@ -342,13 +319,13 @@ _rsvg_io_acquire_stream (const char *href,
}

if (strncmp (href, "data:", 5) == 0) {
if (!(data = rsvg_acquire_data_data (href, NULL, mime_type, &len, error)))
if (!(data = rsvg_decode_data_uri (href, mime_type, &len, error)))
return NULL;

return g_memory_input_stream_new_from_data (data, len, (GDestroyNotify) g_free);
}

if ((data = rsvg_acquire_file_data (href, base_uri, mime_type, &len, cancellable, NULL)))
if ((data = rsvg_acquire_file_data (href, mime_type, &len, cancellable, NULL)))
return g_memory_input_stream_new_from_data (data, len, (GDestroyNotify) g_free);

if ((stream = rsvg_acquire_gvfs_stream (href, base_uri, mime_type, cancellable, error)))
Expand Down
4 changes: 0 additions & 4 deletions rsvg-io.h
Expand Up @@ -26,10 +26,6 @@
#include <glib.h>
#include <gio/gio.h>

G_GNUC_INTERNAL
gchar *_rsvg_io_get_file_path (const gchar *filename,
const gchar *basedir);

char *_rsvg_io_acquire_data (const char *uri,
const char *base_uri,
char **mime_type,
Expand Down
11 changes: 9 additions & 2 deletions rsvg-private.h
Expand Up @@ -451,8 +451,6 @@ GdkPixbuf *rsvg_pixbuf_from_data_with_size_data (const guchar * buff,
const char *base_uri, GError ** error);
G_GNUC_INTERNAL
gboolean rsvg_eval_switch_attributes (RsvgPropertyBag * atts, gboolean * p_has_cond);
G_GNUC_INTERNAL
gchar *rsvg_get_base_uri_from_filename (const gchar * file_name);

G_GNUC_INTERNAL
void rsvg_pop_discrete_layer (RsvgDrawingCtx * ctx);
Expand Down Expand Up @@ -561,6 +559,15 @@ G_GNUC_INTERNAL
void rsvg_return_if_fail_warning (const char *pretty_function,
const char *expression, GError ** error);

G_GNUC_INTERNAL
char *rsvg_handle_resolve_uri (RsvgHandle *handle,
const char *uri);

G_GNUC_INTERNAL
gboolean rsvg_allow_load (GFile *base_gfile,
const char *uri,
GError **error);

G_GNUC_INTERNAL
char *_rsvg_handle_acquire_data (RsvgHandle *handle,
const char *uri,
Expand Down

0 comments on commit c6ddf2e

Please sign in to comment.