+4445. [cleanup] isc_errno_toresult() can now be used to call the
+ formerly private function isc__errno2result().
+ [RT #43050]
+
+4444. [bug] Fixed some issues related to dyndb: A bug caused
+ braces to be omitted when passing configuration text
+ from named.conf to a dyndb driver, and there was a
+ use-after-free in the sample dyndb driver. [RT #43050]
+
4443. [func] Set TCP_MAXSEG in addition to IPV6_USE_MIN_MTU on
TCP sockets. [RT #42864]
algorithm "hmac-md5";
secret "qwertyuiopasdfgh";
};
+dyndb "name" "library.so" {
+ this;
+ \};
+ is a {
+ "test" { \{ of; the; };
+ } bracketed;
+ "text \"";
+ system;
+};
CHECKED_MEM_GET_PTR(mctx, inst);
ZERO_PTR(inst);
- inst->db_name = db_name; /* const during lifetime of inst */
isc_mem_attach(mctx, &inst->mctx);
+ inst->db_name = isc_mem_strdup(mctx, db_name);
+ if (inst->db_name == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+
dns_fixedname_init(&inst->zone1_fn);
inst->zone1_name = dns_fixedname_name(&inst->zone1_fn);
if (inst == NULL)
return;
+ if (inst->db_name != NULL)
+ isc_mem_free(inst->mctx, inst->db_name);
if (inst->zone1 != NULL)
dns_zone_detach(&inst->zone1);
if (inst->zone2 != NULL)
struct sample_instance {
isc_mem_t *mctx;
- const char *db_name;
+ char *db_name;
dns_dbimplementation_t *db_imp;
/* These are needed for zone creation. */
# Alphabetically
UNIXOBJS = @ISC_ISCIPV6_O@ @ISC_ISCPK11_API_O@ \
- unix/app.@O@ unix/dir.@O@ unix/entropy.@O@ \
+ unix/app.@O@ unix/dir.@O@ unix/entropy.@O@ unix/errno.@O@ \
unix/errno2result.@O@ unix/file.@O@ unix/fsaccess.@O@ \
unix/interfaceiter.@O@ unix/keyboard.@O@ unix/meminfo.@O@ \
unix/net.@O@ unix/os.@O@ unix/resource.@O@ unix/socket.@O@ \
THREADOBJS = @THREADOPTOBJS@ @ISC_THREAD_DIR@/thread.@O@
-WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/file.@O@ \
- win32/fsaccess.@O@ win32/meminfo.@O@ win32/once.@O@ \
+WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/errno.@O@ \
+ win32/file.@O@ win32/fsaccess.@O@ \
+ win32/meminfo.@O@ win32/once.@O@ \
win32/stdtime.@O@ win32/thread.@O@ win32/time.@O@
# Alphabetically
--- /dev/null
+/*
+ * Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef ISC_ERRNO_H
+#define ISC_ERRNO_H 1
+
+/*! \file isc/file.h */
+
+#include <isc/types.h>
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+isc_errno_toresult(int err);
+/*!<
+ * \brief Convert a POSIX errno value to an ISC result code.
+ */
+ISC_LANG_ENDDECLS
+
+#endif /* ISC_ERRNO_H */
if (c == '{') {
if (escaped) {
escaped = ISC_FALSE;
- INSIST(prev != NULL);
- *prev = '{';
} else {
lex->brace_count++;
}
} else if (c == '}') {
if (escaped) {
escaped = ISC_FALSE;
- INSIST(prev != NULL);
- *prev = '}';
- break;
+ } else {
+ INSIST(lex->brace_count > 0);
+ lex->brace_count--;
}
- INSIST(lex->brace_count > 0);
- lex->brace_count--;
- if (lex->brace_count > 0)
+ if (lex->brace_count == 0) {
+ tokenp->type = isc_tokentype_btext;
+ tokenp->value.as_textregion.base =
+ lex->data;
+ tokenp->value.as_textregion.length =
+ (unsigned int) (lex->max_token -
+ remaining);
+ no_comments = ISC_FALSE;
+ done = ISC_TRUE;
break;
-
- tokenp->type = isc_tokentype_btext;
- tokenp->value.as_textregion.base = lex->data;
- tokenp->value.as_textregion.length =
- (unsigned int) (lex->max_token -
- remaining);
- no_comments = ISC_FALSE;
- done = ISC_TRUE;
- } else {
- if (c == '\\' && !escaped)
- escaped = ISC_TRUE;
- else
- escaped = ISC_FALSE;
- if (remaining == 0U) {
- result = grow_data(lex, &remaining,
- &curr, &prev);
- if (result != ISC_R_SUCCESS)
- goto done;
}
- INSIST(remaining > 0U);
- prev = curr;
- *curr++ = c;
- *curr = '\0';
- remaining--;
}
+
+ if (c == '\\' && !escaped)
+ escaped = ISC_TRUE;
+ else
+ escaped = ISC_FALSE;
+
+ if (remaining == 0U) {
+ result = grow_data(lex, &remaining,
+ &curr, &prev);
+ if (result != ISC_R_SUCCESS)
+ goto done;
+ }
+ INSIST(remaining > 0U);
+ prev = curr;
+ *curr++ = c;
+ *curr = '\0';
+ remaining--;
break;
default:
FATAL_ERROR(__FILE__, __LINE__,
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-# $Id$
-
srcdir = @srcdir@
VPATH = @srcdir@
top_srcdir = @top_srcdir@
parse_test.c pool_test.c print_test.c regex_test.c \
socket_test.c safe_test.c time_test.c aes_test.c \
file_test.c buffer_test.c counter_test.c mem_test.c \
- result_test.c ht_test.c
+ result_test.c ht_test.c errno_test.c
SUBDIRS =
TARGETS = taskpool_test@EXEEXT@ socket_test@EXEEXT@ hash_test@EXEEXT@ \
print_test@EXEEXT@ regex_test@EXEEXT@ socket_test@EXEEXT@ \
safe_test@EXEEXT@ time_test@EXEEXT@ aes_test@EXEEXT@ \
file_test@EXEEXT@ buffer_test@EXEEXT@ counter_test@EXEEXT@ \
- mem_test@EXEEXT@ result_test@EXEEXT@ ht_test@EXEEXT@
+ mem_test@EXEEXT@ result_test@EXEEXT@ ht_test@EXEEXT@ \
+ errno_test@EXEEXT@
@BIND9_MAKE_RULES@
${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
ht_test.@O@ ${ISCLIBS} ${LIBS}
+errno_test@EXEEXT@: errno_test.@O@ ${ISCDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ errno_test.@O@ ${ISCLIBS} ${LIBS}
+
unit::
sh ${top_srcdir}/unit/unittest.sh
--- /dev/null
+/*
+ * Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <sys/errno.h>
+
+#include <atf-c.h>
+
+#include <isc/errno.h>
+#include <isc/result.h>
+
+typedef struct {
+ int err;
+ isc_result_t result;
+} testpair_t;
+
+testpair_t testpair[] = {
+ { EPERM, ISC_R_NOPERM },
+ { ENOENT, ISC_R_FILENOTFOUND },
+ { EIO, ISC_R_IOERROR },
+ { EBADF, ISC_R_INVALIDFILE },
+ { ENOMEM, ISC_R_NOMEMORY },
+ { EACCES, ISC_R_NOPERM },
+ { EEXIST, ISC_R_FILEEXISTS },
+ { ENOTDIR, ISC_R_INVALIDFILE },
+ { EINVAL, ISC_R_INVALIDFILE },
+ { ENFILE, ISC_R_TOOMANYOPENFILES },
+ { EMFILE, ISC_R_TOOMANYOPENFILES },
+ { EPIPE, ISC_R_CONNECTIONRESET },
+ { ENAMETOOLONG, ISC_R_INVALIDFILE },
+ { ELOOP, ISC_R_INVALIDFILE },
+#ifdef EOVERFLOW
+ { EOVERFLOW, ISC_R_RANGE },
+#endif
+#ifdef EAFNOSUPPORT
+ { EAFNOSUPPORT, ISC_R_FAMILYNOSUPPORT },
+#endif
+#ifdef EADDRINUSE
+ { EADDRINUSE, ISC_R_ADDRINUSE },
+#endif
+ { EADDRNOTAVAIL, ISC_R_ADDRNOTAVAIL },
+#ifdef ENETDOWN
+ { ENETDOWN, ISC_R_NETDOWN },
+#endif
+#ifdef ENETUNREACH
+ { ENETUNREACH, ISC_R_NETUNREACH },
+#endif
+#ifdef ECONNABORTED
+ { ECONNABORTED, ISC_R_CONNECTIONRESET },
+#endif
+#ifdef ECONNRESET
+ { ECONNRESET, ISC_R_CONNECTIONRESET },
+#endif
+#ifdef ENOBUFS
+ { ENOBUFS, ISC_R_NORESOURCES },
+#endif
+#ifdef ENOTCONN
+ { ENOTCONN, ISC_R_NOTCONNECTED },
+#endif
+#ifdef ETIMEDOUT
+ { ETIMEDOUT, ISC_R_TIMEDOUT },
+#endif
+ { ECONNREFUSED, ISC_R_CONNREFUSED },
+#ifdef EHOSTDOWN
+ { EHOSTDOWN, ISC_R_HOSTDOWN },
+#endif
+#ifdef EHOSTUNREACH
+ { EHOSTUNREACH, ISC_R_HOSTUNREACH },
+#endif
+ { 0, ISC_R_UNEXPECTED }
+};
+
+ATF_TC(isc_errno_toresult);
+ATF_TC_HEAD(isc_errno_toresult, tc) {
+ atf_tc_set_md_var(tc, "descr", "convert errno to ISC result");
+}
+ATF_TC_BODY(isc_errno_toresult, tc) {
+ isc_result_t result, expect;
+ size_t i;
+
+ for (i = 0; i < sizeof(testpair)/sizeof(testpair[0]); i++) {
+ result = isc_errno_toresult(testpair[i].err);
+ expect = testpair[i].result;
+ ATF_CHECK(result == expect);
+ }
+}
+
+/*
+ * Main
+ */
+ATF_TP_ADD_TCS(tp) {
+ ATF_TP_ADD_TC(tp, isc_errno_toresult);
+ return (atf_no_error());
+}
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-# $Id: Makefile.in,v 1.44 2009/12/05 23:31:41 each Exp $
-
srcdir = @srcdir@
VPATH = @srcdir@
top_srcdir = @top_srcdir@
# Alphabetically
OBJS = @ISC_IPV6_O@ @ISC_PK11_API_O@ \
- app.@O@ dir.@O@ entropy.@O@ errno2result.@O@ file.@O@ \
- fsaccess.@O@ interfaceiter.@O@ keyboard.@O@ meminfo.@O@ \
+ app.@O@ dir.@O@ entropy.@O@ errno.@O@ errno2result.@O@ \
+ file.@O@ fsaccess.@O@ interfaceiter.@O@ \
+ keyboard.@O@ meminfo.@O@ \
net.@O@ os.@O@ resource.@O@ socket.@O@ stdio.@O@ stdtime.@O@ \
strerror.@O@ syslog.@O@ time.@O@
# Alphabetically
SRCS = @ISC_IPV6_C@ @ISC_PK11_API_C@ \
- app.c dir.c entropy.c errno2result.c file.c \
- fsaccess.c interfaceiter.c keyboard.c meminfo.c \
+ app.c dir.c entropy.c errno.c errno2result.c \
+ file.c fsaccess.c interfaceiter.c keyboard.c meminfo.c \
net.c os.c resource.c socket.c stdio.c stdtime.c \
strerror.c syslog.c time.c
--- /dev/null
+/*
+ * Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <isc/errno.h>
+#include <isc/util.h>
+
+#include "errno2result.h"
+
+isc_result_t
+isc_errno_toresult(int err) {
+ return (isc___errno2result(err, ISC_FALSE, 0, 0));
+}
* not already there.
*/
isc_result_t
-isc___errno2result(int posixerrno, const char *file, unsigned int line) {
+isc___errno2result(int posixerrno, isc_boolean_t dolog,
+ const char *file, unsigned int line)
+{
char strbuf[ISC_STRERRORSIZE];
switch (posixerrno) {
case ECONNREFUSED:
return (ISC_R_CONNREFUSED);
default:
- isc__strerror(posixerrno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(file, line, "unable to convert errno "
- "to isc_result: %d: %s",
- posixerrno, strbuf);
+ if (dolog) {
+ isc__strerror(posixerrno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(file, line, "unable to convert errno "
+ "to isc_result: %d: %s",
+ posixerrno, strbuf);
+ }
/*
* XXXDCL would be nice if perhaps this function could
* return the system's error string, so the caller
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-/* $Id$ */
-
#ifndef UNIX_ERRNO2RESULT_H
#define UNIX_ERRNO2RESULT_H 1
ISC_LANG_BEGINDECLS
-#define isc__errno2result(x) isc___errno2result(x, __FILE__, __LINE__)
+#define isc__errno2result(x) isc___errno2result(x, ISC_TRUE, __FILE__, __LINE__)
isc_result_t
-isc___errno2result(int posixerrno, const char *file, unsigned int line);
+isc___errno2result(int posixerrno, isc_boolean_t dolog,
+ const char *file, unsigned int line);
ISC_LANG_ENDDECLS
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-# $Id: Makefile.in,v 1.14 2009/12/05 23:31:41 each Exp $
-
srcdir = @srcdir@
VPATH = @srcdir@
top_srcdir = @top_srcdir@
CWARNINGS =
# Alphabetically
-OBJS = condition.@O@ dir.@O@ file.@O@ meminfo.@O@ fsaccess.@O@ \
+OBJS = condition.@O@ dir.@O@ errno.@O@ file.@O@ \
+ meminfo.@O@ fsaccess.@O@ \
once.@O@ stdtime.@O@ thread.@O@ time.@O@ @ISC_PK11_API_O@
# Alphabetically
-SRCS = condition.c dir.c file.c meminfo.c once.c fsaccess.c \
+SRCS = condition.c dir.c errno.c file.c \
+ meminfo.c once.c fsaccess.c \
stdtime.c thread.c time.c @ISC_PK11_API_C@
SUBDIRS = include
--- /dev/null
+/*
+ * Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/*! \file */
+
+#include <config.h>
+
+#include "errno2result.h"
+
+isc_result_t
+isc_errno_toresult(int err) {
+ return (isc__errno2resultx(err, ISC_FALSE, 0, 0));
+}
* not already there.
*/
isc_result_t
-isc__errno2resultx(int posixerrno, const char *file, int line) {
+isc__errno2resultx(int posixerrno, isc_boolean_t dolog,
+ const char *file, int line)
+{
char strbuf[ISC_STRERRORSIZE];
switch (posixerrno) {
case WSAENOBUFS:
return (ISC_R_NORESOURCES);
default:
- isc__strerror(posixerrno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(file, line, "unable to convert errno "
- "to isc_result: %d: %s", posixerrno, strbuf);
+ if (dolog) {
+ isc__strerror(posixerrno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(file, line,
+ "unable to convert errno "
+ "to isc_result: %d: %s",
+ posixerrno, strbuf);
+ }
/*
* XXXDCL would be nice if perhaps this function could
* return the system's error string, so the caller
ISC_LANG_BEGINDECLS
#define isc__errno2result(posixerrno) \
- isc__errno2resultx(posixerrno, __FILE__, __LINE__)
+ isc__errno2resultx(posixerrno, ISC_TRUE, __FILE__, __LINE__)
isc_result_t
-isc__errno2resultx(int posixerrno, const char *file, int line);
+isc__errno2resultx(int posixerrno, isc_boolean_t dolog,
+ const char *file, int line);
ISC_LANG_ENDDECLS
# End Source File
# Begin Source File
+SOURCE=.\errno.c
+# End Source File
+# Begin Source File
+
SOURCE=.\errno2result.c
# End Source File
# Begin Source File
# End Source File
# Begin Source File
+SOURCE=..\include\isc\errno.h
+# End Source File
+# Begin Source File
+
SOURCE=.\errno2result.h
# End Source File
# Begin Source File
-@erase "$(INTDIR)\dir.obj"
-@erase "$(INTDIR)\DLLMain.obj"
-@erase "$(INTDIR)\entropy.obj"
+ -@erase "$(INTDIR)\errno.obj"
-@erase "$(INTDIR)\errno2result.obj"
-@erase "$(INTDIR)\error.obj"
-@erase "$(INTDIR)\event.obj"
"$(INTDIR)\dir.obj" \
"$(INTDIR)\DLLMain.obj" \
"$(INTDIR)\entropy.obj" \
+ "$(INTDIR)\errno.obj" \
"$(INTDIR)\errno2result.obj" \
"$(INTDIR)\file.obj" \
"$(INTDIR)\fsaccess.obj" \
-@erase "$(INTDIR)\DLLMain.sbr"
-@erase "$(INTDIR)\entropy.obj"
-@erase "$(INTDIR)\entropy.sbr"
+ -@erase "$(INTDIR)\errno.obj"
+ -@erase "$(INTDIR)\errno.sbr"
-@erase "$(INTDIR)\errno2result.obj"
-@erase "$(INTDIR)\errno2result.sbr"
-@erase "$(INTDIR)\error.obj"
"$(INTDIR)\dir.sbr" \
"$(INTDIR)\DLLMain.sbr" \
"$(INTDIR)\entropy.sbr" \
+ "$(INTDIR)\errno.sbr" \
"$(INTDIR)\errno2result.sbr" \
"$(INTDIR)\file.sbr" \
"$(INTDIR)\fsaccess.sbr" \
"$(INTDIR)\dir.obj" \
"$(INTDIR)\DLLMain.obj" \
"$(INTDIR)\entropy.obj" \
+ "$(INTDIR)\errno.obj" \
"$(INTDIR)\errno2result.obj" \
"$(INTDIR)\file.obj" \
"$(INTDIR)\fsaccess.obj" \
!ENDIF
+SOURCE=.\errno.c
+
+!IF "$(CFG)" == "libisc - @PLATFORM@ Release"
+
+
+"$(INTDIR)\errno.obj" : $(SOURCE) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "libisc - @PLATFORM@ Debug"
+
+
+"$(INTDIR)\errno.obj" "$(INTDIR)\errno.sbr" : $(SOURCE) "$(INTDIR)"
+
+
+!ENDIF
+
+
SOURCE=.\errno2result.c
!IF "$(CFG)" == "libisc - @PLATFORM@ Release"
<ClInclude Include="..\include\isc\entropy.h">
<Filter>Library Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\include\isc\errno.h">
+ <Filter>Library Header Files</Filter>
+ </ClInclude>
<ClInclude Include="..\include\isc\error.h">
<Filter>Library Header Files</Filter>
</ClInclude>
<ClCompile Include="entropy.c">
<Filter>Win32 Source Files</Filter>
</ClCompile>
+ <ClCompile Include="errno.c">
+ <Filter>Win32 Source Files</Filter>
+ </ClCompile>
<ClCompile Include="errno2result.c">
<Filter>Win32 Source Files</Filter>
</ClCompile>
<ClInclude Include="..\include\isc\counter.h" />
<ClInclude Include="..\include\isc\crc64.h" />
<ClInclude Include="..\include\isc\entropy.h" />
+ <ClInclude Include="..\include\isc\errno.h" />
<ClInclude Include="..\include\isc\error.h" />
<ClInclude Include="..\include\isc\event.h" />
<ClInclude Include="..\include\isc\eventclass.h" />
<ClCompile Include="dir.c" />
<ClCompile Include="DLLMain.c" />
<ClCompile Include="entropy.c" />
+ <ClCompile Include="errno.c" />
<ClCompile Include="errno2result.c" />
<ClCompile Include="file.c" />
<ClCompile Include="fsaccess.c" />
* Did the I/O operation complete?
*/
errstatus = GetLastError();
- isc_result = isc__errno2resultx(errstatus, __FILE__, __LINE__);
+ isc_result = isc__errno2result(errstatus);
LOCK(&sock->lock);
CONSISTENT(sock);
goto wait_again;
} else {
errstatus = GetLastError();
- isc_result = isc__errno2resultx(errstatus, __FILE__, __LINE__);
+ isc_result = isc__errno2result(errstatus);
socket_log(__LINE__, sock, NULL, EVENT, NULL, 0, 0,
"restart_accept() failed: errstatus=%d isc_result=%d",
errstatus, isc_result);