Merged update from upstream sources

This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/libical.git#8ebcb15edf42b64e09a72fe20d0d4bfdf8eefb2b
This commit is contained in:
DistroBaker 2021-01-18 11:48:35 +00:00
parent 5851c3c199
commit a927e4c5d3
4 changed files with 11 additions and 132 deletions

View File

@ -1,110 +0,0 @@
From e5f3df8ab02574d7edcce9ceef4622569edb6f92 Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Thu, 3 Jan 2019 12:53:04 +0100
Subject: [PATCH] Improve thread safety of icaltimezone_load_builtin_timezone()
Even the function does test whether the passed-in zone has set
the component, it doesn't retest it when it acquires the lock, but
other thread could already assign the component, which can cause
use-after-free in certain thread interleaving.
---
src/libical/icaltimezone.c | 6 ++++
src/test/builtin_timezones.c | 54 ++++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+)
diff --git a/src/libical/icaltimezone.c b/src/libical/icaltimezone.c
index 12f6c291..3c4bf14d 100644
--- a/src/libical/icaltimezone.c
+++ b/src/libical/icaltimezone.c
@@ -1806,6 +1806,12 @@ static void icaltimezone_load_builtin_timezone(icaltimezone *zone)
icaltimezone_builtin_lock();
+ /* Try again, maybe it had been set by other thread while waiting for the lock */
+ if (zone->component) {
+ icaltimezone_builtin_unlock();
+ return;
+ }
+
/* If the location isn't set, it isn't a builtin timezone. */
if (!zone->location || !zone->location[0]) {
icaltimezone_builtin_unlock();
diff --git a/src/test/builtin_timezones.c b/src/test/builtin_timezones.c
index c2d36845..b0e472cb 100644
--- a/src/test/builtin_timezones.c
+++ b/src/test/builtin_timezones.c
@@ -20,10 +20,60 @@
#include <config.h>
#endif
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#include <assert.h>
+#endif
+
#include "libical/ical.h"
#include <stdio.h>
+#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD) && defined(HAVE_PTHREAD_CREATE)
+
+#define N_THREADS 20
+
+static const void *thread_comp = NULL;
+
+static void *
+thread_func(void *user_data)
+{
+ icaltimezone *zone = user_data;
+ icalcomponent *icalcomp;
+
+ if(!zone)
+ return NULL;
+
+ icalcomp = icaltimezone_get_component(zone);
+ if(!thread_comp)
+ thread_comp = icalcomp;
+ else
+ assert(thread_comp == icalcomp);
+ icalcomp = icalcomponent_new_clone(icalcomp);
+ icalcomponent_free(icalcomp);
+
+ return NULL;
+}
+
+static void
+test_get_component_threadsafety(void)
+{
+ pthread_t thread[N_THREADS];
+ icaltimezone *zone;
+ int ii;
+
+ zone = icaltimezone_get_builtin_timezone("Europe/London");
+
+ for(ii = 0; ii < N_THREADS; ii++) {
+ pthread_create(&thread[ii], NULL, thread_func, zone);
+ }
+
+ for(ii = 0; ii < N_THREADS; ii++) {
+ pthread_join(thread[ii], NULL);
+ }
+}
+#endif
+
int main()
{
icalarray *builtin_timezones;
@@ -34,6 +84,10 @@ int main()
set_zone_directory("../../zoneinfo");
icaltimezone_set_tzid_prefix("/softwarestudio.org/");
+ #if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD) && defined(HAVE_PTHREAD_CREATE)
+ test_get_component_threadsafety();
+ #endif
+
tt = icaltime_current_time_with_zone(icaltimezone_get_builtin_timezone("America/New_York"));
tt.year = 2038;
--
2.17.0

View File

@ -1,12 +0,0 @@
diff -up libical-3.0.8/src/test/libical-glib/CMakeLists.txt.test-patch libical-3.0.8/src/test/libical-glib/CMakeLists.txt
--- libical-3.0.8/src/test/libical-glib/CMakeLists.txt.test-patch 2020-03-07 15:42:42.000000000 +0100
+++ libical-3.0.8/src/test/libical-glib/CMakeLists.txt 2020-08-04 17:18:13.961171044 +0200
@@ -31,7 +31,7 @@ if(PYTHON3)
add_test(
NAME ${test_name}
- COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/${test_file}
+ COMMAND ${PYTHON3} -I ${CMAKE_CURRENT_SOURCE_DIR}/${test_file}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

View File

@ -2,15 +2,12 @@
Summary: Reference implementation of the iCalendar data type and serialization format
Name: libical
Version: 3.0.8
Release: 5%{?dist}
Version: 3.0.9
Release: 1%{?dist}
License: LGPLv2 or MPLv2.0
URL: https://libical.github.io/libical/
Source: https://github.com/%{name}/%{name}/archive/v%{version}/%{name}-%{version}.tar.gz
Patch01: libical-3.0.3-load-builtin-timezone.patch
Patch02: libical-3.0.8-invoke-python-tests.patch
BuildRequires: gcc
BuildRequires: gcc-c++
BuildRequires: cmake
@ -27,6 +24,7 @@ BuildRequires: python3
BuildRequires: python3-pip
BuildRequires: python3-gobject
BuildRequires: vala
BuildRequires: make
Requires: tzdata
%description
@ -65,10 +63,7 @@ Requires: %{name}-glib%{?_isa} = %{version}-%{release}
Development files needed for building things which link against %{name}-glib.
%prep
%setup -q
%patch01 -p1 -b .load-builtin-timezone
%patch02 -p1 -b .invoke-python-tests
%autosetup -p1 -S gendiff
%build
%{cmake} \
@ -85,6 +80,9 @@ Development files needed for building things which link against %{name}-glib.
%install
%cmake_install
# This is just a private build tool, not meant to be installed
rm %{buildroot}/%{_libexecdir}/libical/ical-glib-src-generator
%check
make test ARGS="-V" -C %{_target_platform}
@ -135,6 +133,9 @@ make test ARGS="-V" -C %{_target_platform}
%{_datadir}/gtk-doc/html/%{name}-glib
%changelog
* Mon Jan 18 2021 Milan Crha <mcrha@redhat.com> - 3.0.9-1
- Update to 3.0.9
* Tue Aug 04 2020 Milan Crha <mcrha@redhat.com> - 3.0.8-5
- Use CMake macros for the build
- Change how python tests are invoked (RH bug #1865924)

View File

@ -1 +1 @@
SHA512 (libical-3.0.8.tar.gz) = ce015e6d4c1c7cb4af7b45748ce8251c663f80f6a4357ddff6a97796642619abe882f4cadeca10cabeb1b25577869f436da15bca882e032eb3ff0475f6010d8b
SHA512 (libical-3.0.9.tar.gz) = 4a9894d82776437cb2ef16df70bffb52da7b4fd57b52a4f6941430b3b1f9830829f0775fb495411f67393581bda1304b54c9f0031bc3d4ada56d2204900cb268