Compare commits

..

No commits in common. 'c10-beta' and 'c9' have entirely different histories.
c10-beta ... c9

@ -1,238 +0,0 @@
From 6aebfd5499039b58b88eb15eba1aa719c117cfd4 Mon Sep 17 00:00:00 2001
From: Sergio Correia <scorreia@redhat.com>
Date: Tue, 9 Jan 2024 08:56:59 +0000
Subject: [PATCH] Add support for building with llhttp instead of http-parser
As http-parser has been unmaintained for a while [1], let's add
support for its natural replacement, llhttp.
However, as llhttp does not seem to be packaged in distros like
Debian [2], we will keep supporting building with http-parser for
time being, preferring llhttp, if it is present.
[1] https://github.com/nodejs/http-parser/issues/522
[2] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=977716
---
.github/workflows/install-dependencies | 2 +-
meson.build | 17 ++++++++++---
src/http.c | 10 ++++----
src/http.h | 35 +++++++++++++++++++++++---
src/tangd.c | 16 ++++++------
5 files changed, 58 insertions(+), 22 deletions(-)
diff --git a/.github/workflows/install-dependencies b/.github/workflows/install-dependencies
index 96852a8..a9bbab0 100755
--- a/.github/workflows/install-dependencies
+++ b/.github/workflows/install-dependencies
@@ -13,7 +13,7 @@ debian:*|ubuntu:*)
echo 'max_parallel_downloads=10' >> /etc/dnf/dnf.conf
dnf -y clean all
dnf -y --setopt=deltarpm=0 update
- dnf -y install gcc meson pkgconfig libjose-devel jose http-parser-devel \
+ dnf -y install gcc meson pkgconfig libjose-devel jose llhttp-devel \
systemd gcovr curl socat iproute
;;
diff --git a/meson.build b/meson.build
index fd46cef..33c8aff 100644
--- a/meson.build
+++ b/meson.build
@@ -55,13 +55,22 @@ add_project_arguments('-DVERSION="'+meson.project_version() + '"', language : 'c
jose = dependency('jose', version: '>=8')
a2x = find_program('a2x', required: false)
compiler = meson.get_compiler('c')
-if not compiler.has_header('http_parser.h',args : '-I/usr/local/include')
- error('http-parser devel files not found.')
+
+http_lib = []
+if compiler.has_header('llhttp.h', args: '-I/usr/local/include')
+ http_lib = 'llhttp'
+ add_project_arguments('-DUSE_LLHTTP', language: 'c')
+else
+ if not compiler.has_header('http_parser.h', args: '-I/usr/local/include')
+ error('neither llhttp nor http-parser devel files found.')
+ endif
+ http_lib = 'http_parser'
endif
+
if host_machine.system() == 'freebsd'
- http_parser = compiler.find_library('http_parser',dirs : '/usr/local/lib')
+ http_parser = compiler.find_library(http_lib, dirs : '/usr/local/lib')
else
- http_parser = compiler.find_library('http_parser')
+ http_parser = compiler.find_library(http_lib)
endif
licenses = ['COPYING']
diff --git a/src/http.c b/src/http.c
index e9af37b..17b613f 100644
--- a/src/http.c
+++ b/src/http.c
@@ -36,7 +36,7 @@ HTTP_METHOD_MAP(XX)
};
static int
-on_url(http_parser *parser, const char *at, size_t length)
+on_url(http_parser_t *parser, const char *at, size_t length)
{
struct http_state *state = parser->data;
@@ -51,7 +51,7 @@ on_url(http_parser *parser, const char *at, size_t length)
}
static int
-on_body(http_parser *parser, const char *at, size_t length)
+on_body(http_parser_t *parser, const char *at, size_t length)
{
struct http_state *state = parser->data;
@@ -66,7 +66,7 @@ on_body(http_parser *parser, const char *at, size_t length)
}
static int
-on_message_complete(http_parser *parser)
+on_message_complete(http_parser_t *parser)
{
struct http_state *state = parser->data;
const char *addr = NULL;
@@ -132,7 +132,7 @@ egress:
return 0;
}
-const http_parser_settings http_settings = {
+const http_settings_t http_settings = {
.on_url = on_url,
.on_body = on_body,
.on_message_complete = on_message_complete,
@@ -140,7 +140,7 @@ const http_parser_settings http_settings = {
int
http_reply(const char *file, int line,
- enum http_status code, const char *fmt, ...)
+ http_status_t code, const char *fmt, ...)
{
const char *msg = NULL;
va_list ap;
diff --git a/src/http.h b/src/http.h
index 8660a4f..2e35686 100644
--- a/src/http.h
+++ b/src/http.h
@@ -19,12 +19,39 @@
#pragma once
-#include <http_parser.h>
#include <sys/types.h>
#include <regex.h>
+#ifdef USE_LLHTTP
+#include <llhttp.h>
+
+typedef llhttp_method_t http_method_t;
+typedef llhttp_status_t http_status_t;
+typedef llhttp_settings_t http_settings_t;
+typedef llhttp_t http_parser_t;
+#define tang_http_parser_init(parser, settings) llhttp_init(parser, HTTP_REQUEST, settings)
+#define tang_http_parser_execute(parser, settings, req, rcvd) llhttp_execute(parser, req, rcvd)
+#define tang_http_parser_errno(parser) parser.error
+#define tang_http_errno_description(parser, errno) llhttp_get_error_reason(parser)
+
+#else
+/* Legacy http-parser. */
+#include <http_parser.h>
+
+typedef enum http_method http_method_t;
+typedef enum http_status http_status_t;
+typedef http_parser_settings http_settings_t;
+typedef struct http_parser http_parser_t;
+
+#define tang_http_parser_init(parser, settings) http_parser_init(parser, HTTP_REQUEST)
+#define tang_http_parser_execute(parser, settings, req, rcvd) http_parser_execute(parser, settings, req, rcvd)
+#define tang_http_parser_errno(parser) parser.http_errno
+#define tang_http_errno_description(parser, errno) http_errno_description(errno)
+
+#endif /* USE_LLHTTP */
+
struct http_dispatch {
- int (*func)(enum http_method method, const char *path,
+ int (*func)(http_method_t method, const char *path,
const char *body, regmatch_t matches[], void *misc);
uint64_t methods;
size_t nmatches;
@@ -43,11 +70,11 @@ struct http_state {
void *misc;
};
-extern const http_parser_settings http_settings;
+extern const http_settings_t http_settings;
int __attribute__ ((format(printf, 4, 5)))
http_reply(const char *file, int line,
- enum http_status code, const char *fmt, ...);
+ http_status_t code, const char *fmt, ...);
#define http_reply(code, ...) \
http_reply(__FILE__, __LINE__, code, __VA_ARGS__)
diff --git a/src/tangd.c b/src/tangd.c
index 1e3a6a3..7f197f6 100644
--- a/src/tangd.c
+++ b/src/tangd.c
@@ -64,7 +64,7 @@ str_cleanup(char **str)
}
static int
-adv(enum http_method method, const char *path, const char *body,
+adv(http_method_t method, const char *path, const char *body,
regmatch_t matches[], void *misc)
{
__attribute__((cleanup(str_cleanup))) char *adv = NULL;
@@ -101,7 +101,7 @@ adv(enum http_method method, const char *path, const char *body,
}
static int
-rec(enum http_method method, const char *path, const char *body,
+rec(http_method_t method, const char *path, const char *body,
regmatch_t matches[], void *misc)
{
__attribute__((cleanup(str_cleanup))) char *enc = NULL;
@@ -197,13 +197,14 @@ static int
process_request(const char *jwkdir, int in_fileno)
{
struct http_state state = { .dispatch = dispatch, .misc = (char*)jwkdir };
- struct http_parser parser = { .data = &state };
+ http_parser_t parser;
struct stat st = {};
char req[4096] = {};
size_t rcvd = 0;
int r = 0;
- http_parser_init(&parser, HTTP_REQUEST);
+ tang_http_parser_init(&parser, &http_settings);
+ parser.data = &state;
if (stat(jwkdir, &st) != 0) {
fprintf(stderr, "Error calling stat() on path: %s: %m\n", jwkdir);
@@ -224,17 +225,16 @@ process_request(const char *jwkdir, int in_fileno)
rcvd += r;
- r = http_parser_execute(&parser, &http_settings, req, rcvd);
- if (parser.http_errno != 0) {
+ r = tang_http_parser_execute(&parser, &http_settings, req, rcvd);
+ if (tang_http_parser_errno(parser) != 0) {
fprintf(stderr, "HTTP Parsing Error: %s\n",
- http_errno_description(parser.http_errno));
+ tang_http_errno_description(&parser, tang_http_parser_errno(parser)));
return EXIT_SUCCESS;
}
memmove(req, &req[r], rcvd - r);
rcvd -= r;
}
-
return EXIT_SUCCESS;
}
--
2.41.0

@ -1,111 +0,0 @@
From 960b2036a97baded1b61b405e4fa99380f807ff9 Mon Sep 17 00:00:00 2001
From: Sergio Correia <scorreia@redhat.com>
Date: Mon, 12 Feb 2024 13:07:45 +0000
Subject: [PATCH 2/2] Fix issue introduced in http-parser -> llhttp conversion
http_parser_execute() returns the number of parsed bytes, while
llhttp_execute() returns an error code.
Signed-off-by: Sergio Correia <scorreia@redhat.com>
---
src/http.h | 6 ++----
src/tangd.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 48 insertions(+), 6 deletions(-)
diff --git a/src/http.h b/src/http.h
index 2e35686..8d9de51 100644
--- a/src/http.h
+++ b/src/http.h
@@ -30,10 +30,9 @@ typedef llhttp_status_t http_status_t;
typedef llhttp_settings_t http_settings_t;
typedef llhttp_t http_parser_t;
#define tang_http_parser_init(parser, settings) llhttp_init(parser, HTTP_REQUEST, settings)
-#define tang_http_parser_execute(parser, settings, req, rcvd) llhttp_execute(parser, req, rcvd)
#define tang_http_parser_errno(parser) parser.error
#define tang_http_errno_description(parser, errno) llhttp_get_error_reason(parser)
-
+#define tang_http_parser_resume(parser) llhttp_resume(parser)
#else
/* Legacy http-parser. */
#include <http_parser.h>
@@ -44,10 +43,9 @@ typedef http_parser_settings http_settings_t;
typedef struct http_parser http_parser_t;
#define tang_http_parser_init(parser, settings) http_parser_init(parser, HTTP_REQUEST)
-#define tang_http_parser_execute(parser, settings, req, rcvd) http_parser_execute(parser, settings, req, rcvd)
#define tang_http_parser_errno(parser) parser.http_errno
#define tang_http_errno_description(parser, errno) http_errno_description(errno)
-
+#define tang_http_parser_resume(parser) http_parser_pause(parser, 0)
#endif /* USE_LLHTTP */
struct http_dispatch {
diff --git a/src/tangd.c b/src/tangd.c
index 7f197f6..ab7f0cf 100644
--- a/src/tangd.c
+++ b/src/tangd.c
@@ -193,6 +193,44 @@ static struct http_dispatch dispatch[] = {
#define DEFAULT_PORT 9090
+static size_t
+tang_http_parser_execute(http_parser_t *parser, const char* data, size_t len)
+{
+#ifdef USE_LLHTTP
+ llhttp_errno_t error;
+ size_t parsed_len;
+
+ /*
+ * Unlike http_parser, which returns the number of parsed
+ * bytes in the _execute() call, llhttp returns an error
+ * code.
+ */
+
+ if (data == NULL || len == 0) {
+ error = llhttp_finish(parser);
+ } else {
+ error = llhttp_execute(parser, data, len);
+ }
+
+ parsed_len = len;
+ /*
+ * Adjust number of parsed bytes in case of error.
+ */
+ if (error != HPE_OK) {
+ parsed_len = llhttp_get_error_pos(parser) - data;
+
+ /* This isn't a real pause, just a way to stop parsing early. */
+ if (error == HPE_PAUSED_UPGRADE) {
+ llhttp_resume_after_upgrade(parser);
+ }
+ }
+
+ return parsed_len;
+#else
+ return http_parser_execute(parser, &http_settings, data, len);
+#endif
+}
+
static int
process_request(const char *jwkdir, int in_fileno)
{
@@ -225,8 +263,14 @@ process_request(const char *jwkdir, int in_fileno)
rcvd += r;
- r = tang_http_parser_execute(&parser, &http_settings, req, rcvd);
- if (tang_http_parser_errno(parser) != 0) {
+ r = tang_http_parser_execute(&parser, req, rcvd);
+ switch (tang_http_parser_errno(parser)) {
+ case HPE_OK:
+ break;
+ case HPE_PAUSED:
+ tang_http_parser_resume(&parser);
+ break;
+ default:
fprintf(stderr, "HTTP Parsing Error: %s\n",
tang_http_errno_description(&parser, tang_http_parser_errno(parser)));
return EXIT_SUCCESS;
--
2.43.0

@ -1,24 +1,12 @@
## START: Set by rpmautospec
## (rpmautospec version 0.6.1)
## RPMAUTOSPEC: autorelease, autochangelog
%define autorelease(e:s:pb:n) %{?-p:0.}%{lua:
release_number = 9;
base_release_number = tonumber(rpm.expand("%{?-b*}%{!?-b:1}"));
print(release_number + base_release_number - 1);
}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{!?-n:%{?dist}}
## END: Set by rpmautospec
Name: tang
Version: 14
Release: %autorelease
Release: 2%{?dist}
Summary: Network Presence Binding Daemon
License: GPL-3.0-or-later
License: GPLv3+
URL: https://github.com/latchset/%{name}
Source0: https://github.com/latchset/%{name}/releases/download/v%{version}/%{name}-%{version}.tar.xz
Source1: tang.sysusers
Patch: 0001-Add-support-for-building-with-llhttp-instead-of-http.patch
Patch: 0002-Fix-issue-introduced-in-http-parser-llhttp-conversio.patch
BuildRequires: gcc
BuildRequires: meson
@ -28,7 +16,7 @@ BuildRequires: libjose-devel >= 8
BuildRequires: libjose-zlib-devel >= 8
BuildRequires: libjose-openssl-devel >= 8
BuildRequires: llhttp-devel
BuildRequires: http-parser-devel >= 2.7.1-3
BuildRequires: systemd-devel
BuildRequires: pkgconfig
@ -46,7 +34,6 @@ BuildRequires: iproute
%{?systemd_requires}
Requires: coreutils
Requires: jose >= 8
Requires: llhttp
Requires: grep
Requires: sed
@ -65,14 +52,11 @@ Tang is a small daemon for binding data to the presence of a third party.
%install
%meson_install
install -p -D -m 0644 %{SOURCE1} %{buildroot}%{_sysusersdir}/tang.conf
grep "User=%{name}" $RPM_BUILD_ROOT/%{_unitdir}/%{name}d@.service || echo "User=%{name}" >> $RPM_BUILD_ROOT/%{_unitdir}/%{name}d@.service
%{__mkdir_p} $RPM_BUILD_ROOT/%{_localstatedir}/db/%{name}
%check
%meson_test \
%ifarch riscv64
--timeout-multiplier 10 \
%endif
%{nil}
%meson_test
%pre
%sysusers_create_compat %{SOURCE1}
@ -116,74 +100,40 @@ fi
%{_sysusersdir}/tang.conf
%changelog
## START: Generated by rpmautospec
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 14-9
- Bump release for June 2024 mass rebuild
* Mon Jun 10 2024 David Abdurachmanov <davidlt@rivosinc.com> - 14-8
- riscv64: Give more time for tests to finish
* Mon May 27 2024 koncpa <pkoncity@redhat.com> - 14-7
- Enable RHEL gating for tang
* Mon Feb 12 2024 Sergio Correia <scorreia@redhat.com> - 14-6
- Backport follow-up fix for llhttp conversion
* Sat Jan 27 2024 Fedora Release Engineering <releng@fedoraproject.org> - 14-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Thu Jan 11 2024 Sergio Correia <scorreia@redhat.com> - 14.3
- Use llhttp instead of http-parser
* Sat Jul 22 2023 Fedora Release Engineering <releng@fedoraproject.org> - 14-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Thu Jun 29 2023 Sergio Arroutbi <sarroutb@redhat.com> - 14-2
- Fix service start up
* Wed Jun 14 2023 Sergio Arroutbi <sarroutb@redhat.com> - 14-1
- New upstream release - v14
Resolves: rhbz#2180990
* Tue Jun 27 2023 Sergio Arroutbi <sarroutb@redhat.com> - 14-1
- New upstream release - v14.
Resolves: rhbz#2182411
Resolves: CVE-2023-1672
* Fri Feb 10 2023 Sergio Arroutbi <sarroutb@redhat.com> - 13-1
- New upstream release - v13
* Sat Jan 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 11-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Wed Dec 07 2022 Sergio Correia <scorreia@redhat.com> - 11-5
- Report error details when json_load_file() fails
* Wed Aug 17 2022 Sergio Arroutbi <sarroutb@redhat.com> - 11-4
* Wed Aug 17 2022 Sergio Arroutbi <sarroutb@redhat.com> - 11-2
- Adopt systemd-sysusers format
* Sat Jul 23 2022 Fedora Release Engineering <releng@fedoraproject.org> - 11-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Sat Jan 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 11-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
Resolves: rhbz#2095474
* Tue Dec 14 2021 Sergio Correia <scorreia@redhat.com> - 11-1
- New upstream release - v11.
Resolves: CVE-2021-4076
* Mon Oct 04 2021 Sergio Arroutbi <sarroutb@redhat.com> - 10-5
- Fix scriptlet from previous commit
* Mon Oct 04 2021 Sergio Correia <scorreia@redhat.com> - 10-4
- Keys are created with 0440 mode
Resolves rhbz#2008204
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 10-4
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 10-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Tue Jun 22 2021 Mohan Boddu <mboddu@redhat.com> - 10-3
- Rebuilt for RHEL 9 BETA for openssl 3.0
Related: rhbz#1971065
* Thu May 20 2021 Sergio Correia <scorreia@redhat.com> - 10-2
- Fix issues reported by shellcheck and a possible NULL pointer
dereference reported by gcc static analyzer (3d770c6, 262d98f)
- Fix issues reported by static analyzer checks
Resolves: rhbz#1956765
* Wed May 05 2021 Sergio Correia <scorreia@redhat.com> - 10-1
- New upstream release - v10.
Resolves: rhbz#1956765
* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 8-3
- Rebuilt for updated systemd-rpm-macros
See https://pagure.io/fesco/issue/2583.
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 8-3
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Tue Feb 09 2021 Sergio Correia <scorreia@redhat.com> - 8-2
- Remove extra patches as they are already included in v8 release
@ -261,5 +211,3 @@ fi
* Tue Aug 23 2016 Nathaniel McCallum <npmccallum@redhat.com> - 1-1
- First release
## END: Generated by rpmautospec

Loading…
Cancel
Save