Skip to content

Commit fc8d5c7

Browse files
committed
ext/iconv: fix build for netbsd.
NetBSD still adopts the old iconv signature for buffer inputs. The next release will too so we can assume it will remain that way for a while. Close GH-12001
1 parent ffd398b commit fc8d5c7

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

NEWS

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ PHP NEWS
55
- Core:
66
. Fixed bug GH-11937 (Constant ASTs containing objects). (ilutov)
77

8+
- Iconv:
9+
. Fixed build for NetBSD which still uses the old iconv signature.
10+
(David Carlier)
11+
812
- MySQLnd:
913
. Fixed bug GH-10270 (Invalid error message when connection via SSL fails:
1014
"trying to connect via (null)"). (Kamil Tekiela)

ext/iconv/iconv.c

+17-9
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@
4444
#undef iconv
4545
#endif
4646

47+
#if defined(__NetBSD__)
48+
// unfortunately, netbsd has still the old non posix conformant signature
49+
// libiconv tends to match the eventual system's iconv too.
50+
#define ICONV_CONST const
51+
#else
52+
#define ICONV_CONST
53+
#endif
54+
4755
#include "zend_smart_str.h"
4856
#include "ext/standard/base64.h"
4957
#include "ext/standard/quot_print.h"
@@ -360,7 +368,7 @@ static php_iconv_err_t _php_iconv_appendl(smart_str *d, const char *s, size_t l,
360368

361369
out_p = ZSTR_VAL((d)->s) + ZSTR_LEN((d)->s);
362370

363-
if (iconv(cd, (char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
371+
if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
364372
switch (errno) {
365373
case EINVAL:
366374
return PHP_ICONV_ERR_ILLEGAL_CHAR;
@@ -456,7 +464,7 @@ PHP_ICONV_API php_iconv_err_t php_iconv_string(const char *in_p, size_t in_len,
456464
out_p = ZSTR_VAL(out_buf);
457465

458466
while (in_left > 0) {
459-
result = iconv(cd, (char **) &in_p, &in_left, (char **) &out_p, &out_left);
467+
result = iconv(cd, (ICONV_CONST char **) &in_p, &in_left, (char **) &out_p, &out_left);
460468
out_size = bsz - out_left;
461469
if (result == (size_t)(-1)) {
462470
if (ignore_ilseq && errno == EILSEQ) {
@@ -576,7 +584,7 @@ static php_iconv_err_t _php_iconv_strlen(size_t *pretval, const char *str, size_
576584

577585
more = in_left > 0;
578586

579-
iconv(cd, more ? (char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
587+
iconv(cd, more ? (ICONV_CONST char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
580588
if (out_left == sizeof(buf)) {
581589
break;
582590
} else {
@@ -683,7 +691,7 @@ static php_iconv_err_t _php_iconv_substr(smart_str *pretval,
683691

684692
more = in_left > 0 && len > 0;
685693

686-
iconv(cd1, more ? (char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
694+
iconv(cd1, more ? (ICONV_CONST char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
687695
if (out_left == sizeof(buf)) {
688696
break;
689697
}
@@ -805,7 +813,7 @@ static php_iconv_err_t _php_iconv_strpos(size_t *pretval,
805813

806814
more = in_left > 0;
807815

808-
iconv_ret = iconv(cd, more ? (char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
816+
iconv_ret = iconv(cd, more ? (ICONV_CONST char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left);
809817
if (out_left == sizeof(buf)) {
810818
break;
811819
}
@@ -1012,7 +1020,7 @@ static php_iconv_err_t _php_iconv_mime_encode(smart_str *pretval, const char *fn
10121020

10131021
out_left = out_size - out_reserved;
10141022

1015-
if (iconv(cd, (char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
1023+
if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
10161024
switch (errno) {
10171025
case EINVAL:
10181026
err = PHP_ICONV_ERR_ILLEGAL_CHAR;
@@ -1096,7 +1104,7 @@ static php_iconv_err_t _php_iconv_mime_encode(smart_str *pretval, const char *fn
10961104
out_p = buf;
10971105
out_left = out_size;
10981106

1099-
if (iconv(cd, (char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
1107+
if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
11001108
switch (errno) {
11011109
case EINVAL:
11021110
err = PHP_ICONV_ERR_ILLEGAL_CHAR;
@@ -2373,7 +2381,7 @@ static int php_iconv_stream_filter_append_bucket(
23732381
tcnt = self->stub_len;
23742382

23752383
while (tcnt > 0) {
2376-
if (iconv(self->cd, &pt, &tcnt, &pd, &ocnt) == (size_t)-1) {
2384+
if (iconv(self->cd, (ICONV_CONST char **)&pt, &tcnt, &pd, &ocnt) == (size_t)-1) {
23772385
switch (errno) {
23782386
case EILSEQ:
23792387
php_error_docref(NULL, E_WARNING, "iconv stream filter (\"%s\"=>\"%s\"): invalid multibyte sequence", self->from_charset, self->to_charset);
@@ -2439,7 +2447,7 @@ static int php_iconv_stream_filter_append_bucket(
24392447

24402448
while (icnt > 0) {
24412449
if ((ps == NULL ? iconv(self->cd, NULL, NULL, &pd, &ocnt):
2442-
iconv(self->cd, (char **)&ps, &icnt, &pd, &ocnt)) == (size_t)-1) {
2450+
iconv(self->cd, (ICONV_CONST char **)&ps, &icnt, &pd, &ocnt)) == (size_t)-1) {
24432451
switch (errno) {
24442452
case EILSEQ:
24452453
php_error_docref(NULL, E_WARNING, "iconv stream filter (\"%s\"=>\"%s\"): invalid multibyte sequence", self->from_charset, self->to_charset);

0 commit comments

Comments
 (0)