mirror of
https://git.freebsd.org/ports.git
synced 2025-04-28 09:36:41 -04:00
Many thanks to Joshua Kinard, Siva Mahadevan, Yasuhiro Kimura, Andrew Walker, and Peter Eriksson for their patches. PR: 270383
111 lines
3.3 KiB
Diff
111 lines
3.3 KiB
Diff
From 29d0b3479f61f33356d6cc82099085b5c412f949 Mon Sep 17 00:00:00 2001
|
|
From: "Timur I. Bakeyev" <timur@FreeBSD.org>
|
|
Date: Sun, 30 May 2021 03:24:48 +0200
|
|
Subject: [PATCH 08/28] Brute force work around usage of Linux-specific `%m`
|
|
flag in `sscanf()`.
|
|
|
|
Signed-off-by: Timur I. Bakeyev <timur@FreeBSD.org>
|
|
---
|
|
libcli/http/http.c | 36 ++++++++++++++++++++++++++-----
|
|
source4/libcli/ldap/ldap_client.c | 12 +++++++++++
|
|
2 files changed, 43 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/libcli/http/http.c b/libcli/http/http.c
|
|
index d20fc25f9e2..a28caca0045 100644
|
|
--- a/libcli/http/http.c
|
|
+++ b/libcli/http/http.c
|
|
@@ -142,7 +142,19 @@ static enum http_read_status http_parse_headers(struct http_read_response_state
|
|
return HTTP_ALL_DATA_READ;
|
|
}
|
|
|
|
+#ifdef FREEBSD
|
|
+ int s0, s1, s2, s3; s0 = s1 = s2 = s3 = 0;
|
|
+ n = sscanf(line, "%n%*[^:]%n: %n%*[^\r\n]%n\r\n", &s0, &s1, &s2, &s3);
|
|
+
|
|
+ if(n >= 0) {
|
|
+ key = calloc(sizeof(char), s1-s0+1);
|
|
+ value = calloc(sizeof(char), s3-s2+1);
|
|
+
|
|
+ n = sscanf(line, "%[^:]: %[^\r\n]\r\n", key, value);
|
|
+ }
|
|
+#else
|
|
n = sscanf(line, "%m[^:]: %m[^\r\n]\r\n", &key, &value);
|
|
+#endif
|
|
if (n != 2) {
|
|
DEBUG(0, ("%s: Error parsing header '%s'\n", __func__, line));
|
|
status = HTTP_DATA_CORRUPTED;
|
|
@@ -168,7 +180,7 @@ error:
|
|
static bool http_parse_response_line(struct http_read_response_state *state)
|
|
{
|
|
bool status = true;
|
|
- char *protocol;
|
|
+ char *protocol = NULL;
|
|
char *msg = NULL;
|
|
char major;
|
|
char minor;
|
|
@@ -188,12 +200,22 @@ static bool http_parse_response_line(struct http_read_response_state *state)
|
|
return false;
|
|
}
|
|
|
|
+#ifdef FREEBSD
|
|
+ int s0, s1, s2, s3; s0 = s1 = s2 = s3 = 0;
|
|
+ n = sscanf(line, "%n%*[^/]%n/%c.%c %d %n%*[^\r\n]%n\r\n",
|
|
+ &s0, &s1, &major, &minor, &code, &s2, &s3);
|
|
+
|
|
+ if(n == 3) {
|
|
+ protocol = calloc(sizeof(char), s1-s0+1);
|
|
+ msg = calloc(sizeof(char), s3-s2+1);
|
|
+
|
|
+ n = sscanf(line, "%[^/]/%c.%c %d %[^\r\n]\r\n",
|
|
+ protocol, &major, &minor, &code, msg);
|
|
+ }
|
|
+#else
|
|
n = sscanf(line, "%m[^/]/%c.%c %d %m[^\r\n]\r\n",
|
|
&protocol, &major, &minor, &code, &msg);
|
|
-
|
|
- DEBUG(11, ("%s: Header parsed(%i): protocol->%s, major->%c, minor->%c, "
|
|
- "code->%d, message->%s\n", __func__, n, protocol, major, minor,
|
|
- code, msg));
|
|
+#endif
|
|
|
|
if (n != 5) {
|
|
DEBUG(0, ("%s: Error parsing header\n", __func__));
|
|
@@ -201,6 +223,10 @@ static bool http_parse_response_line(struct http_read_response_state *state)
|
|
goto error;
|
|
}
|
|
|
|
+ DEBUG(11, ("%s: Header parsed(%i): protocol->%s, major->%c, minor->%c, "
|
|
+ "code->%d, message->%s\n", __func__, n, protocol, major, minor,
|
|
+ code, msg));
|
|
+
|
|
if (major != '1') {
|
|
DEBUG(0, ("%s: Bad HTTP major number '%c'\n", __func__, major));
|
|
status = false;
|
|
diff --git a/source4/libcli/ldap/ldap_client.c b/source4/libcli/ldap/ldap_client.c
|
|
index 8614ccdfd54..2630d3c8859 100644
|
|
--- a/source4/libcli/ldap/ldap_client.c
|
|
+++ b/source4/libcli/ldap/ldap_client.c
|
|
@@ -402,8 +402,20 @@ static int ldap_parse_basic_url(
|
|
*pport = port;
|
|
return 0;
|
|
}
|
|
+#ifdef FREEBSD
|
|
+ int s0, s1; s0 = s1 = 0;
|
|
+ ret = sscanf(url, "%n%*[^:/]%n:%d", &s0, &s1, &port);
|
|
|
|
+ if(ret >= 0) {
|
|
+ host = calloc(sizeof(char), s1 - s0 + 1);
|
|
+ if (host == NULL) {
|
|
+ return ENOMEM;
|
|
+ }
|
|
+ ret = sscanf(url, "%[^:/]:%d", host, &port);
|
|
+ }
|
|
+#else
|
|
ret = sscanf(url, "%m[^:/]:%d", &host, &port);
|
|
+#endif
|
|
if (ret < 1) {
|
|
return EINVAL;
|
|
}
|
|
--
|
|
2.37.1
|
|
|