Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock Control: affects -1 + src:neon27
Hi RMs, Please pre-approve unblocking of package neon27. [ Reason ] Upstream recently released a bugfix only update. None affect us as I know, but as it's a networking library used by others in various environments it would be good to have. [ Impact ] It includes three regression fixes and documentation updates. [ Tests ] Local self-testing at the moment. [ Risks ] None I know of. [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing [ Other info ] I have excluded the po and doc directories from the diff due to noise. Source line numbers changed and so references in the po and html files. The autotools update also caused noise due to apostrophe (` to ') changes.
diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/debian/changelog neon27-0.34.2/debian/changelog --- neon27-0.34.0/debian/changelog 2024-11-30 07:36:23.000000000 +0100 +++ neon27-0.34.2/debian/changelog 2025-04-26 16:44:36.000000000 +0200 @@ -1,3 +1,15 @@ +neon27 (0.34.2-1) unstable; urgency=medium + + * New upstream release: + - fix regression in 207 parsing of elements which omit a reason-phrase, + - fix ne_move() to submit lock tokens for the parent collection of a + source resource locked with depth: 0, + - fix regression in NTLM auth in 0.34.0, + - add docs for ne_ssl_proto_name(), ne_ssl_protovers() and + ne_get_request_target() functions. + + -- Laszlo Boszormenyi (GCS) <g...@debian.org> Sat, 26 Apr 2025 16:44:36 +0200 + neon27 (0.34.0-1) unstable; urgency=medium * New upstream release. diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/macros/neon.m4 neon27-0.34.2/macros/neon.m4 --- neon27-0.34.0/macros/neon.m4 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/macros/neon.m4 2025-04-15 11:34:16.000000000 +0200 @@ -137,7 +137,7 @@ # Define the current versions. NE_VERSION_MAJOR=0 NE_VERSION_MINOR=34 -NE_VERSION_PATCH=0 +NE_VERSION_PATCH=2 NE_VERSION_TAG= # 0.34.x is backwards-compatible to 0.27.x, so AGE=7 diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/NEWS neon27-0.34.2/NEWS --- neon27-0.34.0/NEWS 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/NEWS 2025-04-15 11:34:16.000000000 +0200 @@ -1,4 +1,14 @@ -Changes in release 0.34.0 +Changes in release 0.34.2: +* Fix regression in NTLM auth in 0.34.0 (issue #190). +* Add docs for ne_ssl_proto_name, ne_ssl_protovers, ne_get_request_target. + +Changes in release 0.34.1: +* Fix regression in 207 parsing of <status> elements which omit + a reason-phrase (issue #188). +* Fix ne_move() to submit lock tokens for the parent collection + of a source resource locked with depth: 0. + +Changes in release 0.34.0: * Interface changes: - API and ABI backwards-compatible with 0.27.x and later - NE_SESSFLAG_SSLv2 is now ignored diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/src/Makefile.in neon27-0.34.2/src/Makefile.in --- neon27-0.34.0/src/Makefile.in 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/src/Makefile.in 2025-04-15 11:34:16.000000000 +0200 @@ -56,6 +56,9 @@ .SUFFIXES: .SUFFIXES: .c .lo .o +.PHONY: all all-@NEON_BUILD_BUNDLED@ check-c++ check-incl update-tables \ + update-deps + NEON_TARGET = @NEON_TARGET@ # Thanks to gettext for this neat trick. @@ -85,18 +88,32 @@ mktable: mktable.lo $(LINK) -o $@ mktable.lo -c++.c: - find . -name ne_\*.h -print | sed 's/.*/#include "&"/;/ne_priv/d' > $@ +c++.c: Makefile + find . -name ne_\*.h -print | sed 's/.*/#include "&"/;/ne_priv/d;/ne_internal.h/d;/ne_ntlm.h/d;/ne_acl.h/d' > $@ echo "int main(void) {}" >> $@ check-c++: c++.c c++ -I. c++.c check-incl: - @for f in ne_*.h; do \ - echo Checking $$f...; \ - echo "#include \"$$f\"" > checkincl.c; \ - $(COMPILE) -c checkincl.c -o checkincl.o || exit 1; done + @for f in ne_*.h; do \ + [ x"$$f" != "xne_internal.h" ] || continue; \ + [ x"$$f" != "xne_ntlm.h" ] || continue; \ + echo Checking $$f...; \ + echo "#include \"$$f\"" > checkincl.c; \ + $(LT_COMPILE) -c checkincl.c -o checkincl.o || exit 1; done + +# Update generated character lookup tables. +update-tables: mktable + @for n in `./mktable`; do \ + for f in `grep -l "mktable $$n" ne*.c`; do \ + new=`mktemp`; \ + (sed "/.* Generated with .mktable $$n/,\$$d" $$f; \ + ./mktable $$n; \ + sed "0,/.* Generated code from .mktable $$n. ends/d" $$f) > $$new; \ + mv $$new $$f; \ + done \ + done # Update generated dependencies below; requires cc -MM as in gcc. update-deps: diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/src/mktable.c neon27-0.34.2/src/mktable.c --- neon27-0.34.0/src/mktable.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/src/mktable.c 2025-04-15 11:34:16.000000000 +0200 @@ -173,7 +173,10 @@ unsigned n, wrap, flags = 0; if (argc != 2) { - fail("No generator given", "missing argument"); + for (n = 0; n < sizeof(generators) / sizeof(generators[0]); n++) { + puts(generators[n].name); + } + return 0; } for (n = 0; n < sizeof(generators) / sizeof(generators[0]); n++) { diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/src/ne_207.c neon27-0.34.2/src/ne_207.c --- neon27-0.34.0/src/ne_207.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/src/ne_207.c 2025-04-15 11:34:16.000000000 +0200 @@ -26,6 +26,7 @@ #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif +#include <string.h> #include "ne_alloc.h" #include "ne_utils.h" @@ -124,9 +125,19 @@ { ne_207_parser *p = userdata; - if ((state == ELM_href || state == ELM_responsedescription || - state == ELM_status) && p->cdata->used + len < 2048) - ne_buffer_append(p->cdata, buf, len); + if ((state == ELM_href + || state == ELM_responsedescription + || state == ELM_status) && p->cdata->used + len < 2048) { + if (p->cdata->used == 1) { + /* Strip leading whitespace only. */ + while (len && strchr("\r\n\t ", *buf) != NULL) { + buf++; + len--; + } + } + + if (len) ne_buffer_append(p->cdata, buf, len); + } return 0; } @@ -149,6 +160,9 @@ if (state == ELM_propstat && p->start_propstat) { p->propstat = p->start_propstat(p->userdata, p->response); if (p->propstat == NULL) { + NE_DEBUG(NE_DBG_XML, "[207] start-propstat callback failed, " + "aborting parse, parser error is: %s.\n", + ne_xml_get_error(p->parser)); return NE_XML_ABORT; } } @@ -166,7 +180,7 @@ end_element(void *userdata, int state, const char *nspace, const char *name) { ne_207_parser *p = userdata; - const char *cdata = ne_shave(p->cdata->data, "\r\n\t "); + char *cdata = p->cdata->data; switch (state) { case ELM_responsedescription: @@ -182,6 +196,9 @@ int ret; char *hh = NULL; + /* Trim any trailing whitespace. */ + cdata = ne_shave(cdata, "\r\n\t "); + if (p->flags & NE_207_MSSP_ESCAPING) { hh = ne_path_escapef(cdata, NE_PATH_NONURI); NE_DEBUG(NE_DBG_XML, "207: Enabled href escaping hacks [%s]->[%s]\n", @@ -216,8 +233,13 @@ ne_xml_currentline(p->parser), cdata); ne_xml_set_error(p->parser, buf); return -1; - } else { - NE_DEBUG(NE_DBG_XML, "[207] valid status-line: %s\n", cdata); + } + else { + /* Shave trailing spaces from the reason-phrase; any + * other trailing whitespace will have been + * strclean()ed into spaces. */ + ne_shave(p->status.reason_phrase, " "); + NE_DEBUG(NE_DBG_XML, "[207] valid status-line: %s\n", cdata); } } break; diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/src/ne_auth.c neon27-0.34.2/src/ne_auth.c --- neon27-0.34.0/src/ne_auth.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/src/ne_auth.c 2025-04-15 11:34:16.000000000 +0200 @@ -400,9 +400,9 @@ static int get_credentials(auth_session *sess, ne_buffer **errmsg, int attempt, struct auth_challenge *chall, char *pwbuf) { + char *realm = sess->realm ? ne_strclean(ne_strdup(sess->realm)) : ""; unsigned mask = chall->protocol->id | sess->spec->protomask; int rv; - char *realm = ne_strclean(ne_strdup(sess->realm)); if (chall->handler->new_creds) rv = chall->handler->new_creds(chall->handler->userdata, @@ -413,7 +413,7 @@ rv = chall->handler->old_creds(chall->handler->userdata, realm, chall->handler->attempt++, sess->username, pwbuf); - ne_free(realm); + if (sess->realm) ne_free(realm); if (rv == 0) return 0; diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/src/ne_basic.c neon27-0.34.2/src/ne_basic.c --- neon27-0.34.0/src/ne_basic.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/src/ne_basic.c 2025-04-15 11:34:16.000000000 +0200 @@ -443,7 +443,11 @@ #ifdef NE_HAVE_DAV if (is_move) { - ne_lock_using_resource(req, src, NE_DEPTH_INFINITE); + /* Moving the resource requires any locks for the source + * resource (which may be a collection), and modifies the + * parent of the source. */ + ne_lock_using_resource(req, src, NE_DEPTH_INFINITE); + ne_lock_using_parent(req, src); } ne_lock_using_resource(req, dest, NE_DEPTH_INFINITE); /* And we need to be able to add members to the destination's parent */ diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/src/ne_string.c neon27-0.34.2/src/ne_string.c --- neon27-0.34.0/src/ne_string.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/src/ne_string.c 2025-04-15 11:34:16.000000000 +0200 @@ -279,7 +279,7 @@ /* xD0 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* xE0 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* xF0 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 -}; /* -- Generated code ends. */ +}; /* -- Generated code from 'mktable quote' ends. */ static const char hex_chars[16] = "0123456789abcdef"; @@ -416,7 +416,7 @@ /* xD0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* xE0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* xF0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; /* -- Generated code ends. */ +}; /* -- Generated code from 'mktable validb64' ends. */ /* Generated with 'mktable decodeb64', do not alter here -- */ static const unsigned char table_decodeb64[256] = { @@ -452,7 +452,7 @@ /* xE8 */ 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, /* xF0 */ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, /* xF8 */ 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8 -}; /* -- Generated code ends. */ +}; /* -- Generated code from 'mktable decodeb64' ends. */ #define DECODE_B64(ch) table_decodeb64[ch] #define VALID_B64(ch) table_validb64[ch] @@ -527,7 +527,7 @@ /* xE8 */ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* xF0 */ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* xF8 */ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 -}; /* -- Generated code ends. */ +}; /* -- Generated code from 'mktable strclean' ends. */ char *ne_strclean(char *str) { @@ -611,19 +611,19 @@ /* x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, -/* xa0 */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, -/* xa8 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, -/* xb0 */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, -/* xb8 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, -/* xc0 */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, -/* xc8 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, -/* xd0 */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, -/* xd8 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, -/* xe0 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, -/* xe8 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, -/* xf0 */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, -/* xf8 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff -}; /* -- Generated code ends. */ +/* xA0 */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, +/* xA8 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, +/* xB0 */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, +/* xB8 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, +/* xC0 */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, +/* xC8 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, +/* xD0 */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, +/* xD8 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, +/* xE0 */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, +/* xE8 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, +/* xF0 */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, +/* xF8 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +}; /* -- Generated code from 'mktable tolower' ends. */ #define TOLOWER(ch) table_tolower[ch] diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/src/ne_uri.c neon27-0.34.2/src/ne_uri.c --- neon27-0.34.0/src/ne_uri.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/src/ne_uri.c 2025-04-15 11:34:16.000000000 +0200 @@ -94,6 +94,9 @@ /* any characters which should be path-escaped: */ #define URI_ESCAPE ((URI_GENDELIM & ~(FS)) | URI_SUBDELIM | OT | PC) +/* Maximum allowed port number. */ +#define MAX_PORT (65535) + static const unsigned short uri_chars[256] = { /* 0xXX x0 x2 x4 x6 x8 xA xC xE */ /* 0x */ OT, OT, OT, OT, OT, OT, OT, OT, OT, OT, OT, OT, OT, OT, OT, OT, @@ -220,23 +223,30 @@ parsed->host = ne_strndup(s, p - s); - if (p != pa && p + 1 != pa) { - p++; - - s = p; - /* => s = port */ - - while (p < pa) { - if (!(uri_lookup(*p) & URI_DIGIT)) - return -1; - - p++; - } + /* Iff p and pa (=> path-abempty) differ, the optional port + * section is present and parsed here: */ + if (p != pa) { + unsigned int port = 0; + + if (*p++ != ':') return -1; + + /* => p = port */ + + /* port = *DIGIT + * + * Note: port can be the empty string, in which case now: + * p == pa and port is parsed as 0, as desired. */ + while (p < pa && port <= MAX_PORT && (uri_lookup(*p) & URI_DIGIT) != 0) + port = 10*port + *p++-'0'; + + /* If p did not reach pa there was some non-digit present + * or the integer was too large, so fail. */ + if (p != pa || port > MAX_PORT) return -1; - parsed->port = atoi(s); + parsed->port = port; } - s = pa; + s = pa; /* Next, parse path-abempty */ } /* => s = path-abempty / path-absolute / path-rootless diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/test/lock.c neon27-0.34.2/test/lock.c --- neon27-0.34.0/test/lock.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/test/lock.c 2025-04-15 11:34:16.000000000 +0200 @@ -369,13 +369,15 @@ #define LOCK_MODPARENT (0x01) /* Enable SharePoint hacks. */ #define LOCK_SHAREPOINT (0x02) +/* Use a MOVE request. */ +#define LOCK_MOVE (0x04) /* Tests If: header submission, for a lock of depth 'lockdepth' at * 'lockpath', with a request to 'reqpath' which Depth header of * 'reqdepth'. 'flags' is bitwise-or of LOCK_* flags above. */ -static int submit_test(const char *lockpath, int lockdepth, - const char *reqpath, int reqdepth, - unsigned int flags) +static int submit_test2(const char *lockpath, int lockdepth, + const char *path1, const char *path2, + int reqdepth, unsigned int flags) { ne_lock_store *store = ne_lockstore_create(); ne_session *sess; @@ -403,7 +405,13 @@ ne_lockstore_register(store, sess); ne_lockstore_add(store, lk); - ret = do_request(sess, reqpath, reqdepth, flags & LOCK_MODPARENT); + if (flags & LOCK_MOVE) { + ret = ne_move(sess, 0, path1, path2); + if (ret) + t_context("MOVE failed: %s", ne_get_error(sess)); + } + else + ret = do_request(sess, path1, reqdepth, flags & LOCK_MODPARENT); CALL(await_server()); ne_lockstore_destroy(store); @@ -412,6 +420,19 @@ return ret; } +/* Tests If: header submission, for a lock of depth 'lockdepth' at + * 'lockpath', with a request to 'reqpath' which Depth header of + * 'reqdepth'. 'flags' is bitwise-or of LOCK_* flags above. */ +static int submit_test(const char *lockpath, int lockdepth, + const char *reqpath, int reqdepth, + unsigned int flags) +{ + return submit_test2(lockpath, lockdepth, + reqpath, NULL, reqdepth, + flags); +} + + static int if_simple(void) { return submit_test("/foo", 0, "/foo", 0, 0); @@ -448,6 +469,11 @@ LOCK_SHAREPOINT); } +static int if_movefrom(void) +{ + return submit_test2("/from", 0, "/from/here.txt", "/to", 0, LOCK_MOVE); +} + static int serve_discovery(ne_socket *sock, void *userdata) { char buf[BUFSIZ], *resp = userdata; @@ -703,6 +729,7 @@ T(if_child), T(if_covered_child), T(if_sharepoint), + T(if_movefrom), T(lock_timeout), T(lock_long_timeout), T(lock_shared), diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/test/props.c neon27-0.34.2/test/props.c --- neon27-0.34.0/test/props.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/test/props.c 2025-04-15 11:34:16.000000000 +0200 @@ -370,11 +370,12 @@ { "DAV:", "fishbone", }, { NULL, NULL } }; - size_t n; + unsigned n; for (n = 0; n < sizeof(ts)/sizeof(ts[0]); n++) { const ne_propname *pset = pset1; + NE_DEBUG(NE_DBG_HTTP, "--> running test %u for %s\n", n, ts[n].resp); CALL(run_propfind(pset, ts[n].resp, ts[n].depth, ts[n].expected, ts[n].type)); } diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/test/twooh7.c neon27-0.34.2/test/twooh7.c --- neon27-0.34.0/test/twooh7.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/test/twooh7.c 2025-04-15 11:34:16.000000000 +0200 @@ -365,8 +365,22 @@ "end-prop[propone];" "start-prop[/alpha,/alpha-1,proptwo];cdata-prop[foobar];" "end-prop[proptwo];" - "end-pstat[/alpha-1]-status={200 OK};end-resp[/alpha];" } + "end-pstat[/alpha-1]-status={200 OK};end-resp[/alpha];" }, + /* test for whitespace around href, which should be + * ignored. */ + { MULTI_207(RESP_207(" /spaces ", STAT_207("200 OK") DESCR_207(""))), + "start-resp[/spaces];end-resp[/spaces]-status={200 OK};" }, + + /* test for whitespace around href, which should be + * ignored. */ + { MULTI_207(RESP_207(" /spaces ", STAT_207("200 OK\n") DESCR_207(""))), + "start-resp[/spaces];end-resp[/spaces]-status={200 OK};" }, + + /* test for omitted reason-phrase in status-line, which is + * valid, per https://github.com/notroj/neon/issues/188 */ + { MULTI_207(RESP_207("/bar", STAT_207("200 ") DESCR_207(""))), + "start-resp[/bar];end-resp[/bar]-status={200 };" } }; unsigned n; diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/test/uri-tests.c neon27-0.34.2/test/uri-tests.c --- neon27-0.34.0/test/uri-tests.c 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/test/uri-tests.c 2025-04-15 11:34:16.000000000 +0200 @@ -384,6 +384,8 @@ "http://fish/[foo]/bar", "http://foo:80bar", "http://foo:80:80/bar", + "http://foo:8000000000000000000000000000000000000000000000000/bar", + "http://foo:65536/bar", NULL }; int n; diff -Nur -x po -x doc -x 'config*' neon27-0.34.0/.version neon27-0.34.2/.version --- neon27-0.34.0/.version 2024-11-23 11:53:08.000000000 +0100 +++ neon27-0.34.2/.version 2025-04-15 11:34:16.000000000 +0200 @@ -1 +1 @@ -0.34.0 +0.34.2