From bad74ac0e89c284997e600f1769d43a36b1f8e84 Mon Sep 17 00:00:00 2001 From: Marlus Saraiva Date: Mon, 11 Jul 2016 23:33:13 +0000 Subject: community/erlang: upgrade to 19.0.1 --- ...at-man-pages-and-do-not-install-miscellan.patch | 37 - community/erlang/0002-Remove-rpath.patch | 28 - .../erlang/0003-Do-not-install-C-sources.patch | 143 -- .../erlang/0004-Do-not-install-Java-sources.patch | 28 - .../0006-Do-not-install-erlang-sources.patch | 840 --------- ...7-Split-off-webtool-dependency-from-tools.patch | 38 - .../erlang/0015-otp-update-version-19.0.1.patch | 1233 +++++++++++++ .../0060-set-disksup_posix_only-to-true.patch | 22 - .../erlang/0070-otp-update-version-18.3.2.patch | 1887 -------------------- community/erlang/APKBUILD | 54 +- 10 files changed, 1243 insertions(+), 3067 deletions(-) delete mode 100644 community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch delete mode 100644 community/erlang/0002-Remove-rpath.patch delete mode 100644 community/erlang/0003-Do-not-install-C-sources.patch delete mode 100644 community/erlang/0004-Do-not-install-Java-sources.patch delete mode 100644 community/erlang/0006-Do-not-install-erlang-sources.patch delete mode 100644 community/erlang/0007-Split-off-webtool-dependency-from-tools.patch create mode 100644 community/erlang/0015-otp-update-version-19.0.1.patch delete mode 100644 community/erlang/0060-set-disksup_posix_only-to-true.patch delete mode 100644 community/erlang/0070-otp-update-version-18.3.2.patch (limited to 'community') diff --git a/community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch b/community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch deleted file mode 100644 index fef4a7ff98..0000000000 --- a/community/erlang/0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Peter Lemenkov -Date: Thu, 25 Feb 2010 16:45:28 +0300 -Subject: [PATCH] Do not format man-pages and do not install miscellaneous - utilities for dealing with man-pages. - -Signed-off-by: Peter Lemenkov - ---- otp_src_18.0-orig/erts/etc/common/Makefile.in -+++ otp_src_18.0-fixed/erts/etc/common/Makefile.in -@@ -551,10 +551,6 @@ - ifneq ($(INSTALL_TOP_BIN),) - $(INSTALL_PROGRAM) $(INSTALL_TOP_BIN) "$(RELEASE_PATH)" - endif --ifneq ($(INSTALL_MISC),) -- $(INSTALL_DIR) "$(RELEASE_PATH)/misc" -- $(INSTALL_SCRIPT) $(INSTALL_MISC) "$(RELEASE_PATH)/misc" --endif - ifneq ($(INSTALL_SRC),) - $(INSTALL_DIR) "$(RELEASE_PATH)/erts-$(VSN)/src" - $(INSTALL_DATA) $(INSTALL_SRC) "$(RELEASE_PATH)/erts-$(VSN)/src" ---- otp_src_18.0-orig/erts/etc/unix/Install.src -+++ otp_src_18.0-fixed/erts/etc/unix/Install.src -@@ -141,14 +141,5 @@ - cp -p ../releases/%I_SYSTEM_VSN%/no_dot_erlang.boot . - cp -p $Name.boot start.boot - cp -p ../releases/%I_SYSTEM_VSN%/$Name.script start.script --# --# Fixing the man pages --# -- --if [ -d "$ERL_ROOT/man" ] --then -- cd "$ERL_ROOT" -- ./misc/format_man_pages "$ERL_ROOT" --fi - - exit 0 diff --git a/community/erlang/0002-Remove-rpath.patch b/community/erlang/0002-Remove-rpath.patch deleted file mode 100644 index 71658fe396..0000000000 --- a/community/erlang/0002-Remove-rpath.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Peter Lemenkov -Date: Thu, 25 Feb 2010 16:57:43 +0300 -Subject: [PATCH] Remove rpath - -Signed-off-by: Peter Lemenkov - ---- otp_src_18.0-orig/lib/crypto/c_src/Makefile.in -+++ otp_src_18.0-fixed/lib/crypto/c_src/Makefile.in -@@ -90,7 +90,7 @@ - DYNAMIC_CRYPTO_LIB=@SSL_DYNAMIC_ONLY@ - - ifeq ($(DYNAMIC_CRYPTO_LIB),yes) --SSL_DED_LD_RUNTIME_LIBRARY_PATH = @SSL_DED_LD_RUNTIME_LIBRARY_PATH@ -+SSL_DED_LD_RUNTIME_LIBRARY_PATH = - CRYPTO_LINK_LIB=$(SSL_DED_LD_RUNTIME_LIBRARY_PATH) -L$(SSL_LIBDIR) -l$(SSL_CRYPTO_LIBNAME) - EXTRA_FLAGS = -DHAVE_DYNAMIC_CRYPTO_LIB - else ---- otp_src_18.0-orig/lib/crypto/priv/Makefile -+++ otp_src_18.0-fixed/lib/crypto/priv/Makefile -@@ -61,7 +61,7 @@ - # ---------------------------------------------------- - - $(SO_NIFLIB): $(OBJS) -- $(SO_LD) $(SO_LDFLAGS) -L$(SO_SSL_LIBDIR) -Wl,-R$(SO_SSL_LIBDIR) \ -+ $(SO_LD) $(SO_LDFLAGS) -L$(SO_SSL_LIBDIR) \ - -o $@ $^ -lcrypto - - $(DLL_NIFLIB): $(OBJS) diff --git a/community/erlang/0003-Do-not-install-C-sources.patch b/community/erlang/0003-Do-not-install-C-sources.patch deleted file mode 100644 index 364c4ad790..0000000000 --- a/community/erlang/0003-Do-not-install-C-sources.patch +++ /dev/null @@ -1,143 +0,0 @@ -From: Peter Lemenkov -Date: Fri, 18 Jun 2010 23:41:33 +0400 -Subject: [PATCH] Do not install C sources - -Don't install *.c and *.o files. - -Excepts ones from the internal erl_interface. These -API headers are necessary. See rhbz #818419 for the -explanation why they're necessary for the low-level -interaction with the Erlang nodes: - -https://bugzilla.redhat.com/818419 - -Signed-off-by: Peter Lemenkov - ---- otp_src_18.0-orig/lib/asn1/c_src/Makefile -+++ otp_src_18.0-fixed/lib/asn1/c_src/Makefile -@@ -143,8 +143,6 @@ - ifneq ($(findstring ose,$(TARGET)),ose) - $(INSTALL_PROGRAM) $(NIF_SHARED_OBJ_FILE) "$(RELSYSDIR)/priv/lib" - endif -- $(INSTALL_DIR) "$(RELSYSDIR)/c_src" -- $(INSTALL_DATA) *.c "$(RELSYSDIR)/c_src" - - release_docs_spec: - ---- otp_src_18.0-orig/lib/crypto/c_src/Makefile.in -+++ otp_src_18.0-fixed/lib/crypto/c_src/Makefile.in -@@ -200,14 +200,10 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/priv/obj" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/lib" -- $(INSTALL_DATA) $(NIF_MAKEFILE) "$(RELSYSDIR)/priv/obj" - ifneq ($(findstring ose,$(TARGET)),ose) -- $(INSTALL_PROGRAM) $(CRYPTO_OBJS) "$(RELSYSDIR)/priv/obj" - $(INSTALL_PROGRAM) $(NIF_LIB) "$(RELSYSDIR)/priv/lib" - ifeq ($(DYNAMIC_CRYPTO_LIB),yes) -- $(INSTALL_PROGRAM) $(CALLBACK_OBJS) "$(RELSYSDIR)/priv/obj" - $(INSTALL_PROGRAM) $(CALLBACK_LIB) "$(RELSYSDIR)/priv/lib" - endif - endif ---- otp_src_18.0-orig/lib/erl_interface/src/Makefile.in -+++ otp_src_18.0-fixed/lib/erl_interface/src/Makefile.in -@@ -905,14 +905,14 @@ - $(INSTALL_PROGRAM) $(EXE_TARGETS) "$(RELSYSDIR)/bin" - endif - $(INSTALL_DATA) $(EXTRA) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) connect/*.[ch] "$(RELSYSDIR)/src/connect" -- $(INSTALL_DATA) decode/*.[ch] "$(RELSYSDIR)/src/decode" -- $(INSTALL_DATA) encode/*.[ch] "$(RELSYSDIR)/src/encode" -- $(INSTALL_DATA) epmd/*.[ch] "$(RELSYSDIR)/src/epmd" -- $(INSTALL_DATA) misc/*.[ch] "$(RELSYSDIR)/src/misc" -- $(INSTALL_DATA) registry/*.[ch] "$(RELSYSDIR)/src/registry" -- $(INSTALL_DATA) legacy/*.[ch] "$(RELSYSDIR)/src/legacy" -- $(INSTALL_DATA) prog/*.[ch] "$(RELSYSDIR)/src/prog" -+ $(INSTALL_DATA) connect/*.h "$(RELSYSDIR)/src/connect" -+ $(INSTALL_DATA) decode/*.h "$(RELSYSDIR)/src/decode" -+ $(INSTALL_DATA) encode/*.h "$(RELSYSDIR)/src/encode" -+ $(INSTALL_DATA) epmd/*.h "$(RELSYSDIR)/src/epmd" -+ $(INSTALL_DATA) misc/*.h "$(RELSYSDIR)/src/misc" -+ $(INSTALL_DATA) registry/*.h "$(RELSYSDIR)/src/registry" -+ $(INSTALL_DATA) legacy/*.h "$(RELSYSDIR)/src/legacy" -+ $(INSTALL_DATA) prog/*.h "$(RELSYSDIR)/src/prog" - - release_docs: - ---- otp_src_18.0-orig/lib/ic/c_src/Makefile.in -+++ otp_src_18.0-fixed/lib/ic/c_src/Makefile.in -@@ -145,12 +145,10 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/c_src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/lib" - $(INSTALL_DIR) "$(RELEASE_PATH)/usr/include" - $(INSTALL_DIR) "$(RELEASE_PATH)/usr/lib" -- $(INSTALL_DATA) ic.c ic_tmo.c "$(RELSYSDIR)/c_src" - $(INSTALL_DATA) $(IDL_FILES) $(H_FILES) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(LIBRARY) "$(RELSYSDIR)/priv/lib" - $(INSTALL_DATA) $(IDL_FILES) $(H_FILES) "$(RELEASE_PATH)/usr/include" ---- otp_src_18.0-orig/lib/megaco/src/flex/Makefile.in -+++ otp_src_18.0-fixed/lib/megaco/src/flex/Makefile.in -@@ -271,7 +271,7 @@ - $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/flex" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ifeq ($(ENABLE_MEGACO_FLEX_SCANNER),true) -- $(INSTALL_DATA) $(FLEX_FILES) $(C_TARGETS) "$(RELSYSDIR)/src/flex" -+ $(INSTALL_DATA) $(FLEX_FILES) "$(RELSYSDIR)/src/flex" - $(INSTALL_PROGRAM) $(SOLIBS) "$(RELSYSDIR)/priv/lib" - endif - ---- otp_src_18.0-orig/lib/odbc/c_src/Makefile.in -+++ otp_src_18.0-fixed/lib/odbc/c_src/Makefile.in -@@ -129,11 +129,8 @@ - - release_spec: opt - ifdef EXE_TARGET -- $(INSTALL_DIR) "$(RELSYSDIR)/c_src" -- $(INSTALL_DATA) $(C_FILES) $(H_FILES) "$(RELSYSDIR)/c_src" - $(INSTALL_DIR) "$(RELSYSDIR)/priv" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/bin" -- $(INSTALL_DIR) "$(RELSYSDIR)/priv/obj" - $(INSTALL_PROGRAM) $(EXE_TARGET) "$(RELSYSDIR)/priv/bin" - endif - ---- otp_src_18.0-orig/lib/os_mon/c_src/Makefile.in -+++ otp_src_18.0-fixed/lib/os_mon/c_src/Makefile.in -@@ -126,8 +126,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(C_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/bin" - $(INSTALL_PROGRAM) $(TARGET_FILES) "$(RELSYSDIR)/priv/bin" - ---- otp_src_18.0-orig/lib/runtime_tools/c_src/Makefile.in -+++ otp_src_18.0-fixed/lib/runtime_tools/c_src/Makefile.in -@@ -157,10 +157,8 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/priv/obj" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/lib" - ifneq ($(findstring ose,$(TARGET)),ose) -- $(INSTALL_PROGRAM) $(DYNTRACE_OBJS) "$(RELSYSDIR)/priv/obj" - $(INSTALL_PROGRAM) $(NIF_LIB) $(SOLIBS) "$(RELSYSDIR)/priv/lib" - endif - ---- otp_src_18.0-orig/lib/tools/c_src/Makefile.in -+++ otp_src_18.0-fixed/lib/tools/c_src/Makefile.in -@@ -198,8 +198,6 @@ - RELSYSDIR = $(RELEASE_PATH)/lib/tools-$(TOOLS_VSN) - - release_spec: all -- $(INSTALL_DIR) "$(RELSYSDIR)/c_src" -- $(INSTALL_DATA) $(EMEM_SRCS) $(EMEM_HEADERS) "$(RELSYSDIR)/c_src" - ifneq ($(PROGS),) - $(INSTALL_DIR) "$(RELSYSDIR)/bin" - $(INSTALL_PROGRAM) $(PROGS) "$(RELSYSDIR)/bin" diff --git a/community/erlang/0004-Do-not-install-Java-sources.patch b/community/erlang/0004-Do-not-install-Java-sources.patch deleted file mode 100644 index 799476c8c6..0000000000 --- a/community/erlang/0004-Do-not-install-Java-sources.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Peter Lemenkov -Date: Sat, 19 Jun 2010 09:25:18 +0400 -Subject: [PATCH] Do not install Java sources - -Signed-off-by: Peter Lemenkov - ---- otp_src_18.0-orig/lib/ic/java_src/com/ericsson/otp/ic/Makefile -+++ otp_src_18.0-fixed/lib/ic/java_src/com/ericsson/otp/ic/Makefile -@@ -113,8 +113,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/java_src/com/ericsson/otp/ic" -- $(INSTALL_DATA) $(JAVA_FILES) "$(RELSYSDIR)/java_src/com/ericsson/otp/ic" - $(INSTALL_DIR) "$(RELSYSDIR)/priv" - $(INSTALL_DATA) $(JAVA_DEST_ROOT)$(JARFILE) "$(RELSYSDIR)/priv" - ---- otp_src_18.0-orig/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile -+++ otp_src_18.0-fixed/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile -@@ -120,8 +120,6 @@ - $(V_at)$(MAKE) $(MFLAGS) RELEASE_PATH="$(RELEASE_PATH)" $(TARGET_MAKEFILE) $@_spec - - release_spec: opt -- $(V_at)$(INSTALL_DIR) "$(RELSYSDIR)/java_src/com/ericsson/otp/erlang" -- $(V_at)$(INSTALL_DATA) $(JAVA_SRC) "$(RELSYSDIR)/java_src/com/ericsson/otp/erlang" - $(V_at)$(INSTALL_DIR) "$(RELSYSDIR)/priv" - $(V_at)$(INSTALL_DATA) $(JAVA_DEST_ROOT)$(JARFILE) "$(RELSYSDIR)/priv" - $(V_at)$(INSTALL_DIR) "$(RELSYSDIR)/ebin" diff --git a/community/erlang/0006-Do-not-install-erlang-sources.patch b/community/erlang/0006-Do-not-install-erlang-sources.patch deleted file mode 100644 index d264665e90..0000000000 --- a/community/erlang/0006-Do-not-install-erlang-sources.patch +++ /dev/null @@ -1,840 +0,0 @@ ---- otp_src_18.3-orig/erts/preloaded/src/Makefile -+++ otp_src_18.3-fixed/erts/preloaded/src/Makefile -@@ -86,8 +86,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: $(APP_TARGET) -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(BEAM_FILES) $(STUBS_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(STATIC_TARGET_FILES) $(APP_TARGET) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/asn1/src/Makefile -+++ otp_src_18.3-fixed/lib/asn1/src/Makefile -@@ -155,7 +155,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(APP_SRC) $(APPUP_SRC) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/examples" - $(INSTALL_DATA) $(EXAMPLES) "$(RELSYSDIR)/examples" - ---- otp_src_18.3-orig/lib/common_test/src/Makefile -+++ otp_src_18.3-fixed/lib/common_test/src/Makefile -@@ -144,7 +144,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/compiler/src/Makefile -+++ otp_src_18.3-fixed/lib/compiler/src/Makefile -@@ -172,8 +172,8 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(EXTRA_FILES) \ -- $(YRL_FILE) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) $(EXTRA_FILES) \ -+ "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(INSTALL_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/cosEvent/src/Makefile -+++ otp_src_18.3-fixed/lib/cosEvent/src/Makefile -@@ -203,7 +203,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/cosEventDomain/src/Makefile -+++ otp_src_18.3-fixed/lib/cosEventDomain/src/Makefile -@@ -172,7 +172,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXTERNAL_GEN_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/cosFileTransfer/src/Makefile -+++ otp_src_18.3-fixed/lib/cosFileTransfer/src/Makefile -@@ -180,9 +180,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) $(GEN_HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" -- $(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include" - - release_docs_spec: ---- otp_src_18.3-orig/lib/cosNotification/src/Makefile -+++ otp_src_18.3-fixed/lib/cosNotification/src/Makefile -@@ -371,8 +371,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) $(YECC_FILES) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(IDL_FILES) $(YECC_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(GEN_HRL_FILES) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/cosProperty/src/Makefile -+++ otp_src_18.3-fixed/lib/cosProperty/src/Makefile -@@ -180,8 +180,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(GEN_HRL_FILES) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/cosTime/src/Makefile -+++ otp_src_18.3-fixed/lib/cosTime/src/Makefile -@@ -199,8 +199,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(GEN_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(GEN_HRL_FILES) $(HRL_FILES) $(IDL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(GEN_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/cosTransactions/src/Makefile -+++ otp_src_18.3-fixed/lib/cosTransactions/src/Makefile -@@ -174,7 +174,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(GEN_ERL_FILES) $(IDL_FILE) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) $(IDL_FILE) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXTERNAL_GEN_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/crypto/src/Makefile -+++ otp_src_18.3-fixed/lib/crypto/src/Makefile -@@ -82,8 +82,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) \ - $(APPUP_TARGET) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/debugger/src/Makefile -+++ otp_src_18.3-fixed/lib/debugger/src/Makefile -@@ -117,7 +117,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) $(TOOLBOX_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(TOOLBOX_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(TARGET_TOOLBOX_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/dialyzer/src/Makefile -+++ otp_src_18.3-fixed/lib/dialyzer/src/Makefile -@@ -152,7 +152,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(EXTRA_FILES) \ -+ $(INSTALL_DATA) $(HRL_FILES) $(EXTRA_FILES) \ - "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(INSTALL_FILES) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/diameter/src/Makefile -+++ otp_src_18.3-fixed/lib/diameter/src/Makefile -@@ -251,11 +251,8 @@ - $(MAKE) $(EXAMPLE_DIRS:%/=release_examples_%) - - $(TARGET_DIRS:%/=release_src_%): release_src_%: -- $(INSTALL_DIR) "$(RELSYSDIR)/src/$*" -- $(INSTALL_DATA) $(filter $*/%, $(TARGET_MODULES:%=%.erl) \ -- $(INTERNAL_HRLS)) \ -- $(filter $*/%, compiler/$(DICT_YRL).yrl) \ -- "$(RELSYSDIR)/src/$*" -+ $(INSTALL_DATA) $(filter $*/%, $(INTERNAL_HRLS)) \ -+ "$(RELSYSDIR)/src/$*" || true - - $(EXAMPLE_DIRS:%/=release_examples_%): release_examples_%: - $(INSTALL_DIR) "$(RELSYSDIR)/examples/$*" ---- otp_src_18.3-orig/lib/edoc/src/Makefile -+++ otp_src_18.3-fixed/lib/edoc/src/Makefile -@@ -88,7 +88,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(OBJECTS) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(SOURCES) $(HRL_FILES) $(YRL_FILE) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - - release_docs_spec: - ---- otp_src_18.3-orig/lib/eldap/src/Makefile -+++ otp_src_18.3-fixed/lib/eldap/src/Makefile -@@ -99,10 +99,6 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" -- $(INSTALL_DIR) "$(RELSYSDIR)/asn1" -- $(INSTALL_DATA) ../asn1/$(ASN1_FILES) "$(RELSYSDIR)/asn1" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXTERNAL_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/erl_docgen/src/Makefile -+++ otp_src_18.3-fixed/lib/erl_docgen/src/Makefile -@@ -90,8 +90,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/et/src/Makefile -+++ otp_src_18.3-fixed/lib/et/src/Makefile -@@ -109,7 +109,6 @@ - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/eunit/src/Makefile -+++ otp_src_18.3-fixed/lib/eunit/src/Makefile -@@ -120,7 +120,6 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(PARSE_TRANSFORM_BIN) $(OBJECTS) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(PARSE_TRANSFORM) $(SOURCES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(INCLUDE_DELIVERABLES) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/gs/src/Makefile -+++ otp_src_18.3-fixed/lib/gs/src/Makefile -@@ -109,8 +109,8 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(APP_SRC) $(ERL_FILES) $(HRL_FILES) $(GEN_HRL_FILES) \ -- $(GSTK_GENERIC) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) $(GEN_HRL_FILES) \ -+ "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/bitmap" ---- otp_src_18.3-orig/lib/hipe/cerl/Makefile -+++ otp_src_18.3-fixed/lib/hipe/cerl/Makefile -@@ -102,7 +102,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/cerl" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/cerl" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/cerl" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/hipe/flow/Makefile -+++ otp_src_18.3-fixed/lib/hipe/flow/Makefile -@@ -102,7 +102,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/flow" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(INC_FILES) "$(RELSYSDIR)/flow" -+ $(INSTALL_DATA) $(HRL_FILES) $(INC_FILES) "$(RELSYSDIR)/flow" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/hipe/icode/Makefile -+++ otp_src_18.3-fixed/lib/hipe/icode/Makefile -@@ -120,7 +120,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/icode" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/icode" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/icode" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/hipe/llvm/Makefile -+++ otp_src_18.3-fixed/lib/hipe/llvm/Makefile -@@ -103,7 +103,7 @@ - - release_spec: opt - $(INSTALL_DIR) $(RELSYSDIR)/llvm -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)/llvm -+ $(INSTALL_DATA) $(HRL_FILES) $(RELSYSDIR)/llvm - $(INSTALL_DIR) $(RELSYSDIR)/ebin - $(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin - ---- otp_src_18.3-orig/lib/hipe/main/Makefile -+++ otp_src_18.3-fixed/lib/hipe/main/Makefile -@@ -118,7 +118,7 @@ - release_spec: opt - $(INSTALL_DATA) ../vsn.mk "$(RELSYSDIR)" - $(INSTALL_DIR) "$(RELSYSDIR)/main" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/main" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/main" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/hipe/misc/Makefile -+++ otp_src_18.3-fixed/lib/hipe/misc/Makefile -@@ -102,7 +102,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/misc" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/misc" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/misc" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/hipe/rtl/Makefile -+++ otp_src_18.3-fixed/lib/hipe/rtl/Makefile -@@ -105,7 +105,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/rtl" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/rtl" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/rtl" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/hipe/util/Makefile -+++ otp_src_18.3-fixed/lib/hipe/util/Makefile -@@ -50,7 +50,6 @@ - endif - MODULES = hipe_timing hipe_dot hipe_digraph $(HIPE_MODULES) - --HRL_FILES= - ERL_FILES= $(MODULES:%=%.erl) - TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) - DOC_FILES= $(MODULES:%=$(DOCS)/%.html) -@@ -104,8 +103,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/util" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/util" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/ic/src/Makefile -+++ otp_src_18.3-fixed/lib/ic/src/Makefile -@@ -200,7 +200,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(YRL_FILE) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/examples" - $(INSTALL_DIR) "$(RELSYSDIR)/examples/c-client" - $(INSTALL_DATA) $(CCL_EX_FILES) "$(RELSYSDIR)/examples/c-client" ---- otp_src_18.3-orig/lib/inets/src/ftp/Makefile -+++ otp_src_18.3-fixed/lib/inets/src/ftp/Makefile -@@ -91,7 +91,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/ftp" -- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/ftp" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/ftp" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/inets/src/http_client/Makefile -+++ otp_src_18.3-fixed/lib/inets/src/http_client/Makefile -@@ -92,7 +92,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/http_client" -- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/http_client" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/http_client" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/inets/src/http_lib/Makefile -+++ otp_src_18.3-fixed/lib/inets/src/http_lib/Makefile -@@ -90,7 +90,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/http_lib" -- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/http_lib" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/http_lib" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/inets/src/http_server/Makefile -+++ otp_src_18.3-fixed/lib/inets/src/http_server/Makefile -@@ -135,7 +135,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/http_server" -- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/http_server" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/http_server" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(BEHAVIOUR_TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/inets/src/inets_app/Makefile -+++ otp_src_18.3-fixed/lib/inets/src/inets_app/Makefile -@@ -115,7 +115,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/inets_app" -- $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/inets_app" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/inets_app" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXTERNAL_HRL_FILES) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/inets/src/tftp/Makefile -+++ otp_src_18.3-fixed/lib/inets/src/tftp/Makefile -@@ -96,7 +96,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/tftp" -- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src/tftp" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/tftp" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(BEHAVIOUR_TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/kernel/src/Makefile -+++ otp_src_18.3-fixed/lib/kernel/src/Makefile -@@ -200,7 +200,6 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/megaco/src/app/Makefile -+++ otp_src_18.3-fixed/lib/megaco/src/app/Makefile -@@ -114,7 +114,7 @@ - $(INSTALL_DATA) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/app" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/app" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/app" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXTERNAL_HRL_FILES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/megaco/src/binary/Makefile -+++ otp_src_18.3-fixed/lib/megaco/src/binary/Makefile -@@ -176,7 +176,7 @@ - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/binary" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(ASN1_FILES) "$(RELSYSDIR)/src/binary" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/binary" - - - release_docs_spec: ---- otp_src_18.3-orig/lib/megaco/src/engine/Makefile -+++ otp_src_18.3-fixed/lib/megaco/src/engine/Makefile -@@ -102,7 +102,7 @@ - $(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/engine" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/engine" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/engine" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - - ---- otp_src_18.3-orig/lib/megaco/src/flex/Makefile.in -+++ otp_src_18.3-fixed/lib/megaco/src/flex/Makefile.in -@@ -268,8 +268,6 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/src/flex" - $(INSTALL_DIR) "$(RELSYSDIR)/priv/lib" - $(INSTALL_DIR) "$(RELSYSDIR)/include" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/flex" -- $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ifeq ($(ENABLE_MEGACO_FLEX_SCANNER),true) - $(INSTALL_DATA) $(FLEX_FILES) "$(RELSYSDIR)/src/flex" - $(INSTALL_PROGRAM) $(SOLIBS) "$(RELSYSDIR)/priv/lib" ---- otp_src_18.3-orig/lib/megaco/src/tcp/Makefile -+++ otp_src_18.3-fixed/lib/megaco/src/tcp/Makefile -@@ -94,7 +94,7 @@ - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/tcp" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/tcp" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/tcp" - - - release_docs_spec: ---- otp_src_18.3-orig/lib/megaco/src/text/Makefile -+++ otp_src_18.3-fixed/lib/megaco/src/text/Makefile -@@ -135,7 +135,7 @@ - $(INSTALL_DATA) $(BEAM_TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/text" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_YRL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/text" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/text" - - - release_docs_spec: ---- otp_src_18.3-orig/lib/megaco/src/udp/Makefile -+++ otp_src_18.3-fixed/lib/megaco/src/udp/Makefile -@@ -94,7 +94,7 @@ - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/udp" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/udp" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/udp" - - - release_docs_spec: ---- otp_src_18.3-orig/lib/mnesia/src/Makefile -+++ otp_src_18.3-fixed/lib/mnesia/src/Makefile -@@ -133,7 +133,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/observer/src/Makefile -+++ otp_src_18.3-fixed/lib/observer/src/Makefile -@@ -152,7 +152,6 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/examples" - $(INSTALL_DATA) $(EXAMPLE_FILES) "$(RELSYSDIR)/examples" ---- otp_src_18.3-orig/lib/odbc/src/Makefile -+++ otp_src_18.3-fixed/lib/odbc/src/Makefile -@@ -110,7 +110,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXT_HRL_FILES) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/orber/COSS/CosNaming/Makefile -+++ otp_src_18.3-fixed/lib/orber/COSS/CosNaming/Makefile -@@ -145,8 +145,8 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/COSS/CosNaming" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(IDL_FILE) "$(RELSYSDIR)/COSS/CosNaming" -- $(INSTALL_DATA) $(GEN_FILES) "$(RELSYSDIR)/COSS/CosNaming" -+ $(INSTALL_DATA) $(HRL_FILES) $(IDL_FILE) "$(RELSYSDIR)/COSS/CosNaming" -+ $(INSTALL_DATA) $(GEN_HRL_FILES) $(GEN_EXT_HRL_FILES) "$(RELSYSDIR)/COSS/CosNaming" - - - release_docs_spec: ---- otp_src_18.3-orig/lib/orber/src/Makefile -+++ otp_src_18.3-fixed/lib/orber/src/Makefile -@@ -253,7 +253,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(YRL_FILE) $(GEN_HRL_FILES_LOC) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(GEN_HRL_FILES_LOC) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXTERNAL_HRL_FILES) $(GEN_HRL_FILES_EXT) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/os_mon/src/Makefile -+++ otp_src_18.3-fixed/lib/os_mon/src/Makefile -@@ -105,7 +105,6 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/ose/src/Makefile -+++ otp_src_18.3-fixed/lib/ose/src/Makefile -@@ -94,9 +94,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" -- $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/otp_mibs/src/Makefile -+++ otp_src_18.3-fixed/lib/otp_mibs/src/Makefile -@@ -96,8 +96,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGETS) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/parsetools/src/Makefile -+++ otp_src_18.3-fixed/lib/parsetools/src/Makefile -@@ -91,8 +91,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/percept/src/Makefile -+++ otp_src_18.3-fixed/lib/percept/src/Makefile -@@ -97,7 +97,6 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - # $(INSTALL_DIR) "$(RELSYSDIR)/include" - # $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/public_key/asn1/Makefile -+++ otp_src_18.3-fixed/lib/public_key/asn1/Makefile -@@ -96,8 +96,8 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/asn1" -- $(INSTALL_DATA) $(ASN_ASNS) $(ASN_ERLS) $(ASN_HRLS) $(ASN_CONFIGS) \ -- $(GEN_ERLS) "$(RELSYSDIR)/asn1" -+ $(INSTALL_DATA) $(ASN_ASNS) $(ASN_HRLS) $(ASN_CONFIGS) \ -+ "$(RELSYSDIR)/asn1" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/public_key/src/Makefile -+++ otp_src_18.3-fixed/lib/public_key/src/Makefile -@@ -109,8 +109,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/reltool/src/Makefile -+++ otp_src_18.3-fixed/lib/reltool/src/Makefile -@@ -100,7 +100,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(APP_TARGET) $(APPUP_TARGET) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/runtime_tools/src/Makefile -+++ otp_src_18.3-fixed/lib/runtime_tools/src/Makefile -@@ -97,8 +97,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/examples" ---- otp_src_18.3-orig/lib/sasl/src/Makefile -+++ otp_src_18.3-fixed/lib/sasl/src/Makefile -@@ -93,7 +93,6 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/snmp/src/agent/Makefile -+++ otp_src_18.3-fixed/lib/snmp/src/agent/Makefile -@@ -131,7 +131,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/agent" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/agent" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/agent" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \ - "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/snmp/src/app/Makefile -+++ otp_src_18.3-fixed/lib/snmp/src/app/Makefile -@@ -132,7 +132,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/app" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/app" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/app" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \ - "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/snmp/src/compile/Makefile -+++ otp_src_18.3-fixed/lib/snmp/src/compile/Makefile -@@ -123,7 +123,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/compiler" -- $(INSTALL_DATA) $(ESCRIPT_SRC) $(PARSER_SRC) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/compiler" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src/compiler" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(EBIN_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/bin" ---- otp_src_18.3-orig/lib/snmp/src/manager/Makefile -+++ otp_src_18.3-fixed/lib/snmp/src/manager/Makefile -@@ -114,7 +114,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/manager" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/manager" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/manager" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - # $(INSTALL_DIR) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/snmp/src/misc/Makefile -+++ otp_src_18.3-fixed/lib/snmp/src/misc/Makefile -@@ -112,7 +112,7 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/misc" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/misc" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src/misc" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - # $(INSTALL_DIR) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/ssh/src/Makefile -+++ otp_src_18.3-fixed/lib/ssh/src/Makefile -@@ -135,7 +135,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) $(APP_TARGET) \ - $(APPUP_TARGET) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/ssl/src/Makefile -+++ otp_src_18.3-fixed/lib/ssl/src/Makefile -@@ -142,7 +142,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) $(APP_TARGET) \ - $(APPUP_TARGET) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/stdlib/src/Makefile -+++ otp_src_18.3-fixed/lib/stdlib/src/Makefile -@@ -207,7 +207,6 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) erl_parse.yrl "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/syntax_tools/src/Makefile -+++ otp_src_18.3-fixed/lib/syntax_tools/src/Makefile -@@ -100,8 +100,6 @@ - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(OBJECTS) "$(RELSYSDIR)/ebin" -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(SOURCES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(INCLUDE_DELIVERABLES) "$(RELSYSDIR)/include" - ---- otp_src_18.3-orig/lib/test_server/src/Makefile -+++ otp_src_18.3-fixed/lib/test_server/src/Makefile -@@ -124,7 +124,6 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(TS_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" ---- otp_src_18.3-orig/lib/tools/src/Makefile -+++ otp_src_18.3-fixed/lib/tools/src/Makefile -@@ -107,7 +107,7 @@ - - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(YRL_FILE) $(HRL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \ - "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/typer/src/Makefile -+++ otp_src_18.3-fixed/lib/typer/src/Makefile -@@ -102,9 +102,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(YRL_FILES) \ -- "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(INSTALL_FILES) "$(RELSYSDIR)/ebin" - ---- otp_src_18.3-orig/lib/webtool/src/Makefile -+++ otp_src_18.3-fixed/lib/webtool/src/Makefile -@@ -88,8 +88,6 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - - release_spec: opt -- $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \ - "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/wx/src/Makefile -+++ otp_src_18.3-fixed/lib/wx/src/Makefile -@@ -122,9 +122,9 @@ - include $(ERL_TOP)/make/otp_release_targets.mk - release_spec: opt - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/src/gen" -- $(INSTALL_DATA) $(GEN_HRL) $(GEN_FILES) "$(RELSYSDIR)/src/gen" -+ $(INSTALL_DATA) $(GEN_HRL) "$(RELSYSDIR)/src/gen" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(EXT_HRL) "$(RELSYSDIR)/include" - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" ---- otp_src_18.3-orig/lib/xmerl/src/Makefile -+++ otp_src_18.3-fixed/lib/xmerl/src/Makefile -@@ -218,9 +218,7 @@ - $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin" - $(INSTALL_DIR) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) $(ERL_FILES) $(INTERNAL_HRL_FILES) $(APP_SRC) $(APPUP_SRC) "$(RELSYSDIR)/src" -- $(INSTALL_DATA) xmerl_xpath_parse.yrl "$(RELSYSDIR)/src" -- $(INSTALL_DATA) xmerl_b64Bin.yrl "$(RELSYSDIR)/src" -+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src" - $(INSTALL_DIR) "$(RELSYSDIR)/include" - $(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include" - diff --git a/community/erlang/0007-Split-off-webtool-dependency-from-tools.patch b/community/erlang/0007-Split-off-webtool-dependency-from-tools.patch deleted file mode 100644 index 6a58f5cea0..0000000000 --- a/community/erlang/0007-Split-off-webtool-dependency-from-tools.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Peter Lemenkov -Date: Sat, 8 Nov 2014 22:54:57 +0300 -Subject: [PATCH] Split off webtool dependency from tools - -Signed-off-by: Peter Lemenkov - ---- otp_src_18.0-orig/lib/tools/src/cover_web.erl -+++ otp_src_18.0-fixed/lib/tools/src/cover_web.erl -@@ -51,14 +51,25 @@ - %%%---------------------------------------------------------------------- - %% Start webtool and webcover from erlang shell - start() -> -- webtool:start(), -- webtool:start_tools([],"app=webcover"), -+ try -+ % Disable automatic dependency picking up -+ erlang:apply(webtool, start, []), -+ erlang:apply(webtool, start_tools, [[],"app=webcover"]) -+ catch -+ error:undef -> error_logger:error_msg("No erlang-webtool found.~nPlease install erlang-webtool package first.~n") -+ end, - ok. - - %% Stop webtool and webcover from erlang shell - stop() -> -- webtool:stop_tools([],"app=webcover"), -- webtool:stop(). -+ try -+ % Disable automatic dependency picking up -+ erlang:apply(webtool, stop_tools, [[],"app=webcover"]), -+ erlang:apply(webtool, stop, []) -+ catch -+ error:undef -> error_logger:error_msg("No erlang-webtool found.~nPlease install erlang-webtool package first.~n") -+ end, -+ ok. - - - diff --git a/community/erlang/0015-otp-update-version-19.0.1.patch b/community/erlang/0015-otp-update-version-19.0.1.patch new file mode 100644 index 0000000000..31dcb29151 --- /dev/null +++ b/community/erlang/0015-otp-update-version-19.0.1.patch @@ -0,0 +1,1233 @@ +--- a/OTP_VERSION ++++ b/OTP_VERSION +@@ -1 +1 @@ +-19.0 ++19.0.1 +--- a/erts/doc/src/notes.xml ++++ b/erts/doc/src/notes.xml +@@ -32,6 +32,24 @@ +

This document describes the changes made to the ERTS application.

+ + ++
Erts 8.0.1 ++ ++
Fixed Bugs and Malfunctions ++ ++ ++

++ A memory allocation bug in group_leader/2 could ++ cause an emulator crash when garbage collecting a process ++ that had been assigned a remote group leader. This bug ++ was introduced in ERTS version 8.0.

++

++ Own Id: OTP-13716

++
++
++
++ ++
++ +
Erts 8.0 + +
Fixed Bugs and Malfunctions +--- a/erts/emulator/beam/bif.c ++++ b/erts/emulator/beam/bif.c +@@ -4305,8 +4305,9 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2) + else { + locks &= ~ERTS_PROC_LOCK_STATUS; + erts_smp_proc_unlock(new_member, ERTS_PROC_LOCK_STATUS); +- if (erts_smp_atomic32_read_nob(&new_member->state) +- & !(ERTS_PSFLG_DIRTY_RUNNING|ERTS_PSFLG_DIRTY_RUNNING_SYS)) { ++ if (new_member == BIF_P ++ || !(erts_smp_atomic32_read_nob(&new_member->state) ++ & (ERTS_PSFLG_DIRTY_RUNNING|ERTS_PSFLG_DIRTY_RUNNING_SYS))) { + new_member->group_leader = STORE_NC_IN_PROC(new_member, + BIF_ARG_1); + } +@@ -4326,6 +4327,7 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2) + BIF_ARG_1); + bp->next = new_member->mbuf; + new_member->mbuf = bp; ++ new_member->mbuf_sz += bp->used_size; + } + } + } +--- a/erts/vsn.mk ++++ b/erts/vsn.mk +@@ -18,7 +18,7 @@ + # %CopyrightEnd% + # + +-VSN = 8.0 ++VSN = 8.0.1 + + # Port number 4365 in 4.2 + # Port number 4366 in 4.3 +--- a/lib/dialyzer/doc/src/notes.xml ++++ b/lib/dialyzer/doc/src/notes.xml +@@ -32,6 +32,20 @@ +

This document describes the changes made to the Dialyzer + application.

+ ++
Dialyzer 3.0.1 ++ ++
Fixed Bugs and Malfunctions ++ ++ ++

Fix a map related bug.

++

++ Own Id: OTP-13709 Aux Id: ERL-177, PR-1115

++
++
++
++ ++
++ +
Dialyzer 3.0 + +
Fixed Bugs and Malfunctions +--- /dev/null ++++ b/lib/dialyzer/test/map_SUITE_data/src/mand_remote_val/a.erl +@@ -0,0 +1,9 @@ ++-module(a). ++-export([to_map/1, to_map/2]). ++-type t() :: #{type := b:t()}. ++ ++-spec to_map(t()) -> map(). ++to_map(Resource) -> to_map(Resource, #{}). ++ ++-spec to_map(t(), map()) -> map(). ++to_map(_, Map) when is_map(Map) -> #{}. +--- /dev/null ++++ b/lib/dialyzer/test/map_SUITE_data/src/mand_remote_val/b.erl +@@ -0,0 +1,3 @@ ++-module(b). ++-export_type([t/0]). ++-type t() :: binary(). +--- a/lib/dialyzer/vsn.mk ++++ b/lib/dialyzer/vsn.mk +@@ -1 +1 @@ +-DIALYZER_VSN = 3.0 ++DIALYZER_VSN = 3.0.1 +--- a/lib/hipe/cerl/erl_types.erl ++++ b/lib/hipe/cerl/erl_types.erl +@@ -1664,10 +1664,12 @@ t_map(Pairs0, DefK0, DefV0) -> + %% define(DEBUG, true). + try + validate_map_elements(Pairs) +- catch error:badarg -> error(badarg, [Pairs0,DefK0,DefV0]); +- error:{badarg, E} -> error({badarg, E}, [Pairs0,DefK0,DefV0]) ++ catch error:badarg -> error(badarg, [Pairs0,DefK0,DefV0]) + end, +- ?map(Pairs, DefK, DefV). ++ case map_pairs_are_none(Pairs) of ++ true -> ?none; ++ false -> ?map(Pairs, DefK, DefV) ++ end. + + normalise_map_optionals([], _, _) -> []; + normalise_map_optionals([E={K,?opt,?none}|T], DefK, DefV) -> +@@ -1684,7 +1686,6 @@ normalise_map_optionals([E={K,?opt,V}|T], DefK, DefV) -> + normalise_map_optionals([E|T], DefK, DefV) -> + [E|normalise_map_optionals(T, DefK, DefV)]. + +-validate_map_elements([{_,?mand,?none}|_]) -> error({badarg, none_in_mand}); + validate_map_elements([{K1,_,_}|Rest=[{K2,_,_}|_]]) -> + case is_singleton_type(K1) andalso K1 < K2 of + false -> error(badarg); +@@ -1697,6 +1698,10 @@ validate_map_elements([{K,_,_}]) -> + end; + validate_map_elements([]) -> true. + ++map_pairs_are_none([]) -> false; ++map_pairs_are_none([{_,?mand,?none}|_]) -> true; ++map_pairs_are_none([_|Ps]) -> map_pairs_are_none(Ps). ++ + -spec t_is_map(erl_type()) -> boolean(). + + t_is_map(Type) -> +@@ -2833,12 +2838,7 @@ t_inf(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, _Opaques) -> + %% becomes mandatory in the infinumum + (K, _, V1, _, V2) -> {K, ?mand, t_inf(V1, V2)} + end, A, B), +- %% If the infinimum of any mandatory values is ?none, the entire map infinimum +- %% is ?none. +- case lists:any(fun({_,?mand,?none})->true; ({_,_,_}) -> false end, Pairs) of +- true -> t_none(); +- false -> t_map(Pairs, t_inf(ADefK, BDefK), t_inf(ADefV, BDefV)) +- end; ++ t_map(Pairs, t_inf(ADefK, BDefK), t_inf(ADefV, BDefV)); + t_inf(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2), _Opaques) -> + ?matchstate(t_inf(Pres1, Pres2), t_inf(Slots1, Slots2)); + t_inf(?nil, ?nil, _Opaques) -> ?nil; +--- a/lib/inets/doc/src/notes.xml ++++ b/lib/inets/doc/src/notes.xml +@@ -33,7 +33,23 @@ + notes.xml + + +-
Inets 6.3 ++
Inets 6.3.1 ++ ++
Fixed Bugs and Malfunctions ++ ++ ++

++ A debug message was accidently left enabled in the ftp ++ client.

++

++ Own Id: OTP-13712 Aux Id: seq13143

++
++
++
++ ++
++ ++
Inets 6.3 + +
Fixed Bugs and Malfunctions + +--- a/lib/inets/src/ftp/ftp.erl ++++ b/lib/inets/src/ftp/ftp.erl +@@ -106,8 +106,8 @@ + -type common_reason() :: 'econn' | 'eclosed' | term(). + -type file_write_error_reason() :: term(). % See file:write for more info + +-%%-define(DBG(F,A), 'n/a'). +--define(DBG(F,A), io:format(F,A)). ++-define(DBG(F,A), 'n/a'). ++%%-define(DBG(F,A), io:format(F,A)). + + %%%========================================================================= + %%% API - CLIENT FUNCTIONS +@@ -2099,7 +2099,7 @@ handle_ctrl_result({pos_prel, _}, #state{caller = {transfer_data, Bin}} + + %%-------------------------------------------------------------------------- + %% Default +-handle_ctrl_result({Status, Lines}, #state{client = From} = State) ++handle_ctrl_result({Status, _Lines}, #state{client = From} = State) + when From =/= undefined -> + ctrl_result_response(Status, State, {error, Status}). + +--- a/lib/inets/vsn.mk ++++ b/lib/inets/vsn.mk +@@ -19,6 +19,6 @@ + # %CopyrightEnd% + + APPLICATION = inets +-INETS_VSN = 6.3 ++INETS_VSN = 6.3.1 + PRE_VSN = + APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)" +--- a/lib/observer/doc/src/notes.xml ++++ b/lib/observer/doc/src/notes.xml +@@ -32,6 +32,23 @@ +

This document describes the changes made to the Observer + application.

+ ++
Observer 2.2.1 ++ ++
Fixed Bugs and Malfunctions ++ ++ ++

++ Fixed a crash happening when observing another node, who ++ have a different number of schedulers than the current ++ one.

++

++ Own Id: OTP-13702 Aux Id: ERL-171

++
++
++
++ ++
++ +
Observer 2.2 + +
Improvements and New Features +--- a/lib/observer/src/observer_perf_wx.erl ++++ b/lib/observer/src/observer_perf_wx.erl +@@ -235,12 +235,14 @@ terminate(_Event, #state{appmon=Pid}) -> + code_change(_, _, State) -> + State. + +-restart_fetcher(Node, #state{appmon=Old, panel=Panel, time=#ti{fetch=Freq}=Ti}=State) -> ++restart_fetcher(Node, #state{appmon=Old, panel=Panel, time=#ti{fetch=Freq}=Ti, wins=Wins0}=State) -> + catch Old ! exit, + Me = self(), + Pid = spawn_link(Node, observer_backend, fetch_stats, [Me, round(1000/Freq)]), + wxWindow:refresh(Panel), +- precalc(State#state{active=true, appmon=Pid, samples=reset_data(), time=Ti#ti{tick=0}}). ++ Wins = [W#win{state=undefined} || W <- Wins0], ++ precalc(State#state{active=true, appmon=Pid, samples=reset_data(), ++ wins=Wins, time=Ti#ti{tick=0}}). + + reset_data() -> + {0, queue:new()}. +@@ -253,18 +255,25 @@ add_data(Stats, {N, Q}, Wins, _, Active) -> + + add_data_1([#win{state={_,St}}|_]=Wins0, Last, N, {Drop, Q}, Active) + when St /= undefined -> +- {Wins, Stat} = +- lists:mapfoldl(fun(Win0, Entry) -> +- {Win1,Stat} = add_data_2(Win0, Last, Entry), +- case Active of +- true -> +- Win = add_data_3(Win1, N, Drop, Stat, Q), +- {Win, Stat}; +- false -> +- {Win1, Stat} +- end +- end, #{}, Wins0), +- {Wins, {N,queue:in(Stat#{}, Q)}}; ++ try ++ {Wins, Stat} = ++ lists:mapfoldl(fun(Win0, Entry) -> ++ {Win1,Stat} = add_data_2(Win0, Last, Entry), ++ case Active of ++ true -> ++ Win = add_data_3(Win1, N, Drop, Stat, Q), ++ {Win, Stat}; ++ false -> ++ {Win1, Stat} ++ end ++ end, #{}, Wins0), ++ {Wins, {N,queue:in(Stat#{}, Q)}} ++ catch no_scheduler_change -> ++ {[Win#win{state=init_data(Id, Last), ++ info = info(Id, Last)} ++ || #win{name=Id}=Win <- Wins0], {0,queue:new()}} ++ end; ++ + add_data_1(Wins, Stats, 1, {_, Q}, _) -> + {[Win#win{state=init_data(Id, Stats), + info = info(Id, Stats)} +@@ -409,7 +418,8 @@ collect_data(utilz, MemInfo, Max) -> + + calc_delta([{Id, WN, TN}|Ss], [{Id, WP, TP}|Ps]) -> + [100*(WN-WP) div (TN-TP)|calc_delta(Ss, Ps)]; +-calc_delta([], []) -> []. ++calc_delta([], []) -> []; ++calc_delta(_, _) -> throw(no_scheduler_change). + + precalc(#state{samples=Data0, paint=Paint, time=Ti, wins=Wins0}=State) -> + Wins = [precalc(Ti, Data0, Paint, Win) || Win <- Wins0], +--- a/lib/observer/vsn.mk ++++ b/lib/observer/vsn.mk +@@ -1 +1 @@ +-OBSERVER_VSN = 2.2 ++OBSERVER_VSN = 2.2.1 +--- a/lib/ssh/doc/src/notes.xml ++++ b/lib/ssh/doc/src/notes.xml +@@ -30,6 +30,30 @@ + notes.xml + + ++
Ssh 4.3.1 ++ ++
Fixed Bugs and Malfunctions ++ ++ ++

++ SSH client does not any longer retry a bad password given ++ as option to ssh:connect et al.

++

++ Own Id: OTP-13674 Aux Id: TR-HU92273

++
++ ++

++ Removed possible hanging risk for a certain timing ++ sequence when communicating client and server executes on ++ the same node.

++

++ Own Id: OTP-13715

++
++
++
++ ++
++ +
Ssh 4.3 + +
Improvements and New Features +--- a/lib/ssh/src/ssh_auth.erl ++++ b/lib/ssh/src/ssh_auth.erl +@@ -31,12 +31,111 @@ + -export([publickey_msg/1, password_msg/1, keyboard_interactive_msg/1, + service_request_msg/1, init_userauth_request_msg/1, + userauth_request_msg/1, handle_userauth_request/3, +- handle_userauth_info_request/3, handle_userauth_info_response/2 ++ handle_userauth_info_request/2, handle_userauth_info_response/2 + ]). + + %%-------------------------------------------------------------------- + %%% Internal application API + %%-------------------------------------------------------------------- ++%%%---------------------------------------------------------------- ++userauth_request_msg(#ssh{userauth_methods = ServerMethods, ++ userauth_supported_methods = UserPrefMethods, % Note: this is not documented as supported for clients ++ userauth_preference = ClientMethods0 ++ } = Ssh0) -> ++ case sort_select_mthds(ClientMethods0, UserPrefMethods, ServerMethods) of ++ [] -> ++ Msg = #ssh_msg_disconnect{code = ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE, ++ description = "Unable to connect using the available authentication methods", ++ language = "en"}, ++ {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh0)}; ++ ++ [{Pref,Module,Function,Args} | Prefs] -> ++ Ssh = case Pref of ++ "keyboard-interactive" -> Ssh0; ++ _ -> Ssh0#ssh{userauth_preference = Prefs} ++ end, ++ case Module:Function(Args ++ [Ssh]) of ++ {not_ok, Ssh1} -> ++ userauth_request_msg(Ssh1#ssh{userauth_preference = Prefs}); ++ Result -> ++ {Pref,Result} ++ end ++ end. ++ ++ ++ ++sort_select_mthds(Clients, undefined, Servers) -> ++ %% User has not expressed an opinion via option "auth_methods", use the server's prefs ++ sort_select_mthds1(Clients, Servers, string:tokens(?SUPPORTED_AUTH_METHODS,",")); ++ ++sort_select_mthds(Clients, Users0, Servers0) -> ++ %% The User has an opinion, use the intersection of that and the Servers whishes but ++ %% in the Users order ++ sort_select_mthds1(Clients, string:tokens(Users0,","), Servers0). ++ ++ ++sort_select_mthds1(Clients, Users0, Servers0) -> ++ Servers = unique(Servers0), ++ Users = unique(Users0), ++ [C || Key <- Users, ++ lists:member(Key, Servers), ++ C <- Clients, ++ element(1,C) == Key]. ++ ++unique(L) -> ++ lists:reverse( ++ lists:foldl(fun(E,Acc) -> ++ case lists:member(E,Acc) of ++ true -> Acc; ++ false -> [E|Acc] ++ end ++ end, [], L)). ++ ++ ++%%%---- userauth_request_msg "callbacks" ++password_msg([#ssh{opts = Opts, io_cb = IoCb, ++ user = User, service = Service} = Ssh0]) -> ++ {Password,Ssh} = ++ case proplists:get_value(password, Opts) of ++ undefined when IoCb == ssh_no_io -> ++ {not_ok, Ssh0}; ++ undefined -> ++ {IoCb:read_password("ssh password: ",Ssh0), Ssh0}; ++ PW -> ++ %% If "password" option is given it should not be tried again ++ {PW, Ssh0#ssh{opts = lists:keyreplace(password,1,Opts,{password,not_ok})}} ++ end, ++ case Password of ++ not_ok -> ++ {not_ok, Ssh}; ++ _ -> ++ ssh_transport:ssh_packet( ++ #ssh_msg_userauth_request{user = User, ++ service = Service, ++ method = "password", ++ data = ++ <>}, ++ Ssh) ++ end. ++ ++%% See RFC 4256 for info on keyboard-interactive ++keyboard_interactive_msg([#ssh{user = User, ++ opts = Opts, ++ service = Service} = Ssh]) -> ++ case proplists:get_value(password, Opts) of ++ not_ok -> ++ {not_ok,Ssh}; % No need to use a failed pwd once more ++ _ -> ++ ssh_transport:ssh_packet( ++ #ssh_msg_userauth_request{user = User, ++ service = Service, ++ method = "keyboard-interactive", ++ data = << ?STRING(<<"">>), ++ ?STRING(<<>>) >> }, ++ Ssh) ++ end. ++ + publickey_msg([Alg, #ssh{user = User, + session_id = SessionId, + service = Service, +@@ -48,7 +147,7 @@ publickey_msg([Alg, #ssh{user = User, + StrAlgo = atom_to_list(Alg), + case encode_public_key(StrAlgo, ssh_transport:extract_public_key(PrivKey)) of + not_ok -> +- not_ok; ++ {not_ok, Ssh}; + PubKeyBlob -> + SigData = build_sig_data(SessionId, + User, Service, PubKeyBlob, StrAlgo), +@@ -65,52 +164,15 @@ publickey_msg([Alg, #ssh{user = User, + Ssh) + end; + _Error -> +- not_ok +- end. +- +-password_msg([#ssh{opts = Opts, io_cb = IoCb, +- user = User, service = Service} = Ssh]) -> +- Password = case proplists:get_value(password, Opts) of +- undefined -> +- user_interaction(IoCb, Ssh); +- PW -> +- PW +- end, +- case Password of +- not_ok -> +- not_ok; +- _ -> +- ssh_transport:ssh_packet( +- #ssh_msg_userauth_request{user = User, +- service = Service, +- method = "password", +- data = +- <>}, +- Ssh) ++ {not_ok, Ssh} + end. + +-user_interaction(ssh_no_io, _) -> +- not_ok; +-user_interaction(IoCb, Ssh) -> +- IoCb:read_password("ssh password: ", Ssh). +- +- +-%% See RFC 4256 for info on keyboard-interactive +-keyboard_interactive_msg([#ssh{user = User, +- service = Service} = Ssh]) -> +- ssh_transport:ssh_packet( +- #ssh_msg_userauth_request{user = User, +- service = Service, +- method = "keyboard-interactive", +- data = << ?STRING(<<"">>), +- ?STRING(<<>>) >> }, +- Ssh). +- ++%%%---------------------------------------------------------------- + service_request_msg(Ssh) -> + ssh_transport:ssh_packet(#ssh_msg_service_request{name = "ssh-userauth"}, + Ssh#ssh{service = "ssh-userauth"}). + ++%%%---------------------------------------------------------------- + init_userauth_request_msg(#ssh{opts = Opts} = Ssh) -> + case user_name(Opts) of + {ok, User} -> +@@ -140,34 +202,9 @@ init_userauth_request_msg(#ssh{opts = Opts} = Ssh) -> + description = ErrStr}) + end. + +-userauth_request_msg(#ssh{userauth_preference = []} = Ssh) -> +- Msg = #ssh_msg_disconnect{code = +- ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE, +- description = "Unable to connect using the available" +- " authentication methods", +- language = "en"}, +- {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh)}; +- +-userauth_request_msg(#ssh{userauth_methods = Methods, +- userauth_preference = [{Pref, Module, +- Function, Args} | Prefs]} +- = Ssh0) -> +- Ssh = Ssh0#ssh{userauth_preference = Prefs}, +- case lists:member(Pref, Methods) of +- true -> +- case Module:Function(Args ++ [Ssh]) of +- not_ok -> +- userauth_request_msg(Ssh); +- Result -> +- {Pref,Result} +- end; +- false -> +- userauth_request_msg(Ssh) +- end. +- +- +-handle_userauth_request(#ssh_msg_service_request{name = +- Name = "ssh-userauth"}, ++%%%---------------------------------------------------------------- ++%%% called by server ++handle_userauth_request(#ssh_msg_service_request{name = Name = "ssh-userauth"}, + _, Ssh) -> + {ok, ssh_transport:ssh_packet(#ssh_msg_service_accept{name = Name}, + Ssh#ssh{service = "ssh-connection"})}; +@@ -319,21 +356,28 @@ handle_userauth_request(#ssh_msg_userauth_request{user = User, + partial_success = false}, Ssh)}. + + +- +-handle_userauth_info_request( +- #ssh_msg_userauth_info_request{name = Name, +- instruction = Instr, +- num_prompts = NumPrompts, +- data = Data}, IoCb, +- #ssh{opts = Opts} = Ssh) -> ++%%%---------------------------------------------------------------- ++%%% keyboard-interactive client ++handle_userauth_info_request(#ssh_msg_userauth_info_request{name = Name, ++ instruction = Instr, ++ num_prompts = NumPrompts, ++ data = Data}, ++ #ssh{opts = Opts, ++ io_cb = IoCb ++ } = Ssh) -> + PromptInfos = decode_keyboard_interactive_prompts(NumPrompts,Data), +- Responses = keyboard_interact_get_responses(IoCb, Opts, +- Name, Instr, PromptInfos), +- {ok, +- ssh_transport:ssh_packet( +- #ssh_msg_userauth_info_response{num_responses = NumPrompts, +- data = Responses}, Ssh)}. ++ case keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) of ++ not_ok -> ++ not_ok; ++ Responses -> ++ {ok, ++ ssh_transport:ssh_packet( ++ #ssh_msg_userauth_info_response{num_responses = NumPrompts, ++ data = Responses}, Ssh)} ++ end. + ++%%%---------------------------------------------------------------- ++%%% keyboard-interactive server + handle_userauth_info_response(#ssh_msg_userauth_info_response{num_responses = 1, + data = <>}, + #ssh{opts = Opts, +@@ -369,11 +413,6 @@ method_preference(Algs) -> + [{"publickey", ?MODULE, publickey_msg, [A]} | Acc] + end, + [{"password", ?MODULE, password_msg, []}, +- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}, +- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}, +- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}, +- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}, +- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}, + {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []} + ], + Algs). +@@ -473,6 +512,9 @@ keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) -> + proplists:get_value(password, Opts, undefined), IoCb, Name, + Instr, PromptInfos, Opts, NumPrompts). + ++ ++keyboard_interact_get_responses(_, _, not_ok, _, _, _, _, _, _) -> ++ not_ok; + keyboard_interact_get_responses(_, undefined, Password, _, _, _, _, _, + 1) when Password =/= undefined -> + [Password]; %% Password auth implemented with keyboard-interaction and passwd is known +@@ -486,17 +528,18 @@ keyboard_interact_get_responses(true, Fun, _Pwd, _IoCb, Name, Instr, PromptInfos + keyboard_interact_fun(Fun, Name, Instr, PromptInfos, NumPrompts). + + keyboard_interact(IoCb, Name, Instr, Prompts, Opts) -> +- if Name /= "" -> IoCb:format("~s~n", [Name]); +- true -> ok +- end, +- if Instr /= "" -> IoCb:format("~s~n", [Instr]); +- true -> ok +- end, ++ write_if_nonempty(IoCb, Name), ++ write_if_nonempty(IoCb, Instr), + lists:map(fun({Prompt, true}) -> IoCb:read_line(Prompt, Opts); + ({Prompt, false}) -> IoCb:read_password(Prompt, Opts) + end, + Prompts). + ++write_if_nonempty(_, "") -> ok; ++write_if_nonempty(_, <<>>) -> ok; ++write_if_nonempty(IoCb, Text) -> IoCb:format("~s~n",[Text]). ++ ++ + keyboard_interact_fun(KbdInteractFun, Name, Instr, PromptInfos, NumPrompts) -> + Prompts = lists:map(fun({Prompt, _Echo}) -> Prompt end, + PromptInfos), +--- a/lib/ssh/src/ssh_connection_handler.erl ++++ b/lib/ssh/src/ssh_connection_handler.erl +@@ -428,7 +428,12 @@ init_connection(server, C = #connection{}, Opts) -> + init_ssh_record(Role, Socket, Opts) -> + {ok, PeerAddr} = inet:peername(Socket), + KeyCb = proplists:get_value(key_cb, Opts, ssh_file), +- AuthMethods = proplists:get_value(auth_methods, Opts, ?SUPPORTED_AUTH_METHODS), ++ AuthMethods = proplists:get_value(auth_methods, ++ Opts, ++ case Role of ++ server -> ?SUPPORTED_AUTH_METHODS; ++ client -> undefined ++ end), + S0 = #ssh{role = Role, + key_cb = KeyCb, + opts = Opts, +@@ -794,9 +799,13 @@ handle_event(_, #ssh_msg_userauth_banner{message = Msg}, {userauth,client}, D) - + + handle_event(_, #ssh_msg_userauth_info_request{} = Msg, {userauth_keyboard_interactive, client}, + #data{ssh_params = Ssh0} = D) -> +- {ok, {Reply, Ssh}} = ssh_auth:handle_userauth_info_request(Msg, Ssh0#ssh.io_cb, Ssh0), +- send_bytes(Reply, D), +- {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}}; ++ case ssh_auth:handle_userauth_info_request(Msg, Ssh0) of ++ {ok, {Reply, Ssh}} -> ++ send_bytes(Reply, D), ++ {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}}; ++ not_ok -> ++ {next_state, {userauth,client}, D, [{next_event, internal, Msg}]} ++ end; + + handle_event(_, #ssh_msg_userauth_info_response{} = Msg, {userauth_keyboard_interactive, server}, D) -> + case ssh_auth:handle_userauth_info_response(Msg, D#data.ssh_params) of +@@ -819,7 +828,18 @@ handle_event(_, Msg = #ssh_msg_userauth_failure{}, {userauth_keyboard_interactiv + D = D0#data{ssh_params = Ssh0#ssh{userauth_preference=Prefs}}, + {next_state, {userauth,client}, D, [{next_event, internal, Msg}]}; + +-handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client}, D) -> ++handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client}, ++ #data{ssh_params = Ssh0} = D0) -> ++ Opts = Ssh0#ssh.opts, ++ D = case proplists:get_value(password, Opts) of ++ undefined -> ++ D0; ++ _ -> ++ D0#data{ssh_params = ++ Ssh0#ssh{opts = ++ lists:keyreplace(password,1,Opts, ++ {password,not_ok})}} % FIXME:intermodule dependency ++ end, + {next_state, {userauth,client}, D, [{next_event, internal, Msg}]}; + + handle_event(_, Msg=#ssh_msg_userauth_success{}, {userauth_keyboard_interactive_info_response, client}, D) -> +@@ -1006,13 +1026,13 @@ handle_event({call,From}, get_print_info, StateName, D) -> + {keep_state_and_data, [{reply,From,Reply}]}; + + handle_event({call,From}, {connection_info, Options}, _, D) -> +- Info = ssh_info(Options, D, []), ++ Info = fold_keys(Options, fun conn_info/2, D), + {keep_state_and_data, [{reply,From,Info}]}; + + handle_event({call,From}, {channel_info,ChannelId,Options}, _, D) -> + case ssh_channel:cache_lookup(cache(D), ChannelId) of + #channel{} = Channel -> +- Info = ssh_channel_info(Options, Channel, []), ++ Info = fold_keys(Options, fun chann_info/2, Channel), + {keep_state_and_data, [{reply,From,Info}]}; + undefined -> + {keep_state_and_data, [{reply,From,[]}]} +@@ -1206,8 +1226,9 @@ handle_event(internal, prepare_next_packet, _, D) -> + Sz when Sz >= Enough -> + self() ! {D#data.transport_protocol, D#data.socket, <<>>}; + _ -> +- inet:setopts(D#data.socket, [{active, once}]) ++ ok + end, ++ inet:setopts(D#data.socket, [{active, once}]), + keep_state_and_data; + + handle_event(info, {CloseTag,Socket}, StateName, +@@ -1315,12 +1336,10 @@ terminate(shutdown, StateName, State0) -> + State = send_msg(#ssh_msg_disconnect{code = ?SSH_DISCONNECT_BY_APPLICATION, + description = "Application shutdown"}, + State0), +-timer:sleep(400), %% FIXME!!! gen_tcp:shutdown instead + finalize_termination(StateName, State); + + %% terminate({shutdown,Msg}, StateName, State0) when is_record(Msg,ssh_msg_disconnect)-> + %% State = send_msg(Msg, State0), +-%% timer:sleep(400), %% FIXME!!! gen_tcp:shutdown instead + %% finalize_termination(StateName, Msg, State); + + terminate({shutdown,_R}, StateName, State) -> +@@ -1635,7 +1654,6 @@ new_channel_id(#data{connection_state = #connection{channel_id_seed = Id} = + disconnect(Msg=#ssh_msg_disconnect{description=Description}, _StateName, State0) -> + State = send_msg(Msg, State0), + disconnect_fun(Description, State), +-timer:sleep(400), + {stop, {shutdown,Description}, State}. + + %%%---------------------------------------------------------------- +@@ -1644,43 +1662,43 @@ counterpart_versions(NumVsn, StrVsn, #ssh{role = server} = Ssh) -> + counterpart_versions(NumVsn, StrVsn, #ssh{role = client} = Ssh) -> + Ssh#ssh{s_vsn = NumVsn , s_version = StrVsn}. + +-ssh_info([], _State, Acc) -> +- Acc; +-ssh_info([client_version | Rest], #data{ssh_params = #ssh{c_vsn = IntVsn, +- c_version = StringVsn}} = State, Acc) -> +- ssh_info(Rest, State, [{client_version, {IntVsn, StringVsn}} | Acc]); +- +-ssh_info([server_version | Rest], #data{ssh_params =#ssh{s_vsn = IntVsn, +- s_version = StringVsn}} = State, Acc) -> +- ssh_info(Rest, State, [{server_version, {IntVsn, StringVsn}} | Acc]); +-ssh_info([peer | Rest], #data{ssh_params = #ssh{peer = Peer}} = State, Acc) -> +- ssh_info(Rest, State, [{peer, Peer} | Acc]); +-ssh_info([sockname | Rest], #data{socket = Socket} = State, Acc) -> +- {ok, SockName} = inet:sockname(Socket), +- ssh_info(Rest, State, [{sockname, SockName}|Acc]); +-ssh_info([user | Rest], #data{auth_user = User} = State, Acc) -> +- ssh_info(Rest, State, [{user, User}|Acc]); +-ssh_info([ _ | Rest], State, Acc) -> +- ssh_info(Rest, State, Acc). +- +- +-ssh_channel_info([], _, Acc) -> +- Acc; ++%%%---------------------------------------------------------------- ++conn_info(client_version, #data{ssh_params=S}) -> {S#ssh.c_vsn, S#ssh.c_version}; ++conn_info(server_version, #data{ssh_params=S}) -> {S#ssh.s_vsn, S#ssh.s_version}; ++conn_info(peer, #data{ssh_params=S}) -> S#ssh.peer; ++conn_info(user, D) -> D#data.auth_user; ++conn_info(sockname, D) -> {ok, SockName} = inet:sockname(D#data.socket), ++ SockName; ++%% dbg options ( = not documented): ++conn_info(socket, D) -> D#data.socket; ++conn_info(chan_ids, D) -> ++ ssh_channel:cache_foldl(fun(#channel{local_id=Id}, Acc) -> ++ [Id | Acc] ++ end, [], cache(D)). + +-ssh_channel_info([recv_window | Rest], #channel{recv_window_size = WinSize, +- recv_packet_size = Packsize +- } = Channel, Acc) -> +- ssh_channel_info(Rest, Channel, [{recv_window, {{win_size, WinSize}, +- {packet_size, Packsize}}} | Acc]); +-ssh_channel_info([send_window | Rest], #channel{send_window_size = WinSize, +- send_packet_size = Packsize +- } = Channel, Acc) -> +- ssh_channel_info(Rest, Channel, [{send_window, {{win_size, WinSize}, +- {packet_size, Packsize}}} | Acc]); +-ssh_channel_info([ _ | Rest], Channel, Acc) -> +- ssh_channel_info(Rest, Channel, Acc). ++%%%---------------------------------------------------------------- ++chann_info(recv_window, C) -> ++ {{win_size, C#channel.recv_window_size}, ++ {packet_size, C#channel.recv_packet_size}}; ++chann_info(send_window, C) -> ++ {{win_size, C#channel.send_window_size}, ++ {packet_size, C#channel.send_packet_size}}; ++%% dbg options ( = not documented): ++chann_info(pid, C) -> ++ C#channel.user. + ++%%%---------------------------------------------------------------- ++%% Assisting meta function for the *_info functions ++fold_keys(Keys, Fun, Extra) -> ++ lists:foldr(fun(Key, Acc) -> ++ try Fun(Key, Extra) of ++ Value -> [{Key,Value}|Acc] ++ catch ++ _:_ -> Acc ++ end ++ end, [], Keys). + ++%%%---------------------------------------------------------------- + log_error(Reason) -> + Report = io_lib:format("Erlang ssh connection handler failed with reason:~n" + " ~p~n" +@@ -1689,7 +1707,6 @@ log_error(Reason) -> + [Reason, erlang:get_stacktrace()]), + error_logger:error_report(Report). + +- + %%%---------------------------------------------------------------- + not_connected_filter({connection_reply, _Data}) -> true; + not_connected_filter(_) -> false. +--- a/lib/ssh/src/ssh_dbg.erl ++++ b/lib/ssh/src/ssh_dbg.erl +@@ -24,6 +24,7 @@ + + -export([messages/0, + messages/1, ++ messages/2, + stop/0 + ]). + +@@ -36,12 +37,16 @@ + writer, + acc = []}). + %%%================================================================ +-messages() -> messages(fun(String,_D) -> io:format(String) end). +-%% messages() -> messages(fun(String,Acc) -> [String|Acc] end) ++messages() -> ++ messages(fun(String,_D) -> io:format(String) end). + + messages(Write) when is_function(Write,2) -> ++ messages(Write, fun(X) -> X end). ++ ++messages(Write, MangleArg) when is_function(Write,2), ++ is_function(MangleArg,1) -> + catch dbg:start(), +- setup_tracer(Write), ++ setup_tracer(Write, MangleArg), + dbg:p(new,c), + dbg_ssh_messages(). + +@@ -63,18 +68,30 @@ msg_formater({trace,_Pid,return_from,{ssh_message,encode,1},_Res}, D) -> + msg_formater({trace,_Pid,call,{ssh_message,decode,_}}, D) -> + D; + msg_formater({trace,Pid,return_from,{ssh_message,decode,1},Msg}, D) -> +- fmt("~nRECV ~p ~s~n", [Pid,wr_record(shrink_bin(Msg))], D); ++ fmt("~n~p RECV ~s~n", [Pid,wr_record(shrink_bin(Msg))], D); + + msg_formater({trace,_Pid,call,{ssh_transport,select_algorithm,_}}, D) -> + D; + msg_formater({trace,Pid,return_from,{ssh_transport,select_algorithm,3},{ok,Alg}}, D) -> +- fmt("~nALGORITHMS ~p~n~s~n", [Pid, wr_record(Alg)], D); ++ fmt("~n~p ALGORITHMS~n~s~n", [Pid, wr_record(Alg)], D); ++ ++ ++msg_formater({trace,Pid,send,{tcp,Sock,Bytes},Pid}, D) -> ++ fmt("~n~p TCP SEND on ~p~n ~p~n", [Pid,Sock, shrink_bin(Bytes)], D); ++ ++msg_formater({trace,Pid,send,{tcp,Sock,Bytes},Dest}, D) -> ++ fmt("~n~p TCP SEND from ~p TO ~p~n ~p~n", [Pid,Sock,Dest, shrink_bin(Bytes)], D); + + msg_formater({trace,Pid,send,ErlangMsg,Dest}, D) -> +- fmt("~nERL MSG ~p SEND TO ~p~n ~p~n", [Pid,Dest, shrink_bin(ErlangMsg)], D); ++ fmt("~n~p ERL MSG SEND TO ~p~n ~p~n", [Pid,Dest, shrink_bin(ErlangMsg)], D); ++ ++ ++msg_formater({trace,Pid,'receive',{tcp,Sock,Bytes}}, D) -> ++ fmt("~n~p TCP RECEIVE on ~p~n ~p~n", [Pid,Sock,shrink_bin(Bytes)], D); + + msg_formater({trace,Pid,'receive',ErlangMsg}, D) -> +- fmt("~nERL MSG ~p RECIEVE~n ~p~n", [Pid,shrink_bin(ErlangMsg)], D); ++ fmt("~n~p ERL MSG RECEIVE~n ~p~n", [Pid,shrink_bin(ErlangMsg)], D); ++ + + msg_formater(M, D) -> + fmt("~nDBG ~n~p~n", [shrink_bin(M)], D). +@@ -87,8 +104,10 @@ fmt(Fmt, Args, D=#data{writer=Write,acc=Acc}) -> + D#data{acc = Write(io_lib:format(Fmt, Args), Acc)}. + + %%%---------------------------------------------------------------- +-setup_tracer(Write) -> +- Handler = fun msg_formater/2, ++setup_tracer(Write, MangleArg) -> ++ Handler = fun(Arg, D) -> ++ msg_formater(MangleArg(Arg), D) ++ end, + InitialData = #data{writer = Write}, + {ok,_} = dbg:tracer(process, {Handler, InitialData}), + ok. +--- a/lib/ssh/src/ssh_io.erl ++++ b/lib/ssh/src/ssh_io.erl +@@ -31,56 +31,55 @@ read_line(Prompt, Ssh) -> + format("~s", [listify(Prompt)]), + proplists:get_value(user_pid, Ssh) ! {self(), question}, + receive +- Answer -> ++ Answer when is_list(Answer) -> + Answer + end. + + yes_no(Prompt, Ssh) -> +- io:format("~s [y/n]?", [Prompt]), ++ format("~s [y/n]?", [Prompt]), + proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), question}, + receive +- Answer -> ++ %% I can't see that the atoms y and n are ever received, but it must ++ %% be investigated before removing ++ y -> yes; ++ n -> no; ++ ++ Answer when is_list(Answer) -> + case trim(Answer) of + "y" -> yes; + "n" -> no; + "Y" -> yes; + "N" -> no; +- y -> yes; +- n -> no; + _ -> +- io:format("please answer y or n\n"), ++ format("please answer y or n\n",[]), + yes_no(Prompt, Ssh) + end + end. + + +-read_password(Prompt, Ssh) -> ++read_password(Prompt, #ssh{opts=Opts}) -> read_password(Prompt, Opts); ++read_password(Prompt, Opts) when is_list(Opts) -> + format("~s", [listify(Prompt)]), +- case is_list(Ssh) of +- false -> +- proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), user_password}; +- _ -> +- proplists:get_value(user_pid, Ssh) ! {self(), user_password} +- end, ++ proplists:get_value(user_pid, Opts) ! {self(), user_password}, + receive +- Answer -> +- case Answer of +- "" -> +- read_password(Prompt, Ssh); +- Pass -> Pass +- end ++ Answer when is_list(Answer) -> ++ case trim(Answer) of ++ "" -> ++ read_password(Prompt, Opts); ++ Pwd -> ++ Pwd ++ end + end. + +-listify(A) when is_atom(A) -> +- atom_to_list(A); +-listify(L) when is_list(L) -> +- L; +-listify(B) when is_binary(B) -> +- binary_to_list(B). + + format(Fmt, Args) -> + io:format(Fmt, Args). + ++%%%================================================================ ++listify(A) when is_atom(A) -> atom_to_list(A); ++listify(L) when is_list(L) -> L; ++listify(B) when is_binary(B) -> binary_to_list(B). ++ + + trim(Line) when is_list(Line) -> + lists:reverse(trim1(lists:reverse(trim1(Line)))); +@@ -93,6 +92,3 @@ trim1([$\r|Cs]) -> trim(Cs); + trim1([$\n|Cs]) -> trim(Cs); + trim1([$\t|Cs]) -> trim(Cs); + trim1(Cs) -> Cs. +- +- +- +--- a/lib/ssh/test/ssh_basic_SUITE.erl ++++ b/lib/ssh/test/ssh_basic_SUITE.erl +@@ -50,7 +50,12 @@ + inet6_option/1, + inet_option/1, + internal_error/1, +- known_hosts/1, ++ known_hosts/1, ++ login_bad_pwd_no_retry1/1, ++ login_bad_pwd_no_retry2/1, ++ login_bad_pwd_no_retry3/1, ++ login_bad_pwd_no_retry4/1, ++ login_bad_pwd_no_retry5/1, + misc_ssh_options/1, + openssh_zlib_basic_test/1, + packet_size_zero/1, +@@ -100,7 +105,8 @@ all() -> + daemon_opt_fd, + multi_daemon_opt_fd, + packet_size_zero, +- ssh_info_print ++ ssh_info_print, ++ {group, login_bad_pwd_no_retry} + ]. + + groups() -> +@@ -116,7 +122,13 @@ groups() -> + {dsa_pass_key, [], [pass_phrase]}, + {rsa_pass_key, [], [pass_phrase]}, + {key_cb, [], [key_callback, key_callback_options]}, +- {internal_error, [], [internal_error]} ++ {internal_error, [], [internal_error]}, ++ {login_bad_pwd_no_retry, [], [login_bad_pwd_no_retry1, ++ login_bad_pwd_no_retry2, ++ login_bad_pwd_no_retry3, ++ login_bad_pwd_no_retry4, ++ login_bad_pwd_no_retry5 ++ ]} + ]. + + +@@ -1090,6 +1102,72 @@ ssh_info_print(Config) -> + + + %%-------------------------------------------------------------------- ++%% Check that a basd pwd is not tried more times. Could cause lock-out ++%% on server ++ ++login_bad_pwd_no_retry1(Config) -> ++ login_bad_pwd_no_retry(Config, "keyboard-interactive,password"). ++ ++login_bad_pwd_no_retry2(Config) -> ++ login_bad_pwd_no_retry(Config, "password,keyboard-interactive"). ++ ++login_bad_pwd_no_retry3(Config) -> ++ login_bad_pwd_no_retry(Config, "password,publickey,keyboard-interactive"). ++ ++login_bad_pwd_no_retry4(Config) -> ++ login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive"). ++ ++login_bad_pwd_no_retry5(Config) -> ++ login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive,password,password"). ++ ++ ++ ++ ++ ++login_bad_pwd_no_retry(Config, AuthMethods) -> ++ PrivDir = proplists:get_value(priv_dir, Config), ++ UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth ++ file:make_dir(UserDir), ++ SysDir = proplists:get_value(data_dir, Config), ++ ++ Parent = self(), ++ PwdFun = fun(_, _, _, undefined) -> {false, 1}; ++ (_, _, _, _) -> Parent ! retry_bad_pwd, ++ false ++ end, ++ ++ {DaemonRef, _Host, Port} = ++ ssh_test_lib:daemon([{system_dir, SysDir}, ++ {user_dir, UserDir}, ++ {auth_methods, AuthMethods}, ++ {user_passwords, [{"foo","somepwd"}]}, ++ {pwdfun, PwdFun} ++ ]), ++ ++ ConnRes = ssh:connect("localhost", Port, ++ [{silently_accept_hosts, true}, ++ {user, "foo"}, ++ {password, "badpwd"}, ++ {user_dir, UserDir}, ++ {user_interaction, false}]), ++ ++ receive ++ retry_bad_pwd -> ++ ssh:stop_daemon(DaemonRef), ++ {fail, "Retry bad password"} ++ after 0 -> ++ case ConnRes of ++ {error,"Unable to connect using the available authentication methods"} -> ++ ssh:stop_daemon(DaemonRef), ++ ok; ++ {ok,Conn} -> ++ ssh:close(Conn), ++ ssh:stop_daemon(DaemonRef), ++ {fail, "Connect erroneosly succeded"} ++ end ++ end. ++ ++%%-------------------------------------------------------------------- + %% Internal functions ------------------------------------------------ + %%-------------------------------------------------------------------- + %% Due to timing the error message may or may not be delivered to +--- a/lib/ssh/vsn.mk ++++ b/lib/ssh/vsn.mk +@@ -1,5 +1,5 @@ + #-*-makefile-*- ; force emacs to enter makefile-mode + +-SSH_VSN = 4.3 ++SSH_VSN = 4.3.1 + + APP_VSN = "ssh-$(SSH_VSN)" +--- a/lib/tools/doc/src/notes.xml ++++ b/lib/tools/doc/src/notes.xml +@@ -31,6 +31,21 @@ + +

This document describes the changes made to the Tools application.

+ ++
Tools 2.8.5 ++ ++
Fixed Bugs and Malfunctions ++ ++ ++

Correct a bug when adding multiple modules to an Xref ++ server. The bug was introduced in OTP-19.0.

++

++ Own Id: OTP-13708 Aux Id: ERL-173

++
++
++
++ ++
++ +
Tools 2.8.4 + +
Fixed Bugs and Malfunctions +--- a/lib/tools/src/xref_base.erl ++++ b/lib/tools/src/xref_base.erl +@@ -746,7 +746,7 @@ read_a_module({Dir, BaseName}, AppName, Builtins, Verbose, Warnings, Mode) -> + message(Warnings, no_debug_info, [File]), + no; + {ok, M, Data, UnresCalls0} -> +- message(Verbose, done, [File]), ++ message(Verbose, done_file, [File]), + %% Remove duplicates. Identical unresolved calls on the + %% same line are counted as _one_ unresolved call. + UnresCalls = usort(UnresCalls0), +@@ -1842,6 +1842,8 @@ message(true, What, Arg) -> + set_up -> + io:format("Setting up...", Arg); + done -> ++ io:format("done~n", Arg); ++ done_file -> + io:format("done reading ~ts~n", Arg); + error -> + io:format("error~n", Arg); +--- a/lib/tools/test/xref_SUITE.erl ++++ b/lib/tools/test/xref_SUITE.erl +@@ -50,7 +50,7 @@ + + -export([analyze/1, basic/1, md/1, q/1, variables/1, unused_locals/1]). + +--export([format_error/1, otp_7423/1, otp_7831/1, otp_10192/1]). ++-export([format_error/1, otp_7423/1, otp_7831/1, otp_10192/1, otp_13708/1]). + + -import(lists, [append/2, flatten/1, keysearch/3, member/2, sort/1, usort/1]). + +@@ -82,7 +82,7 @@ groups() -> + fun_mfa_r14, fun_mfa_vars, qlc]}, + {analyses, [], + [analyze, basic, md, q, variables, unused_locals]}, +- {misc, [], [format_error, otp_7423, otp_7831, otp_10192]}]. ++ {misc, [], [format_error, otp_7423, otp_7831, otp_10192, otp_13708]}]. + + + init_per_suite(Conf) when is_list(Conf) -> +@@ -2393,6 +2393,19 @@ otp_10192(Conf) when is_list(Conf) -> + xref:stop(s), + ok. + ++%% OTP-10192. Allow filenames with character codes greater than 126. ++otp_13708(Conf) when is_list(Conf) -> ++ {ok, _} = start(s), ++ ok = xref:set_default(s, [{verbose, true}]), ++ {ok, []} = xref:q(s,"E"), ++ xref:stop(s), ++ ++ CopyDir = ?copydir, ++ Dir = fname(CopyDir,"lib_test"), ++ {ok, _} = start(s), ++ ok = xref:set_library_path(s, [Dir], [{verbose, true}]), ++ xref:stop(s). ++ + %%% + %%% Utilities + %%% +--- a/lib/tools/vsn.mk ++++ b/lib/tools/vsn.mk +@@ -1 +1 @@ +-TOOLS_VSN = 2.8.4 ++TOOLS_VSN = 2.8.5 +--- a/otp_versions.table ++++ b/otp_versions.table +@@ -1,3 +1,4 @@ ++OTP-19.0.1 : dialyzer-3.0.1 erts-8.0.1 inets-6.3.1 observer-2.2.1 ssh-4.3.1 tools-2.8.5 # asn1-4.0.3 common_test-1.12.2 compiler-7.0 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7 debugger-4.2 diameter-1.12 edoc-0.7.19 eldap-1.2.2 erl_docgen-0.5 erl_interface-3.9 et-1.6 eunit-2.3 gs-1.6.1 hipe-3.15.1 ic-4.4.1 jinterface-1.7 kernel-5.0 megaco-3.18.1 mnesia-4.14 odbc-2.11.2 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.2 percept-0.9 public_key-1.2 reltool-0.7.1 runtime_tools-1.10 sasl-3.0 snmp-5.2.3 ssl-8.0 stdlib-3.0 syntax_tools-2.0 typer-0.9.11 wx-1.7 xmerl-1.3.11 : + OTP-19.0 : asn1-4.0.3 common_test-1.12.2 compiler-7.0 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7 debugger-4.2 dialyzer-3.0 diameter-1.12 edoc-0.7.19 eldap-1.2.2 erl_docgen-0.5 erl_interface-3.9 erts-8.0 et-1.6 eunit-2.3 gs-1.6.1 hipe-3.15.1 ic-4.4.1 inets-6.3 jinterface-1.7 kernel-5.0 megaco-3.18.1 mnesia-4.14 observer-2.2 odbc-2.11.2 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.2 percept-0.9 public_key-1.2 reltool-0.7.1 runtime_tools-1.10 sasl-3.0 snmp-5.2.3 ssh-4.3 ssl-8.0 stdlib-3.0 syntax_tools-2.0 tools-2.8.4 typer-0.9.11 wx-1.7 xmerl-1.3.11 # : + OTP-18.3.4 : inets-6.2.4 ssl-7.3.3 # asn1-4.0.2 common_test-1.12.1 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 : + OTP-18.3.3 : common_test-1.12.1 inets-6.2.3 ssl-7.3.2 # asn1-4.0.2 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 : diff --git a/community/erlang/0060-set-disksup_posix_only-to-true.patch b/community/erlang/0060-set-disksup_posix_only-to-true.patch deleted file mode 100644 index a32c60c200..0000000000 --- a/community/erlang/0060-set-disksup_posix_only-to-true.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- otp_src_18.0/lib/os_mon/src/disksup.erl -+++ otp_src_18.0-fixed/lib/os_mon/src/disksup.erl -@@ -87,7 +87,7 @@ - - param_default(disk_space_check_interval) -> 30; - param_default(disk_almost_full_threshold) -> 0.80; --param_default(disksup_posix_only) -> false. -+param_default(disksup_posix_only) -> true. - - %%---------------------------------------------------------------------- - %% gen_server callbacks ---- otp_src_18.0/lib/os_mon/test/disksup_SUITE.erl -+++ otp_src_18.0-fixed/lib/os_mon/test/disksup_SUITE.erl -@@ -337,7 +337,7 @@ - []; - restart(Config) when is_list(Config) -> - ok = application:set_env(os_mon, start_disksup, true), -- ok = application:set_env(os_mon, disksup_posix_only, false), -+ ok = application:set_env(os_mon, disksup_posix_only, true), - {ok, _Pid} = supervisor:restart_child(os_mon_sup, disksup), - ok. - diff --git a/community/erlang/0070-otp-update-version-18.3.2.patch b/community/erlang/0070-otp-update-version-18.3.2.patch deleted file mode 100644 index 8e38f925e5..0000000000 --- a/community/erlang/0070-otp-update-version-18.3.2.patch +++ /dev/null @@ -1,1887 +0,0 @@ ---- a/OTP_VERSION -+++ b/OTP_VERSION -@@ -1 +1 @@ --18.3 -+18.3.2 ---- a/erts/doc/src/notes.xml -+++ b/erts/doc/src/notes.xml -@@ -32,6 +32,71 @@ -

This document describes the changes made to the ERTS application.

- - -+
Erts 7.3.1 -+ -+
Fixed Bugs and Malfunctions -+ -+ -+

-+ process_info(Pid, last_calls) did not work for -+ Pid /= self().

-+

-+ Own Id: OTP-13418

-+
-+ -+

-+ Make sure to create a crash dump when running out of -+ memory. This was accidentally removed in the erts-7.3 -+ release.

-+

-+ Own Id: OTP-13419

-+
-+ -+

-+ Schedulers could be woken by a premature timeout on -+ Linux. This premature wakeup was however harmless.

-+

-+ Own Id: OTP-13420

-+
-+ -+

-+ A process communicating with a port via one of the -+ erlang:port_* BIFs could potentially end up in an -+ inconsistent state if the port terminated during the -+ communication. When this occurred the process could later -+ block in a receive even though it had messages -+ matching in its message queue.

-+

-+ This bug was introduced in erts version 5.10 (OTP R16A).

-+

-+ Own Id: OTP-13424 Aux Id: OTP-10336

-+
-+ -+

-+ The reference count of a process structure could under -+ rare circumstances be erroneously managed. When this -+ happened invalid memory accesses occurred.

-+

-+ Own Id: OTP-13446

-+
-+ -+

-+ Fix race between process_flag(trap_exit,true) and -+ a received exit signal.

-+

-+ A process could terminate due to exit signal even though -+ process_flag(trap_exit,true) had returned. A very -+ specific timing between call to process_flag/2 and -+ exit signal from another scheduler was required for this -+ to happen.

-+

-+ Own Id: OTP-13452

-+
-+
-+
-+ -+
-+ -
Erts 7.3 - -
Fixed Bugs and Malfunctions ---- a/erts/emulator/beam/bif.c -+++ b/erts/emulator/beam/bif.c -@@ -1605,14 +1605,17 @@ BIF_RETTYPE process_flag_2(BIF_ALIST_2) - * true. For more info, see implementation of - * erts_send_exit_signal(). - */ -+ erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND); - if (trap_exit) - state = erts_smp_atomic32_read_bor_mb(&BIF_P->state, - ERTS_PSFLG_TRAP_EXIT); - else - state = erts_smp_atomic32_read_band_mb(&BIF_P->state, - ~ERTS_PSFLG_TRAP_EXIT); -+ erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND); -+ - #ifdef ERTS_SMP -- if (ERTS_PROC_PENDING_EXIT(BIF_P)) { -+ if (state & ERTS_PSFLG_PENDING_EXIT) { - erts_handle_pending_exit(BIF_P, ERTS_PROC_LOCK_MAIN); - ERTS_BIF_EXITED(BIF_P); - } ---- a/erts/emulator/beam/erl_alloc.c -+++ b/erts/emulator/beam/erl_alloc.c -@@ -1923,7 +1923,7 @@ erts_alc_fatal_error(int error, int func, ErtsAlcType_t n, ...) - va_start(argp, n); - size = va_arg(argp, Uint); - va_end(argp); -- erts_exit(1, -+ erts_exit(ERTS_DUMP_EXIT, - "%s: Cannot %s %lu bytes of memory (of type \"%s\").\n", - allctr_str, op, size, t_str); - break; ---- a/erts/emulator/beam/erl_bif_info.c -+++ b/erts/emulator/beam/erl_bif_info.c -@@ -1534,7 +1534,7 @@ process_info_aux(Process *BIF_P, - } - - case am_last_calls: { -- struct saved_calls *scb = ERTS_PROC_GET_SAVED_CALLS_BUF(BIF_P); -+ struct saved_calls *scb = ERTS_PROC_GET_SAVED_CALLS_BUF(rp); - if (!scb) { - hp = HAlloc(BIF_P, 3); - res = am_false; ---- a/erts/emulator/beam/erl_process.c -+++ b/erts/emulator/beam/erl_process.c -@@ -9807,12 +9807,14 @@ Process *schedule(Process *p, int calls) - | ERTS_PSFLG_PENDING_EXIT - | ERTS_PSFLG_ACTIVE_SYS)) - == ERTS_PSFLG_SUSPENDED)) { -- if (state & ERTS_PSFLG_FREE) -- erts_proc_dec_refc(p); - if (proxy_p) { - free_proxy_proc(proxy_p); - proxy_p = NULL; - } -+ else if (state & ERTS_PSFLG_FREE) { -+ /* free and not queued by proxy */ -+ erts_proc_dec_refc(p); -+ } - goto pick_next_process; - } - state = new; ---- a/erts/emulator/beam/io.c -+++ b/erts/emulator/beam/io.c -@@ -1529,8 +1529,19 @@ erts_schedule_proc2port_signal(Process *c_p, - erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_MAIN); - - if (sched_res != 0) { -- if (refp) -+ if (refp) { -+ /* -+ * We need to restore the message queue save -+ * pointer to the beginning of the message queue -+ * since the caller now wont wait for a message -+ * containing the reference created above... -+ */ -+ ASSERT(c_p); -+ erts_smp_proc_lock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); -+ JOIN_MESSAGE(c_p); -+ erts_smp_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); - *refp = NIL; -+ } - return ERTS_PORT_OP_DROPPED; - } - return ERTS_PORT_OP_SCHEDULED; ---- a/erts/emulator/test/save_calls_SUITE.erl -+++ b/erts/emulator/test/save_calls_SUITE.erl -@@ -156,8 +156,19 @@ save_calls_1() -> - - ?line erlang:process_flag(self(), save_calls, 10), - ?line {last_calls, L3} = process_info(self(), last_calls), -+ true = (L3 /= false), - ?line L31 = lists:filter(fun is_local_function/1, L3), - ?line [] = L31, -+ erlang:process_flag(self(), save_calls, 0), -+ -+ %% Also check that it works on another process ... -+ Pid = spawn(fun () -> receive after infinity -> ok end end), -+ erlang:process_flag(Pid, save_calls, 10), -+ {last_calls, L4} = process_info(Pid, last_calls), -+ true = (L4 /= false), -+ L41 = lists:filter(fun is_local_function/1, L4), -+ [] = L41, -+ exit(Pid,kill), - ok. - - do_bipp() -> ---- a/erts/lib_src/pthread/ethr_event.c -+++ b/erts/lib_src/pthread/ethr_event.c -@@ -94,6 +94,9 @@ wait__(ethr_event *e, int spincount, ethr_sint64_t timeout) - tsp = NULL; - } - else { -+#ifdef ETHR_HAVE_ETHR_GET_MONOTONIC_TIME -+ start = ethr_get_monotonic_time(); -+#endif - tsp = &ts; - time = timeout; - if (spincount == 0) { -@@ -102,9 +105,6 @@ wait__(ethr_event *e, int spincount, ethr_sint64_t timeout) - goto return_event_on; - goto set_timeout; - } --#ifdef ETHR_HAVE_ETHR_GET_MONOTONIC_TIME -- start = ethr_get_monotonic_time(); --#endif - } - - while (1) { ---- a/erts/vsn.mk -+++ b/erts/vsn.mk -@@ -18,7 +18,7 @@ - # %CopyrightEnd% - # - --VSN = 7.3 -+VSN = 7.3.1 - - # Port number 4365 in 4.2 - # Port number 4366 in 4.3 ---- a/lib/inets/doc/src/mod_esi.xml -+++ b/lib/inets/doc/src/mod_esi.xml -@@ -23,10 +23,6 @@ - - - mod_esi -- Joakim Grebenö -- -- 1997-10-14 -- 2.2 - mod_esi.sgml - - mod_esi -@@ -39,6 +35,56 @@ - - - -+
-+ DATA TYPES -+

The following data types are used in the functions for mod_esi:

-+ -+ -+ env() = -+

{EnvKey()::atom(), Value::term()}

-+
-+ -+

Currently supported key value pairs

-+ -+ -+ {server_software, string()} -+

Indicates the inets version.

-+ -+ {server_name, string()} -+

The local hostname.

-+ -+ {gateway_interface, string()} -+

Legacy string used in CGI, just ignore.

-+ -+ {server_protocol, string()} -+

HTTP version, currently "HTTP/1.1"

-+ -+ {server_port, integer()} -+

Servers port number.

-+ -+ {request_method, "GET | "PUT" | "DELETE | "POST" | "PATCH"} -+ -+ {remote_adress, inet:ip_address()} -+

The clients ip address.

-+ -+ {peer_cert, undefined | no_peercert | DER:binary() -+ -+

For TLS connections where client certificates are used this will -+ be an ASN.1 DER-encoded X509-certificate as an Erlang binary. -+ If client certificates are not used the value will be no_peercert, -+ and if TLS is not used (HTTP or connection is lost due to network failure) -+ the value will be undefined. -+

-+ -+ {script_name, string()} -+

Request URI

-+ -+ {http_LowerCaseHTTPHeaderName, string()} -+

example: {http_content_type, "text/html"}

-+
-+ -+
-+ - - - deliver(SessionID, Data) -> ok | {error, Reason} -@@ -63,11 +109,11 @@ - overhead. Do not assume anything about the data type of - SessionID. SessionID must be the value given - as input to the ESI callback function that you implemented.

-- -+ - -
-
-- -+
-
- ESI Callback Functions -
-@@ -78,9 +124,7 @@ - to the server process by calling mod_esi:deliver/2. - - SessionID = term() -- Env = [EnvironmentDirectives] ++ ParsedHeader -- EnvironmentDirectives = {Key,Value} -- Key = query_string | content_length | server_software | gateway_interface | server_protocol | server_port | request_method | remote_addr | script_name -+ Env = env() - Input = string() - - -@@ -111,9 +155,7 @@ - Creates a dynamic web page and returns it as a list. - This function is deprecated and is only kept for backwards compatibility. - -- Env = [EnvironmentDirectives] ++ ParsedHeader -- EnvironmentDirectives = {Key,Value} -- Key = query_string | content_length | server_software | gateway_interface | server_protocol | server_port | request_method | remote_addr | script_name. -+ Env = env() - Input = string() - Response = string() - ---- a/lib/inets/doc/src/notes.xml -+++ b/lib/inets/doc/src/notes.xml -@@ -33,7 +33,37 @@ - notes.xml - - --
Inets 6.2 -+
Inets 6.2.2 -+ -+
Improvements and New Features -+ -+ -+

-+ Add environment information item peer_cert to mod_esi

-+

-+ Own Id: OTP-13510

-+
-+
-+
-+ -+
-+ -+
Inets 6.2.1 -+ -+
Fixed Bugs and Malfunctions -+ -+ -+

-+ Mend ipv6_host_with_brackets option in httpc

-+

-+ Own Id: OTP-13417

-+
-+
-+
-+ -+
-+ -+
Inets 6.2 - -
Fixed Bugs and Malfunctions - ---- a/lib/inets/src/http_client/httpc.erl -+++ b/lib/inets/src/http_client/httpc.erl -@@ -556,7 +556,7 @@ handle_request(Method, Url, - - Request = #request{from = Receiver, - scheme = Scheme, -- address = {Host, Port}, -+ address = {host_address(Host, BracketedHost), Port}, - path = MaybeEscPath, - pquery = MaybeEscQuery, - method = Method, -@@ -1268,3 +1268,7 @@ child_name(Pid, [_ | Children]) -> - %% d(_, _, _) -> - %% ok. - -+host_address(Host, false) -> -+ Host; -+host_address(Host, true) -> -+ string:strip(string:strip(Host, right, $]), left, $[). ---- a/lib/inets/src/http_server/httpd_example.erl -+++ b/lib/inets/src/http_server/httpd_example.erl -@@ -20,7 +20,7 @@ - %% - -module(httpd_example). - -export([print/1]). ---export([get/2, post/2, yahoo/2, test1/2, get_bin/2]). -+-export([get/2, post/2, yahoo/2, test1/2, get_bin/2, peer/2]). - - -export([newformat/3]). - %% These are used by the inets test-suite -@@ -94,10 +94,26 @@ default(Env,Input) -> - io_lib:format("~p",[httpd:parse_query(Input)]),"\n", - footer()]. - -+peer(Env, Input) -> -+ Header = -+ case proplists:get_value(peer_cert, Env) of -+ undefined -> -+ header("text/html", "Peer-Cert-Exist:false"); -+ _ -> -+ header("text/html", "Peer-Cert-Exist:true") -+ end, -+ [Header, -+ top("Test peer_cert environment option"), -+ "Peer cert: ", -+ io_lib:format("~p",[proplists:get_value(peer_cert, Env)]),"\n", -+ footer()]. -+ - header() -> - header("text/html"). - header(MimeType) -> - "Content-type: " ++ MimeType ++ "\r\n\r\n". -+header(MimeType, Other) -> -+ "Content-type: " ++ MimeType ++ "\r\n" ++ Other ++ "\r\n\r\n". - - top(Title) -> - " ---- a/lib/inets/src/http_server/httpd_script_env.erl -+++ b/lib/inets/src/http_server/httpd_script_env.erl -@@ -61,6 +61,19 @@ which_port(#mod{config_db = ConfigDb}) -> - which_peername(#mod{init_data = #init_data{peername = {_, RemoteAddr}}}) -> - RemoteAddr. - -+which_peercert(#mod{socket_type = {Type, _}, socket = Socket}) when Type == essl; -+ Type == ssl -> -+ case ssl:peercert(Socket) of -+ {ok, Cert} -> -+ Cert; -+ {error, no_peercert} -> -+ no_peercert; -+ _ -> -+ undefined -+ end; -+which_peercert(_) -> %% Not an ssl connection -+ undefined. -+ - which_resolve(#mod{init_data = #init_data{resolve = Resolve}}) -> - Resolve. - -@@ -78,6 +91,7 @@ create_basic_elements(esi, ModData) -> - {server_port, which_port(ModData)}, - {request_method, which_method(ModData)}, - {remote_addr, which_peername(ModData)}, -+ {peer_cert, which_peercert(ModData)}, - {script_name, which_request_uri(ModData)}]; - - create_basic_elements(cgi, ModData) -> ---- a/lib/inets/src/inets_app/inets.appup.src -+++ b/lib/inets/src/inets_app/inets.appup.src -@@ -18,10 +18,16 @@ - %% %CopyrightEnd% - {"%VSN%", - [ -+ {<<"6.2.1">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}]}, -+ {<<"6.2">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}, -+ {load_module, httpc, soft_purge, soft_purge, []}]}, - {<<"6\\..*">>,[{restart_application, inets}]}, - {<<"5\\..*">>,[{restart_application, inets}]} - ], - [ -+ {<<"6.2.1">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}]}, -+ {<<"6.2">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}, -+ {load_module, httpc, soft_purge, soft_purge, []}]}, - {<<"6\\..*">>,[{restart_application, inets}]}, - {<<"5\\..*">>,[{restart_application, inets}]} - ] ---- a/lib/inets/test/httpd_SUITE.erl -+++ b/lib/inets/test/httpd_SUITE.erl -@@ -755,7 +755,11 @@ esi(Config) when is_list(Config) -> - %% Check "ErlScriptNoCache" directive (default: false) - ok = http_status("GET /cgi-bin/erl/httpd_example:get ", - Config, [{statuscode, 200}, -- {no_header, "cache-control"}]). -+ {no_header, "cache-control"}]), -+ ok = http_status("GET /cgi-bin/erl/httpd_example:peer ", -+ Config, [{statuscode, 200}, -+ {header, "peer-cert-exist", peer(Config)}]). -+ - %%------------------------------------------------------------------------- - mod_esi_chunk_timeout(Config) when is_list(Config) -> - ok = httpd_1_1:mod_esi_chunk_timeout(?config(type, Config), -@@ -2065,3 +2069,11 @@ response_default_headers() -> - {"X-Frame-Options", "SAMEORIGIN"}, - %% Override built-in default - {"Date", "Override-date"}]. -+ -+peer(Config) -> -+ case proplists:get_value(type, Config) of -+ ssl -> -+ "true"; -+ _ -> -+ "false" -+ end. -\ No newline at end of file ---- a/lib/inets/vsn.mk -+++ b/lib/inets/vsn.mk -@@ -19,6 +19,6 @@ - # %CopyrightEnd% - - APPLICATION = inets --INETS_VSN = 6.2 -+INETS_VSN = 6.2.2 - PRE_VSN = - APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)" ---- a/lib/mnesia/doc/src/notes.xml -+++ b/lib/mnesia/doc/src/notes.xml -@@ -39,7 +39,23 @@ - thus constitutes one section in this document. The title of each - section is the version number of Mnesia.

- --
Mnesia 4.13.3 -+
Mnesia 4.13.4 -+ -+
Fixed Bugs and Malfunctions -+ -+ -+

-+ Mnesia transactions could hang while waiting on a -+ response from a node who had stopped.

-+

-+ Own Id: OTP-13423

-+
-+
-+
-+ -+
-+ -+
Mnesia 4.13.3 - -
Fixed Bugs and Malfunctions - ---- a/lib/mnesia/src/mnesia_tm.erl -+++ b/lib/mnesia/src/mnesia_tm.erl -@@ -1692,13 +1692,10 @@ commit_participant(Coord, Tid, Bin, C0, DiscNs, _RamNs) -> - ?eval_debug_fun({?MODULE, commit_participant, undo_prepare}, - [{tid, Tid}]); - -- {'EXIT', _, _} -> -+ {'EXIT', _MnesiaTM, Reason} -> -+ reply(Coord, {do_abort, Tid, self(), {bad_commit,Reason}}), - mnesia_recover:log_decision(D#decision{outcome = aborted}), -- ?eval_debug_fun({?MODULE, commit_participant, exit_log_abort}, -- [{tid, Tid}]), -- mnesia_schema:undo_prepare_commit(Tid, C0), -- ?eval_debug_fun({?MODULE, commit_participant, exit_undo_prepare}, -- [{tid, Tid}]); -+ mnesia_schema:undo_prepare_commit(Tid, C0); - - Msg -> - verbose("** ERROR ** commit_participant ~p, got unexpected msg: ~p~n", -@@ -2210,8 +2207,6 @@ reconfigure_coordinators(N, [{Tid, [Store | _]} | Coordinators]) -> - true -> - send_mnesia_down(Tid, Store, N) - end; -- aborted -> -- ignore; % avoid spurious mnesia_down messages - _ -> - %% Tell the coordinator about the mnesia_down - send_mnesia_down(Tid, Store, N) ---- a/lib/mnesia/vsn.mk -+++ b/lib/mnesia/vsn.mk -@@ -1 +1 @@ --MNESIA_VSN = 4.13.3 -+MNESIA_VSN = 4.13.4 ---- a/lib/ssl/doc/src/notes.xml -+++ b/lib/ssl/doc/src/notes.xml -@@ -28,6 +28,36 @@ -

This document describes the changes made to the SSL application.

- - -+
SSL 7.3.1 -+ -+
Fixed Bugs and Malfunctions -+ -+ -+

-+ Corrections to cipher suite handling using the 3 and 4 -+ tuple format in addition to commit -+ 89d7e21cf4ae988c57c8ef047bfe85127875c70c

-+

-+ Own Id: OTP-13511

-+
-+
-+
-+ -+ -+
Improvements and New Features -+ -+ -+

-+ Make values for the TLS-1.2 signature_algorithms -+ extension configurable

-+

-+ Own Id: OTP-13261

-+
-+
-+
-+ -+
-+ -
SSL 7.3 - -
Fixed Bugs and Malfunctions ---- a/lib/ssl/doc/src/ssl.xml -+++ b/lib/ssl/doc/src/ssl.xml -@@ -421,7 +421,6 @@ fun(srp, Username :: string(), UserState :: term()) -> - -

Using {padding_check, boolean()} makes TLS - vulnerable to the Poodle attack.

-- -
- -
-@@ -522,9 +521,45 @@ fun(srp, Username :: string(), UserState :: term()) -> - be supported by the server for the prevention to work. -

- -- -+ {signature_algs, [{hash(), ecdsa | rsa | dsa}]} -+ -+

In addition to the algorithms negotiated by the cipher -+ suite used for key exchange, payload encryption, message -+ authentication and pseudo random calculation, the TLS signature -+ algorithm extension Section 7.4.1.4.1 in RFC 5246 may be -+ used, from TLS 1.2, to negotiate which signature algorithm to use during the -+ TLS handshake. If no lower TLS versions than 1.2 are supported, -+ the client will send a TLS signature algorithm extension -+ with the algorithms specified by this option. -+ Defaults to -+ -+ [ -+%% SHA2 -+{sha512, ecdsa}, -+{sha512, rsa}, -+{sha384, ecdsa}, -+{sha384, rsa}, -+{sha256, ecdsa}, -+{sha256, rsa}, -+{sha224, ecdsa}, -+{sha224, rsa}, -+%% SHA -+{sha, ecdsa}, -+{sha, rsa}, -+{sha, dsa}, -+%% MD5 -+{md5, rsa} -+] -+ -+ The algorithms should be in the preferred order. -+ Selected signature algorithm can restrict which hash functions -+ that may be selected. -+

-+
-+ -
-- -+ -
- SSL OPTION DESCRIPTIONS - SERVER SIDE - -@@ -651,6 +686,14 @@ fun(srp, Username :: string(), UserState :: term()) -> - If true, use the server's preference for cipher selection. If false - (the default), use the client's preference. - -+ -+ {signature_algs, [{hash(), ecdsa | rsa | dsa}]} -+

The algorithms specified by -+ this option will be the ones accepted by the server in a signature algorithm -+ negotiation, introduced in TLS-1.2. The algorithms will also be offered to the client if a -+ client certificate is requested. For more details see the corresponding client option. -+

-+ - -
- ---- a/lib/ssl/src/dtls_connection.erl -+++ b/lib/ssl/src/dtls_connection.erl -@@ -196,8 +196,7 @@ hello(start, #state{host = Host, port = Port, role = client, - {Record, State} = next_record(State1), - next_state(hello, hello, Record, State); - --hello(Hello = #client_hello{client_version = ClientVersion, -- extensions = #hello_extensions{hash_signs = HashSigns}}, -+hello(Hello = #client_hello{client_version = ClientVersion}, - State = #state{connection_states = ConnectionStates0, - port = Port, session = #session{own_certificate = Cert} = Session0, - renegotiation = {Renegotiation, _}, -@@ -209,9 +208,7 @@ hello(Hello = #client_hello{client_version = ClientVersion, - {Version, {Type, Session}, - ConnectionStates, - #hello_extensions{ec_point_formats = EcPointFormats, -- elliptic_curves = EllipticCurves} = ServerHelloExt} -> -- HashSign = ssl_handshake:select_hashsign(HashSigns, Cert, -- dtls_v1:corresponding_tls_version(Version)), -+ elliptic_curves = EllipticCurves} = ServerHelloExt, HashSign} -> - ssl_connection:hello({common_client_hello, Type, ServerHelloExt, HashSign}, - State#state{connection_states = ConnectionStates, - negotiated_version = Version, ---- a/lib/ssl/src/dtls_handshake.erl -+++ b/lib/ssl/src/dtls_handshake.erl -@@ -94,7 +94,10 @@ hello(#server_hello{server_version = Version, random = Random, - - hello(#client_hello{client_version = ClientVersion}, _Options, {_,_,_,_,ConnectionStates,_}, _Renegotiation) -> - %% Return correct typ to make dialyzer happy until we have time to make the real imp. -- {ClientVersion, {new, #session{}}, ConnectionStates, #hello_extensions{}}. -+ HashSigns = tls_v1:default_signature_algs(dtls_v1:corresponding_tls_version(ClientVersion)), -+ {ClientVersion, {new, #session{}}, ConnectionStates, #hello_extensions{}, -+ %% Placeholder for real hasign handling -+ hd(HashSigns)}. - - %% hello(Address, Port, - %% #ssl_tls{epoch = _Epoch, sequence_number = _Seq, ---- a/lib/ssl/src/ssl.appup.src -+++ b/lib/ssl/src/ssl.appup.src -@@ -1,9 +1,6 @@ - %% -*- erlang -*- - {"%VSN%", - [ -- {<<"7\\.2">>, [{load_module, tls_connection, soft_purge, soft_purge, []}, -- {load_module, ssl_tls_dist_proxy, soft_purge, soft_purge, []} -- ]}, - {<<"7\\..*">>, [{restart_application, ssl}]}, - {<<"6\\..*">>, [{restart_application, ssl}]}, - {<<"5\\..*">>, [{restart_application, ssl}]}, -@@ -11,9 +8,6 @@ - {<<"3\\..*">>, [{restart_application, ssl}]} - ], - [ -- {<<"7\\.2">>, [{load_module, tls_connection, soft_purge, soft_purge, []}, -- {load_module, ssl_tls_dist_proxy, soft_purge, soft_purge, []} -- ]}, - {<<"7\\..*">>, [{restart_application, ssl}]}, - {<<"6\\..*">>, [{restart_application, ssl}]}, - {<<"5\\..*">>, [{restart_application, ssl}]}, ---- a/lib/ssl/src/ssl.erl -+++ b/lib/ssl/src/ssl.erl -@@ -700,6 +700,10 @@ handle_options(Opts0, Role) -> - srp_identity = handle_option(srp_identity, Opts, undefined), - ciphers = handle_cipher_option(proplists:get_value(ciphers, Opts, []), - RecordCb:highest_protocol_version(Versions)), -+ signature_algs = handle_hashsigns_option(proplists:get_value(signature_algs, Opts, -+ default_option_role(server, -+ tls_v1:default_signature_algs(Versions), Role)), -+ RecordCb:highest_protocol_version(Versions)), - %% Server side option - reuse_session = handle_option(reuse_session, Opts, ReuseSessionFun), - reuse_sessions = handle_option(reuse_sessions, Opts, true), -@@ -749,7 +753,7 @@ handle_options(Opts0, Role) -> - alpn_preferred_protocols, next_protocols_advertised, - client_preferred_next_protocols, log_alert, - server_name_indication, honor_cipher_order, padding_check, crl_check, crl_cache, -- fallback], -+ fallback, signature_algs], - - SockOpts = lists:foldl(fun(Key, PropList) -> - proplists:delete(Key, PropList) -@@ -989,6 +993,18 @@ validate_option(crl_cache, {Cb, {_Handle, Options}} = Value) when is_atom(Cb) an - validate_option(Opt, Value) -> - throw({error, {options, {Opt, Value}}}). - -+handle_hashsigns_option(Value, {Major, Minor} = Version) when is_list(Value) -+ andalso Major >= 3 andalso Minor >= 3-> -+ case tls_v1:signature_algs(Version, Value) of -+ [] -> -+ throw({error, {options, no_supported_algorithms, {signature_algs, Value}}}); -+ _ -> -+ Value -+ end; -+handle_hashsigns_option(_, {Major, Minor} = Version) when Major >= 3 andalso Minor >= 3-> -+ handle_hashsigns_option(tls_v1:default_signature_algs(Version), Version); -+handle_hashsigns_option(_, _Version) -> -+ undefined. - - validate_options([]) -> - []; -@@ -1089,10 +1105,7 @@ binary_cipher_suites(Version, []) -> - %% Defaults to all supported suites that does - %% not require explicit configuration - ssl_cipher:filter_suites(ssl_cipher:suites(Version)); --binary_cipher_suites(Version, [{_,_,_,_}| _] = Ciphers0) -> %% Backwards compatibility -- Ciphers = [{KeyExchange, Cipher, Hash} || {KeyExchange, Cipher, Hash, _} <- Ciphers0], -- binary_cipher_suites(Version, Ciphers); --binary_cipher_suites(Version, [{_,_,_}| _] = Ciphers0) -> -+binary_cipher_suites(Version, [Tuple|_] = Ciphers0) when is_tuple(Tuple) -> - Ciphers = [ssl_cipher:suite(C) || C <- Ciphers0], - binary_cipher_suites(Version, Ciphers); - -@@ -1285,6 +1298,13 @@ new_ssl_options([{server_name_indication, Value} | Rest], #ssl_options{} = Opts, - new_ssl_options(Rest, Opts#ssl_options{server_name_indication = validate_option(server_name_indication, Value)}, RecordCB); - new_ssl_options([{honor_cipher_order, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> - new_ssl_options(Rest, Opts#ssl_options{honor_cipher_order = validate_option(honor_cipher_order, Value)}, RecordCB); -+new_ssl_options([{signature_algs, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> -+ new_ssl_options(Rest, -+ Opts#ssl_options{signature_algs = -+ handle_hashsigns_option(Value, -+ RecordCB:highest_protocol_version())}, -+ RecordCB); -+ - new_ssl_options([{Key, Value} | _Rest], #ssl_options{}, _) -> - throw({error, {options, {Key, Value}}}). - ---- a/lib/ssl/src/ssl_cipher.erl -+++ b/lib/ssl/src/ssl_cipher.erl -@@ -43,11 +43,12 @@ - - -export_type([cipher_suite/0, - erl_cipher_suite/0, openssl_cipher_suite/0, -- key_algo/0]). -+ hash/0, key_algo/0, sign_algo/0]). - - -type cipher() :: null |rc4_128 | idea_cbc | des40_cbc | des_cbc | '3des_ede_cbc' - | aes_128_cbc | aes_256_cbc | aes_128_gcm | aes_256_gcm | chacha20_poly1305. - -type hash() :: null | sha | md5 | sha224 | sha256 | sha384 | sha512. -+-type sign_algo() :: rsa | dsa | ecdsa. - -type key_algo() :: null | rsa | dhe_rsa | dhe_dss | ecdhe_ecdsa| ecdh_ecdsa | ecdh_rsa| srp_rsa| srp_dss | psk | dhe_psk | rsa_psk | dh_anon | ecdh_anon | srp_anon. - -type erl_cipher_suite() :: {key_algo(), cipher(), hash()} % Pre TLS 1.2 - %% TLS 1.2, internally PRE TLS 1.2 will use default_prf -@@ -841,17 +842,17 @@ suite({rsa_psk, aes_256_cbc,sha}) -> - - %%% TLS 1.2 PSK Cipher Suites RFC 5487 - --suite({psk, aes_128_gcm, null}) -> -+suite({psk, aes_128_gcm, null, sha256}) -> - ?TLS_PSK_WITH_AES_128_GCM_SHA256; --suite({psk, aes_256_gcm, null}) -> -+suite({psk, aes_256_gcm, null, sha384}) -> - ?TLS_PSK_WITH_AES_256_GCM_SHA384; --suite({dhe_psk, aes_128_gcm, null}) -> -+suite({dhe_psk, aes_128_gcm, null, sha256}) -> - ?TLS_DHE_PSK_WITH_AES_128_GCM_SHA256; --suite({dhe_psk, aes_256_gcm, null}) -> -+suite({dhe_psk, aes_256_gcm, null, sha384}) -> - ?TLS_DHE_PSK_WITH_AES_256_GCM_SHA384; --suite({rsa_psk, aes_128_gcm, null}) -> -+suite({rsa_psk, aes_128_gcm, null, sha256}) -> - ?TLS_RSA_PSK_WITH_AES_128_GCM_SHA256; --suite({rsa_psk, aes_256_gcm, null}) -> -+suite({rsa_psk, aes_256_gcm, null, sha384}) -> - ?TLS_RSA_PSK_WITH_AES_256_GCM_SHA384; - - suite({psk, aes_128_cbc, sha256}) -> -@@ -958,74 +959,74 @@ suite({ecdh_anon, aes_256_cbc, sha}) -> - ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA; - - %%% RFC 5289 EC TLS suites --suite({ecdhe_ecdsa, aes_128_cbc, sha256}) -> -+suite({ecdhe_ecdsa, aes_128_cbc, sha256, sha256}) -> - ?TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256; --suite({ecdhe_ecdsa, aes_256_cbc, sha384}) -> -+suite({ecdhe_ecdsa, aes_256_cbc, sha384, sha384}) -> - ?TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384; --suite({ecdh_ecdsa, aes_128_cbc, sha256}) -> -+suite({ecdh_ecdsa, aes_128_cbc, sha256, sha256}) -> - ?TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256; --suite({ecdh_ecdsa, aes_256_cbc, sha384}) -> -+suite({ecdh_ecdsa, aes_256_cbc, sha384, sha384}) -> - ?TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384; --suite({ecdhe_rsa, aes_128_cbc, sha256}) -> -+suite({ecdhe_rsa, aes_128_cbc, sha256, sha256}) -> - ?TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256; --suite({ecdhe_rsa, aes_256_cbc, sha384}) -> -+suite({ecdhe_rsa, aes_256_cbc, sha384, sha384}) -> - ?TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384; --suite({ecdh_rsa, aes_128_cbc, sha256}) -> -+suite({ecdh_rsa, aes_128_cbc, sha256, sha256}) -> - ?TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256; --suite({ecdh_rsa, aes_256_cbc, sha384}) -> -+suite({ecdh_rsa, aes_256_cbc, sha384, sha384}) -> - ?TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384; - - %% RFC 5288 AES-GCM Cipher Suites --suite({rsa, aes_128_gcm, null}) -> -+suite({rsa, aes_128_gcm, null, sha256}) -> - ?TLS_RSA_WITH_AES_128_GCM_SHA256; - suite({rsa, aes_256_gcm, null}) -> - ?TLS_RSA_WITH_AES_256_GCM_SHA384; --suite({dhe_rsa, aes_128_gcm, null}) -> -+suite({dhe_rsa, aes_128_gcm, null, sha384}) -> - ?TLS_DHE_RSA_WITH_AES_128_GCM_SHA256; --suite({dhe_rsa, aes_256_gcm, null}) -> -+suite({dhe_rsa, aes_256_gcm, null, sha256}) -> - ?TLS_DHE_RSA_WITH_AES_256_GCM_SHA384; --suite({dh_rsa, aes_128_gcm, null}) -> -+suite({dh_rsa, aes_128_gcm, null, sha384}) -> - ?TLS_DH_RSA_WITH_AES_128_GCM_SHA256; --suite({dh_rsa, aes_256_gcm, null}) -> -+suite({dh_rsa, aes_256_gcm, null, sha256}) -> - ?TLS_DH_RSA_WITH_AES_256_GCM_SHA384; --suite({dhe_dss, aes_128_gcm, null}) -> -+suite({dhe_dss, aes_128_gcm, null, sha384}) -> - ?TLS_DHE_DSS_WITH_AES_128_GCM_SHA256; --suite({dhe_dss, aes_256_gcm, null}) -> -+suite({dhe_dss, aes_256_gcm, null, sha256}) -> - ?TLS_DHE_DSS_WITH_AES_256_GCM_SHA384; --suite({dh_dss, aes_128_gcm, null}) -> -+suite({dh_dss, aes_128_gcm, null, sha384}) -> - ?TLS_DH_DSS_WITH_AES_128_GCM_SHA256; --suite({dh_dss, aes_256_gcm, null}) -> -+suite({dh_dss, aes_256_gcm, null, sha384}) -> - ?TLS_DH_DSS_WITH_AES_256_GCM_SHA384; --suite({dh_anon, aes_128_gcm, null}) -> -+suite({dh_anon, aes_128_gcm, null, sha256}) -> - ?TLS_DH_anon_WITH_AES_128_GCM_SHA256; --suite({dh_anon, aes_256_gcm, null}) -> -+suite({dh_anon, aes_256_gcm, null, sha384}) -> - ?TLS_DH_anon_WITH_AES_256_GCM_SHA384; - - %% RFC 5289 ECC AES-GCM Cipher Suites --suite({ecdhe_ecdsa, aes_128_gcm, null}) -> -+suite({ecdhe_ecdsa, aes_128_gcm, null, sha256}) -> - ?TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; --suite({ecdhe_ecdsa, aes_256_gcm, null}) -> -+suite({ecdhe_ecdsa, aes_256_gcm, null, sha384}) -> - ?TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384; --suite({ecdh_ecdsa, aes_128_gcm, null}) -> -+suite({ecdh_ecdsa, aes_128_gcm, null, sha256}) -> - ?TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256; --suite({ecdh_ecdsa, aes_256_gcm, null}) -> -+suite({ecdh_ecdsa, aes_256_gcm, null, sha384}) -> - ?TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384; --suite({ecdhe_rsa, aes_128_gcm, null}) -> -+suite({ecdhe_rsa, aes_128_gcm, null, sha256}) -> - ?TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256; --suite({ecdhe_rsa, aes_256_gcm, null}) -> -+suite({ecdhe_rsa, aes_256_gcm, null, sha384}) -> - ?TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384; --suite({ecdh_rsa, aes_128_gcm, null}) -> -+suite({ecdh_rsa, aes_128_gcm, null, sha256}) -> - ?TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256; --suite({ecdh_rsa, aes_256_gcm, null}) -> -+suite({ecdh_rsa, aes_256_gcm, null, sha384}) -> - ?TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384; - - - %% draft-agl-tls-chacha20poly1305-04 Chacha20/Poly1305 Suites --suite({ecdhe_rsa, chacha20_poly1305, null}) -> -+suite({ecdhe_rsa, chacha20_poly1305, null, sha256}) -> - ?TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256; --suite({ecdhe_ecdsa, chacha20_poly1305, null}) -> -+suite({ecdhe_ecdsa, chacha20_poly1305, null, sha256}) -> - ?TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256; --suite({dhe_rsa, chacha20_poly1305, null}) -> -+suite({dhe_rsa, chacha20_poly1305, null, sha256}) -> - ?TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256. - - %%-------------------------------------------------------------------- ---- a/lib/ssl/src/ssl_connection.erl -+++ b/lib/ssl/src/ssl_connection.erl -@@ -304,13 +304,9 @@ hello(#hello_request{}, #state{role = client} = State0, Connection) -> - {Record, State} = Connection:next_record(State0), - Connection:next_state(hello, hello, Record, State); - --hello({common_client_hello, Type, ServerHelloExt, NegotiatedHashSign}, -+hello({common_client_hello, Type, ServerHelloExt}, - State, Connection) -> -- do_server_hello(Type, ServerHelloExt, -- %% Note NegotiatedHashSign is only negotiated for real if -- %% if TLS version is at least TLS-1.2 -- State#state{hashsign_algorithm = NegotiatedHashSign}, Connection); -- -+ do_server_hello(Type, ServerHelloExt, State, Connection); - hello(timeout, State, _) -> - {next_state, hello, State, hibernate}; - -@@ -442,7 +438,8 @@ certify(#server_key_exchange{exchange_keys = Keys}, - Alg == srp_dss; Alg == srp_rsa; Alg == srp_anon -> - - Params = ssl_handshake:decode_server_key(Keys, Alg, Version), -- HashSign = negotiated_hashsign(Params#server_key_params.hashsign, Alg, Version), -+ %% Use negotiated value if TLS-1.2 otherwhise return default -+ HashSign = negotiated_hashsign(Params#server_key_params.hashsign, Alg, PubKeyInfo, Version), - case is_anonymous(Alg) of - true -> - calculate_secret(Params#server_key_params.params, -@@ -464,11 +461,18 @@ certify(#server_key_exchange{} = Msg, - - certify(#certificate_request{hashsign_algorithms = HashSigns}, - #state{session = #session{own_certificate = Cert}, -- negotiated_version = Version} = State0, Connection) -> -- HashSign = ssl_handshake:select_hashsign(HashSigns, Cert, Version), -- {Record, State} = Connection:next_record(State0#state{client_certificate_requested = true}), -- Connection:next_state(certify, certify, Record, -- State#state{cert_hashsign_algorithm = HashSign}); -+ key_algorithm = KeyExAlg, -+ ssl_options = #ssl_options{signature_algs = SupportedHashSigns}, -+ negotiated_version = Version} = State0, Connection) -> -+ -+ case ssl_handshake:select_hashsign(HashSigns, Cert, KeyExAlg, SupportedHashSigns, Version) of -+ #alert {} = Alert -> -+ Connection:handle_own_alert(Alert, Version, certify, State0); -+ NegotiatedHashSign -> -+ {Record, State} = Connection:next_record(State0#state{client_certificate_requested = true}), -+ Connection:next_state(certify, certify, Record, -+ State#state{cert_hashsign_algorithm = NegotiatedHashSign}) -+ end; - - %% PSK and RSA_PSK might bypass the Server-Key-Exchange - certify(#server_hello_done{}, -@@ -576,13 +580,15 @@ cipher(#hello_request{}, State0, Connection) -> - - cipher(#certificate_verify{signature = Signature, hashsign_algorithm = CertHashSign}, - #state{role = server, -- public_key_info = {Algo, _, _} =PublicKeyInfo, -+ key_algorithm = KexAlg, -+ public_key_info = PublicKeyInfo, - negotiated_version = Version, - session = #session{master_secret = MasterSecret}, - tls_handshake_history = Handshake - } = State0, Connection) -> -- -- HashSign = ssl_handshake:select_hashsign_algs(CertHashSign, Algo, Version), -+ -+ %% Use negotiated value if TLS-1.2 otherwhise return default -+ HashSign = negotiated_hashsign(CertHashSign, KexAlg, PublicKeyInfo, Version), - case ssl_handshake:certificate_verify(Signature, PublicKeyInfo, - Version, HashSign, MasterSecret, Handshake) of - valid -> -@@ -1448,7 +1454,8 @@ rsa_psk_key_exchange(Version, PskIdentity, PremasterSecret, PublicKeyInfo = {Alg - rsa_psk_key_exchange(_, _, _, _) -> - throw (?ALERT_REC(?FATAL,?HANDSHAKE_FAILURE)). - --request_client_cert(#state{ssl_options = #ssl_options{verify = verify_peer}, -+request_client_cert(#state{ssl_options = #ssl_options{verify = verify_peer, -+ signature_algs = SupportedHashSigns}, - connection_states = ConnectionStates0, - cert_db = CertDbHandle, - cert_db_ref = CertDbRef, -@@ -1456,7 +1463,9 @@ request_client_cert(#state{ssl_options = #ssl_options{verify = verify_peer}, - #connection_state{security_parameters = - #security_parameters{cipher_suite = CipherSuite}} = - ssl_record:pending_connection_state(ConnectionStates0, read), -- Msg = ssl_handshake:certificate_request(CipherSuite, CertDbHandle, CertDbRef, Version), -+ HashSigns = ssl_handshake:available_signature_algs(SupportedHashSigns, Version, [Version]), -+ Msg = ssl_handshake:certificate_request(CipherSuite, CertDbHandle, CertDbRef, -+ HashSigns, Version), - State = Connection:send_handshake(Msg, State0), - State#state{client_certificate_requested = true}; - -@@ -1881,15 +1890,16 @@ make_premaster_secret({MajVer, MinVer}, rsa) -> - make_premaster_secret(_, _) -> - undefined. - --negotiated_hashsign(undefined, Alg, Version) -> -+negotiated_hashsign(undefined, KexAlg, PubKeyInfo, Version) -> - %% Not negotiated choose default -- case is_anonymous(Alg) of -+ case is_anonymous(KexAlg) of - true -> - {null, anon}; - false -> -- ssl_handshake:select_hashsign_algs(Alg, Version) -+ {PubAlg, _, _} = PubKeyInfo, -+ ssl_handshake:select_hashsign_algs(undefined, PubAlg, Version) - end; --negotiated_hashsign(HashSign = {_, _}, _, _) -> -+negotiated_hashsign(HashSign = {_, _}, _, _, _) -> - HashSign. - - ssl_options_list(SslOptions) -> ---- a/lib/ssl/src/ssl_handshake.erl -+++ b/lib/ssl/src/ssl_handshake.erl -@@ -46,7 +46,7 @@ - - %% Handshake messages - -export([hello_request/0, server_hello/4, server_hello_done/0, -- certificate/4, certificate_request/4, key_exchange/3, -+ certificate/4, certificate_request/5, key_exchange/3, - finished/5, next_protocol/1]). - - %% Handle handshake messages -@@ -64,8 +64,8 @@ - ]). - - %% Cipher suites handling ---export([available_suites/2, cipher_suites/2, -- select_session/10, supported_ecc/1]). -+-export([available_suites/2, available_signature_algs/3, cipher_suites/2, -+ select_session/11, supported_ecc/1]). - - %% Extensions handling - -export([client_hello_extensions/6, -@@ -74,8 +74,8 @@ - ]). - - %% MISC ---export([select_version/3, prf/5, select_hashsign/3, -- select_hashsign_algs/2, select_hashsign_algs/3, -+-export([select_version/3, prf/5, select_hashsign/5, -+ select_hashsign_algs/3, - premaster_secret/2, premaster_secret/3, premaster_secret/4]). - - %%==================================================================== -@@ -120,7 +120,8 @@ server_hello(SessionId, Version, ConnectionStates, Extensions) -> - server_hello_done() -> - #server_hello_done{}. - --client_hello_extensions(Host, Version, CipherSuites, SslOpts, ConnectionStates, Renegotiation) -> -+client_hello_extensions(Host, Version, CipherSuites, -+ #ssl_options{signature_algs = SupportedHashSigns, versions = AllVersions} = SslOpts, ConnectionStates, Renegotiation) -> - {EcPointFormats, EllipticCurves} = - case advertises_ec_ciphers(lists:map(fun ssl_cipher:suite_definition/1, CipherSuites)) of - true -> -@@ -134,7 +135,7 @@ client_hello_extensions(Host, Version, CipherSuites, SslOpts, ConnectionStates, - renegotiation_info = renegotiation_info(tls_record, client, - ConnectionStates, Renegotiation), - srp = SRP, -- hash_signs = advertised_hash_signs(Version), -+ signature_algs = available_signature_algs(SupportedHashSigns, Version, AllVersions), - ec_point_formats = EcPointFormats, - elliptic_curves = EllipticCurves, - alpn = encode_alpn(SslOpts#ssl_options.alpn_advertised_protocols, Renegotiation), -@@ -203,14 +204,14 @@ client_certificate_verify(OwnCert, MasterSecret, Version, - end. - - %%-------------------------------------------------------------------- ---spec certificate_request(ssl_cipher:cipher_suite(), db_handle(), certdb_ref(), ssl_record:ssl_version()) -> -- #certificate_request{}. -+-spec certificate_request(ssl_cipher:cipher_suite(), db_handle(), -+ certdb_ref(), #hash_sign_algos{}, ssl_record:ssl_version()) -> -+ #certificate_request{}. - %% - %% Description: Creates a certificate_request message, called by the server. - %%-------------------------------------------------------------------- --certificate_request(CipherSuite, CertDbHandle, CertDbRef, Version) -> -+certificate_request(CipherSuite, CertDbHandle, CertDbRef, HashSigns, Version) -> - Types = certificate_types(ssl_cipher:suite_definition(CipherSuite), Version), -- HashSigns = advertised_hash_signs(Version), - Authorities = certificate_authorities(CertDbHandle, CertDbRef), - #certificate_request{ - certificate_types = Types, -@@ -351,6 +352,9 @@ verify_server_key(#server_key_params{params_bin = EncParams, - %% - %% Description: Checks that the certificate_verify message is valid. - %%-------------------------------------------------------------------- -+certificate_verify(_, _, _, undefined, _, _) -> -+ ?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE); -+ - certificate_verify(Signature, PublicKeyInfo, Version, - HashSign = {HashAlgo, _}, MasterSecret, {_, Handshake}) -> - Hash = calc_certificate_verify(Version, HashAlgo, MasterSecret, Handshake), -@@ -379,10 +383,11 @@ verify_signature(_Version, Hash, _HashAlgo, Signature, {?rsaEncryption, PubKey, - end; - verify_signature(_Version, Hash, {HashAlgo, dsa}, Signature, {?'id-dsa', PublicKey, PublicKeyParams}) -> - public_key:verify({digest, Hash}, HashAlgo, Signature, {PublicKey, PublicKeyParams}); --verify_signature(_Version, Hash, {HashAlgo, ecdsa}, Signature, -+verify_signature(_, Hash, {HashAlgo, _SignAlg}, Signature, - {?'id-ecPublicKey', PublicKey, PublicKeyParams}) -> - public_key:verify({digest, Hash}, HashAlgo, Signature, {PublicKey, PublicKeyParams}). - -+ - %%-------------------------------------------------------------------- - -spec certify(#certificate{}, db_handle(), certdb_ref(), integer() | nolimit, - verify_peer | verify_none, {fun(), term}, fun(), term(), term(), -@@ -573,43 +578,46 @@ prf({3,_N}, Secret, Label, Seed, WantedLength) -> - - - %%-------------------------------------------------------------------- ---spec select_hashsign(#hash_sign_algos{}| undefined, undefined | binary(), ssl_record:ssl_version()) -> -- {atom(), atom()} | undefined. -+-spec select_hashsign(#hash_sign_algos{} | undefined, undefined | binary(), -+ atom(), [atom()], ssl_record:ssl_version()) -> -+ {atom(), atom()} | undefined | #alert{}. - - %% --%% Description: -+%% Description: Handles signature_algorithms extension - %%-------------------------------------------------------------------- --select_hashsign(_, undefined, _Version) -> -+select_hashsign(_, undefined, _, _, _Version) -> - {null, anon}; - %% The signature_algorithms extension was introduced with TLS 1.2. Ignore it if we have - %% negotiated a lower version. --select_hashsign(#hash_sign_algos{hash_sign_algos = HashSigns}, Cert, {Major, Minor} = Version) -- when Major >= 3 andalso Minor >= 3 -> -- #'OTPCertificate'{tbsCertificate = TBSCert} =public_key:pkix_decode_cert(Cert, otp), -+select_hashsign(HashSigns, Cert, KeyExAlgo, -+ undefined, {Major, Minor} = Version) when Major >= 3 andalso Minor >= 3-> -+ select_hashsign(HashSigns, Cert, KeyExAlgo, tls_v1:default_signature_algs(Version), Version); -+select_hashsign(#hash_sign_algos{hash_sign_algos = HashSigns}, Cert, KeyExAlgo, SupportedHashSigns, -+ {Major, Minor}) when Major >= 3 andalso Minor >= 3 -> -+ #'OTPCertificate'{tbsCertificate = TBSCert} = public_key:pkix_decode_cert(Cert, otp), - #'OTPSubjectPublicKeyInfo'{algorithm = {_,Algo, _}} = TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo, -- DefaultHashSign = {_, Sign} = select_hashsign_algs(undefined, Algo, Version), -- case lists:filter(fun({sha, dsa}) -> -+ Sign = cert_sign(Algo), -+ case lists:filter(fun({sha, dsa = S}) when S == Sign -> - true; - ({_, dsa}) -> - false; -- ({Hash, S}) when S == Sign -> -- ssl_cipher:is_acceptable_hash(Hash, -- proplists:get_value(hashs, crypto:supports())); -+ ({_, _} = Algos) -> -+ is_acceptable_hash_sign(Algos, Sign, KeyExAlgo, SupportedHashSigns); - (_) -> - false - end, HashSigns) of - [] -> -- DefaultHashSign; -- [HashSign| _] -> -+ ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY); -+ [HashSign | _] -> - HashSign - end; --select_hashsign(_, Cert, Version) -> -+select_hashsign(_, Cert, _, _, Version) -> - #'OTPCertificate'{tbsCertificate = TBSCert} = public_key:pkix_decode_cert(Cert, otp), - #'OTPSubjectPublicKeyInfo'{algorithm = {_,Algo, _}} = TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo, - select_hashsign_algs(undefined, Algo, Version). - - %%-------------------------------------------------------------------- ---spec select_hashsign_algs(#hash_sign_algos{}| undefined, oid(), ssl_record:ssl_version()) -> -+-spec select_hashsign_algs({atom(), atom()}| undefined, oid(), ssl_record:ssl_version()) -> - {atom(), atom()}. - - %% Description: For TLS 1.2 hash function and signature algorithm pairs can be -@@ -642,24 +650,6 @@ select_hashsign_algs(undefined, ?rsaEncryption, _) -> - select_hashsign_algs(undefined, ?'id-dsa', _) -> - {sha, dsa}. - ---spec select_hashsign_algs(atom(), ssl_record:ssl_version()) -> {atom(), atom()}. --%% Wrap function to keep the knowledge of the default values in --%% one place only --select_hashsign_algs(Alg, Version) when (Alg == rsa orelse -- Alg == dhe_rsa orelse -- Alg == dh_rsa orelse -- Alg == ecdhe_rsa orelse -- Alg == ecdh_rsa orelse -- Alg == srp_rsa) -> -- select_hashsign_algs(undefined, ?rsaEncryption, Version); --select_hashsign_algs(Alg, Version) when (Alg == dhe_dss orelse -- Alg == dh_dss orelse -- Alg == srp_dss) -> -- select_hashsign_algs(undefined, ?'id-dsa', Version); --select_hashsign_algs(Alg, Version) when (Alg == ecdhe_ecdsa orelse -- Alg == ecdh_ecdsa) -> -- select_hashsign_algs(undefined, ?'id-ecPublicKey', Version). -- - %%-------------------------------------------------------------------- - -spec master_secret(atom(), ssl_record:ssl_version(), #session{} | binary(), #connection_states{}, - client | server) -> {binary(), #connection_states{}} | #alert{}. -@@ -1063,9 +1053,56 @@ available_suites(UserSuites, Version) -> - lists:member(Suite, ssl_cipher:all_suites(Version)) - end, UserSuites). - --available_suites(ServerCert, UserSuites, Version, Curve) -> -+available_suites(ServerCert, UserSuites, Version, undefined, Curve) -> - ssl_cipher:filter(ServerCert, available_suites(UserSuites, Version)) -- -- unavailable_ecc_suites(Curve). -+ -- unavailable_ecc_suites(Curve); -+available_suites(ServerCert, UserSuites, Version, HashSigns, Curve) -> -+ Suites = available_suites(ServerCert, UserSuites, Version, undefined, Curve), -+ filter_hashsigns(Suites, [ssl_cipher:suite_definition(Suite) || Suite <- Suites], HashSigns, []). -+filter_hashsigns([], [], _, Acc) -> -+ lists:reverse(Acc); -+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, -+ Acc) when KeyExchange == dhe_ecdsa; -+ KeyExchange == ecdhe_ecdsa -> -+ do_filter_hashsigns(ecdsa, Suite, Suites, Algos, HashSigns, Acc); -+ -+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, -+ Acc) when KeyExchange == rsa; -+ KeyExchange == dhe_rsa; -+ KeyExchange == ecdhe_rsa; -+ KeyExchange == srp_rsa; -+ KeyExchange == rsa_psk -> -+ do_filter_hashsigns(rsa, Suite, Suites, Algos, HashSigns, Acc); -+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, Acc) when -+ KeyExchange == dhe_dss; -+ KeyExchange == srp_dss -> -+ do_filter_hashsigns(dsa, Suite, Suites, Algos, HashSigns, Acc); -+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, Acc) when -+ KeyExchange == dh_dss; -+ KeyExchange == dh_rsa; -+ KeyExchange == dh_ecdsa; -+ KeyExchange == ecdh_rsa; -+ KeyExchange == ecdh_ecdsa -> -+ %% Fixed DH certificates MAY be signed with any hash/signature -+ %% algorithm pair appearing in the hash_sign extension. The names -+ %% DH_DSS, DH_RSA, ECDH_ECDSA, and ECDH_RSA are historical. -+ filter_hashsigns(Suites, Algos, HashSigns, [Suite| Acc]); -+filter_hashsigns([Suite | Suites], [{KeyExchange,_,_,_} | Algos], HashSigns, Acc) when -+ KeyExchange == dh_anon; -+ KeyExchange == ecdh_anon; -+ KeyExchange == srp_anon; -+ KeyExchange == psk; -+ KeyExchange == dhe_psk -> -+ %% In this case hashsigns is not used as the kexchange is anonaymous -+ filter_hashsigns(Suites, Algos, HashSigns, [Suite| Acc]). -+ -+do_filter_hashsigns(SignAlgo, Suite, Suites, Algos, HashSigns, Acc) -> -+ case lists:keymember(SignAlgo, 2, HashSigns) of -+ true -> -+ filter_hashsigns(Suites, Algos, HashSigns, [Suite| Acc]); -+ false -> -+ filter_hashsigns(Suites, Algos, HashSigns, Acc) -+ end. - - unavailable_ecc_suites(no_curve) -> - ssl_cipher:ec_keyed_suites(); -@@ -1077,17 +1114,17 @@ cipher_suites(Suites, false) -> - cipher_suites(Suites, true) -> - Suites. - --select_session(SuggestedSessionId, CipherSuites, Compressions, Port, #session{ecc = ECCCurve} = -+select_session(SuggestedSessionId, CipherSuites, HashSigns, Compressions, Port, #session{ecc = ECCCurve} = - Session, Version, -- #ssl_options{ciphers = UserSuites, honor_cipher_order = HCO} = SslOpts, -+ #ssl_options{ciphers = UserSuites, honor_cipher_order = HonorCipherOrder} = SslOpts, - Cache, CacheCb, Cert) -> - {SessionId, Resumed} = ssl_session:server_id(Port, SuggestedSessionId, - SslOpts, Cert, - Cache, CacheCb), - case Resumed of - undefined -> -- Suites = available_suites(Cert, UserSuites, Version, ECCCurve), -- CipherSuite = select_cipher_suite(CipherSuites, Suites, HCO), -+ Suites = available_suites(Cert, UserSuites, Version, HashSigns, ECCCurve), -+ CipherSuite = select_cipher_suite(CipherSuites, Suites, HonorCipherOrder), - Compression = select_compression(Compressions), - {new, Session#session{session_id = SessionId, - cipher_suite = CipherSuite, -@@ -1155,7 +1192,7 @@ handle_client_hello_extensions(RecordCB, Random, ClientCipherSuites, - #hello_extensions{renegotiation_info = Info, - srp = SRP, - ec_point_formats = ECCFormat, -- alpn = ALPN, -+ alpn = ALPN, - next_protocol_negotiation = NextProtocolNegotiation}, Version, - #ssl_options{secure_renegotiate = SecureRenegotation, - alpn_preferred_protocols = ALPNPreferredProtocols} = Opts, -@@ -1324,7 +1361,7 @@ handle_renegotiation_info(_RecordCB, ConnectionStates, SecureRenegotation) -> - - hello_extensions_list(#hello_extensions{renegotiation_info = RenegotiationInfo, - srp = SRP, -- hash_signs = HashSigns, -+ signature_algs = HashSigns, - ec_point_formats = EcPointFormats, - elliptic_curves = EllipticCurves, - alpn = ALPN, -@@ -1799,7 +1836,7 @@ dec_hello_extensions(<> = ExtData, - HashSignAlgos = [{ssl_cipher:hash_algorithm(Hash), ssl_cipher:sign_algorithm(Sign)} || - <> <= SignAlgoList], -- dec_hello_extensions(Rest, Acc#hello_extensions{hash_signs = -+ dec_hello_extensions(Rest, Acc#hello_extensions{signature_algs = - #hash_sign_algos{hash_sign_algos = HashSignAlgos}}); - - dec_hello_extensions(<>, Acc) -> - key_exchange_alg(rsa) -> - ?KEY_EXCHANGE_RSA; - key_exchange_alg(Alg) when Alg == dhe_rsa; Alg == dhe_dss; -- Alg == dh_dss; Alg == dh_rsa; Alg == dh_anon -> -+ Alg == dh_dss; Alg == dh_rsa; Alg == dh_anon -> - ?KEY_EXCHANGE_DIFFIE_HELLMAN; - key_exchange_alg(Alg) when Alg == ecdhe_rsa; Alg == ecdh_rsa; - Alg == ecdhe_ecdsa; Alg == ecdh_ecdsa; -@@ -2008,27 +2045,16 @@ is_member(Suite, SupportedSuites) -> - select_compression(_CompressionMetodes) -> - ?NULL. - ---define(TLSEXT_SIGALG_RSA(MD), {MD, rsa}). ---define(TLSEXT_SIGALG_DSA(MD), {MD, dsa}). ---define(TLSEXT_SIGALG_ECDSA(MD), {MD, ecdsa}). -- ---define(TLSEXT_SIGALG(MD), ?TLSEXT_SIGALG_ECDSA(MD), ?TLSEXT_SIGALG_RSA(MD)). -- --advertised_hash_signs({Major, Minor}) when Major >= 3 andalso Minor >= 3 -> -- HashSigns = [?TLSEXT_SIGALG(sha512), -- ?TLSEXT_SIGALG(sha384), -- ?TLSEXT_SIGALG(sha256), -- ?TLSEXT_SIGALG(sha224), -- ?TLSEXT_SIGALG(sha), -- ?TLSEXT_SIGALG_DSA(sha), -- ?TLSEXT_SIGALG_RSA(md5)], -- CryptoSupport = crypto:supports(), -- HasECC = proplists:get_bool(ecdsa, proplists:get_value(public_keys, CryptoSupport)), -- Hashs = proplists:get_value(hashs, CryptoSupport), -- #hash_sign_algos{hash_sign_algos = -- lists:filter(fun({Hash, ecdsa}) -> HasECC andalso proplists:get_bool(Hash, Hashs); -- ({Hash, _}) -> proplists:get_bool(Hash, Hashs) end, HashSigns)}; --advertised_hash_signs(_) -> -+available_signature_algs(undefined, _, _) -> -+ undefined; -+available_signature_algs(SupportedHashSigns, {Major, Minor}, AllVersions) when Major >= 3 andalso Minor >= 3 -> -+ case tls_record:lowest_protocol_version(AllVersions) of -+ {3, 3} -> -+ #hash_sign_algos{hash_sign_algos = SupportedHashSigns}; -+ _ -> -+ undefined -+ end; -+available_signature_algs(_, _, _) -> - undefined. - - psk_secret(PSKIdentity, PSKLookup) -> -@@ -2123,3 +2149,25 @@ distpoints_lookup([DistPoint | Rest], Callback, CRLDbHandle) -> - CRLs -> - [{DistPoint, {CRL, public_key:der_decode('CertificateList', CRL)}} || CRL <- CRLs] - end. -+ -+cert_sign(?rsaEncryption) -> -+ rsa; -+cert_sign(?'id-ecPublicKey') -> -+ ecdsa; -+cert_sign(?'id-dsa') -> -+ dsa; -+cert_sign(Alg) -> -+ {_, Sign} =public_key:pkix_sign_types(Alg), -+ Sign. -+ -+is_acceptable_hash_sign({_, Sign} = Algos, Sign, _, SupportedHashSigns) -> -+ is_acceptable_hash_sign(Algos, SupportedHashSigns); -+is_acceptable_hash_sign(Algos,_, KeyExAlgo, SupportedHashSigns) when KeyExAlgo == dh_ecdsa; -+ KeyExAlgo == ecdh_rsa; -+ KeyExAlgo == ecdh_ecdsa -> -+ is_acceptable_hash_sign(Algos, SupportedHashSigns); -+is_acceptable_hash_sign(_,_,_,_) -> -+ false. -+is_acceptable_hash_sign(Algos, SupportedHashSigns) -> -+ lists:member(Algos, SupportedHashSigns). -+ ---- a/lib/ssl/src/ssl_handshake.hrl -+++ b/lib/ssl/src/ssl_handshake.hrl -@@ -95,7 +95,7 @@ - - -record(hello_extensions, { - renegotiation_info, -- hash_signs, % supported combinations of hashes/signature algos -+ signature_algs, % supported combinations of hashes/signature algos - alpn, - next_protocol_negotiation = undefined, % [binary()] - srp, ---- a/lib/ssl/src/ssl_internal.hrl -+++ b/lib/ssl/src/ssl_internal.hrl -@@ -135,7 +135,8 @@ - padding_check = true :: boolean(), - fallback = false :: boolean(), - crl_check :: boolean() | peer | best_effort, -- crl_cache -+ crl_cache, -+ signature_algs - }). - - -record(socket_options, ---- a/lib/ssl/src/tls_connection.erl -+++ b/lib/ssl/src/tls_connection.erl -@@ -182,8 +182,7 @@ hello(start, #state{host = Host, port = Port, role = client, - next_state(hello, hello, Record, State); - - hello(Hello = #client_hello{client_version = ClientVersion, -- extensions = #hello_extensions{hash_signs = HashSigns, -- ec_point_formats = EcPointFormats, -+ extensions = #hello_extensions{ec_point_formats = EcPointFormats, - elliptic_curves = EllipticCurves}}, - State = #state{connection_states = ConnectionStates0, - port = Port, session = #session{own_certificate = Cert} = Session0, -@@ -191,27 +190,28 @@ hello(Hello = #client_hello{client_version = ClientVersion, - session_cache = Cache, - session_cache_cb = CacheCb, - negotiated_protocol = CurrentProtocol, -+ key_algorithm = KeyExAlg, - ssl_options = SslOpts}) -> -+ - case tls_handshake:hello(Hello, SslOpts, {Port, Session0, Cache, CacheCb, -- ConnectionStates0, Cert}, Renegotiation) of -+ ConnectionStates0, Cert, KeyExAlg}, Renegotiation) of - #alert{} = Alert -> - handle_own_alert(Alert, ClientVersion, hello, State); - {Version, {Type, Session}, -- ConnectionStates, Protocol0, ServerHelloExt} -> -- -+ ConnectionStates, Protocol0, ServerHelloExt, HashSign} -> - Protocol = case Protocol0 of -- undefined -> CurrentProtocol; -- _ -> Protocol0 -- end, -- -- HashSign = ssl_handshake:select_hashsign(HashSigns, Cert, Version), -- ssl_connection:hello({common_client_hello, Type, ServerHelloExt, HashSign}, -+ undefined -> CurrentProtocol; -+ _ -> Protocol0 -+ end, -+ ssl_connection:hello({common_client_hello, Type, ServerHelloExt}, - State#state{connection_states = ConnectionStates, - negotiated_version = Version, -+ hashsign_algorithm = HashSign, - session = Session, - client_ecc = {EllipticCurves, EcPointFormats}, - negotiated_protocol = Protocol}, ?MODULE) - end; -+ - hello(Hello = #server_hello{}, - #state{connection_states = ConnectionStates0, - negotiated_version = ReqVersion, -@@ -1069,3 +1069,4 @@ handle_sni_extension(#client_hello{extensions = HelloExtensions}, State0) -> - end; - handle_sni_extension(_, State0) -> - State0. -+ ---- a/lib/ssl/src/tls_handshake.erl -+++ b/lib/ssl/src/tls_handshake.erl -@@ -56,7 +56,7 @@ client_hello(Host, Port, ConnectionStates, - Version = tls_record:highest_protocol_version(Versions), - Pending = ssl_record:pending_connection_state(ConnectionStates, read), - SecParams = Pending#connection_state.security_parameters, -- AvailableCipherSuites = ssl_handshake:available_suites(UserSuites, Version), -+ AvailableCipherSuites = ssl_handshake:available_suites(UserSuites, Version), - Extensions = ssl_handshake:client_hello_extensions(Host, Version, - AvailableCipherSuites, - SslOpts, ConnectionStates, Renegotiation), -@@ -80,13 +80,13 @@ client_hello(Host, Port, ConnectionStates, - -spec hello(#server_hello{} | #client_hello{}, #ssl_options{}, - #connection_states{} | {inet:port_number(), #session{}, db_handle(), - atom(), #connection_states{}, -- binary() | undefined}, -+ binary() | undefined, ssl_cipher:key_algo()}, - boolean()) -> - {tls_record:tls_version(), session_id(), - #connection_states{}, alpn | npn, binary() | undefined}| - {tls_record:tls_version(), {resumed | new, #session{}}, - #connection_states{}, binary() | undefined, -- #hello_extensions{}} | -+ #hello_extensions{}, {ssl_cipher:hash(), ssl_cipher:sign_algo()} | undefined} | - #alert{}. - %% - %% Description: Handles a recieved hello message -@@ -149,26 +149,35 @@ get_tls_handshake(Version, Data, Buffer) -> - %%% Internal functions - %%-------------------------------------------------------------------- - handle_client_hello(Version, #client_hello{session_id = SugesstedId, -- cipher_suites = CipherSuites, -- compression_methods = Compressions, -- random = Random, -- extensions = #hello_extensions{elliptic_curves = Curves} = HelloExt}, -- #ssl_options{versions = Versions} = SslOpts, -- {Port, Session0, Cache, CacheCb, ConnectionStates0, Cert}, Renegotiation) -> -+ cipher_suites = CipherSuites, -+ compression_methods = Compressions, -+ random = Random, -+ extensions = #hello_extensions{elliptic_curves = Curves, -+ signature_algs = ClientHashSigns} = HelloExt}, -+ #ssl_options{versions = Versions, -+ signature_algs = SupportedHashSigns} = SslOpts, -+ {Port, Session0, Cache, CacheCb, ConnectionStates0, Cert, _}, Renegotiation) -> - case tls_record:is_acceptable_version(Version, Versions) of - true -> -+ AvailableHashSigns = available_signature_algs(ClientHashSigns, SupportedHashSigns, Cert, Version), - ECCCurve = ssl_handshake:select_curve(Curves, ssl_handshake:supported_ecc(Version)), - {Type, #session{cipher_suite = CipherSuite} = Session1} -- = ssl_handshake:select_session(SugesstedId, CipherSuites, Compressions, -+ = ssl_handshake:select_session(SugesstedId, CipherSuites, AvailableHashSigns, Compressions, - Port, Session0#session{ecc = ECCCurve}, Version, - SslOpts, Cache, CacheCb, Cert), - case CipherSuite of - no_suite -> - ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY); - _ -> -- handle_client_hello_extensions(Version, Type, Random, CipherSuites, HelloExt, -- SslOpts, Session1, ConnectionStates0, -- Renegotiation) -+ {KeyExAlg,_,_,_} = ssl_cipher:suite_definition(CipherSuite), -+ case ssl_handshake:select_hashsign(ClientHashSigns, Cert, KeyExAlg, SupportedHashSigns, Version) of -+ #alert{} = Alert -> -+ Alert; -+ HashSign -> -+ handle_client_hello_extensions(Version, Type, Random, CipherSuites, HelloExt, -+ SslOpts, Session1, ConnectionStates0, -+ Renegotiation, HashSign) -+ end - end; - false -> - ?ALERT_REC(?FATAL, ?PROTOCOL_VERSION) -@@ -245,14 +254,14 @@ enc_handshake(HandshakeMsg, Version) -> - - - handle_client_hello_extensions(Version, Type, Random, CipherSuites, -- HelloExt, SslOpts, Session0, ConnectionStates0, Renegotiation) -> -+ HelloExt, SslOpts, Session0, ConnectionStates0, Renegotiation, HashSign) -> - try ssl_handshake:handle_client_hello_extensions(tls_record, Random, CipherSuites, - HelloExt, Version, SslOpts, - Session0, ConnectionStates0, Renegotiation) of - #alert{} = Alert -> - Alert; - {Session, ConnectionStates, Protocol, ServerHelloExt} -> -- {Version, {Type, Session}, ConnectionStates, Protocol, ServerHelloExt} -+ {Version, {Type, Session}, ConnectionStates, Protocol, ServerHelloExt, HashSign} - catch throw:Alert -> - Alert - end. -@@ -269,3 +278,12 @@ handle_server_hello_extensions(Version, SessionId, Random, CipherSuite, - {Version, SessionId, ConnectionStates, ProtoExt, Protocol} - end. - -+available_signature_algs(undefined, SupportedHashSigns, _, {Major, Minor}) when (Major < 3) andalso (Minor < 3) -> -+ SupportedHashSigns; -+available_signature_algs(#hash_sign_algos{hash_sign_algos = ClientHashSigns}, SupportedHashSigns, -+ _, {Major, Minor}) when (Major < 3) andalso (Minor < 3) -> -+ ordsets:intersection(ClientHashSigns, SupportedHashSigns); -+available_signature_algs(_, _, _, _) -> -+ undefined. -+ -+ ---- a/lib/ssl/src/tls_v1.erl -+++ b/lib/ssl/src/tls_v1.erl -@@ -31,7 +31,8 @@ - - -export([master_secret/4, finished/5, certificate_verify/3, mac_hash/7, - setup_keys/8, suites/1, prf/5, -- ecc_curves/1, oid_to_enum/1, enum_to_oid/1]). -+ ecc_curves/1, oid_to_enum/1, enum_to_oid/1, -+ default_signature_algs/1, signature_algs/2]). - - %%==================================================================== - %% Internal application API -@@ -258,6 +259,54 @@ suites(3) -> - ] ++ suites(2). - - -+ -+signature_algs({3, 3}, HashSigns) -> -+ CryptoSupports = crypto:supports(), -+ Hashes = proplists:get_value(hashs, CryptoSupports), -+ PubKeys = proplists:get_value(public_keys, CryptoSupports), -+ Supported = lists:foldl(fun({Hash, dsa = Sign} = Alg, Acc) -> -+ case proplists:get_bool(dss, PubKeys) -+ andalso proplists:get_bool(Hash, Hashes) -+ andalso is_pair(Hash, Sign, Hashes) -+ of -+ true -> -+ [Alg | Acc]; -+ false -> -+ Acc -+ end; -+ ({Hash, Sign} = Alg, Acc) -> -+ case proplists:get_bool(Sign, PubKeys) -+ andalso proplists:get_bool(Hash, Hashes) -+ andalso is_pair(Hash, Sign, Hashes) -+ of -+ true -> -+ [Alg | Acc]; -+ false -> -+ Acc -+ end -+ end, [], HashSigns), -+ lists:reverse(Supported). -+ -+default_signature_algs({3, 3} = Version) -> -+ Default = [%% SHA2 -+ {sha512, ecdsa}, -+ {sha512, rsa}, -+ {sha384, ecdsa}, -+ {sha384, rsa}, -+ {sha256, ecdsa}, -+ {sha256, rsa}, -+ {sha224, ecdsa}, -+ {sha224, rsa}, -+ %% SHA -+ {sha, ecdsa}, -+ {sha, rsa}, -+ {sha, dsa}, -+ %% MD5 -+ {md5, rsa}], -+ signature_algs(Version, Default); -+default_signature_algs(_) -> -+ undefined. -+ - %%-------------------------------------------------------------------- - %%% Internal functions - %%-------------------------------------------------------------------- -@@ -342,6 +391,17 @@ finished_label(client) -> - finished_label(server) -> - <<"server finished">>. - -+is_pair(sha, dsa, _) -> -+ true; -+is_pair(_, dsa, _) -> -+ false; -+is_pair(Hash, ecdsa, Hashs) -> -+ AtLeastSha = Hashs -- [md2,md4,md5], -+ lists:member(Hash, AtLeastSha); -+is_pair(Hash, rsa, Hashs) -> -+ AtLeastMd5 = Hashs -- [md2,md4], -+ lists:member(Hash, AtLeastMd5). -+ - %% list ECC curves in prefered order - ecc_curves(_Minor) -> - TLSCurves = [sect571r1,sect571k1,secp521r1,brainpoolP512r1, ---- a/lib/ssl/test/ssl_basic_SUITE.erl -+++ b/lib/ssl/test/ssl_basic_SUITE.erl -@@ -58,7 +58,7 @@ all() -> - groups() -> - [{basic, [], basic_tests()}, - {options, [], options_tests()}, -- {'tlsv1.2', [], all_versions_groups()}, -+ {'tlsv1.2', [], all_versions_groups() ++ [conf_signature_algs, no_common_signature_algs]}, - {'tlsv1.1', [], all_versions_groups()}, - {'tlsv1', [], all_versions_groups() ++ rizzo_tests()}, - {'sslv3', [], all_versions_groups() ++ rizzo_tests() ++ [ciphersuite_vs_version]}, -@@ -168,6 +168,7 @@ renegotiate_tests() -> - - cipher_tests() -> - [cipher_suites, -+ cipher_suites_mix, - ciphers_rsa_signed_certs, - ciphers_rsa_signed_certs_openssl_names, - ciphers_dsa_signed_certs, -@@ -445,7 +446,7 @@ connection_info(Config) when is_list(Config) -> - {from, self()}, - {mfa, {?MODULE, connection_info_result, []}}, - {options, -- [{ciphers,[{rsa,des_cbc,sha,no_export}]} | -+ [{ciphers,[{rsa,des_cbc,sha}]} | - ClientOpts]}]), - - ct:log("Testcase ~p, Client ~p Server ~p ~n", -@@ -911,6 +912,31 @@ cipher_suites(Config) when is_list(Config) -> - [_|_] =ssl:cipher_suites(openssl). - - %%-------------------------------------------------------------------- -+cipher_suites_mix() -> -+ [{doc,"Test to have old and new cipher suites at the same time"}]. -+ -+cipher_suites_mix(Config) when is_list(Config) -> -+ CipherSuites = [{ecdh_rsa,aes_128_cbc,sha256,sha256}, {rsa,aes_128_cbc,sha}], -+ ClientOpts = ?config(client_opts, Config), -+ ServerOpts = ?config(server_opts, Config), -+ -+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), -+ -+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, -+ {from, self()}, -+ {mfa, {ssl_test_lib, send_recv_result_active, []}}, -+ {options, ServerOpts}]), -+ Port = ssl_test_lib:inet_port(Server), -+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, -+ {host, Hostname}, -+ {from, self()}, -+ {mfa, {ssl_test_lib, send_recv_result_active, []}}, -+ {options, [{ciphers, CipherSuites} | ClientOpts]}]), -+ -+ ssl_test_lib:check_result(Server, ok, Client, ok), -+ ssl_test_lib:close(Server), -+ ssl_test_lib:close(Client). -+%%-------------------------------------------------------------------- - socket_options() -> - [{doc,"Test API function getopts/2 and setopts/2"}]. - -@@ -2876,7 +2902,61 @@ ciphersuite_vs_version(Config) when is_list(Config) -> - _ -> - ct:fail({unexpected_server_hello, ServerHello}) - end. -- -+ -+%%-------------------------------------------------------------------- -+conf_signature_algs() -> -+ [{doc,"Test to set the signature_algs option on both client and server"}]. -+conf_signature_algs(Config) when is_list(Config) -> -+ ClientOpts = ?config(client_opts, Config), -+ ServerOpts = ?config(server_opts, Config), -+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), -+ Server = -+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, -+ {from, self()}, -+ {mfa, {ssl_test_lib, send_recv_result, []}}, -+ {options, [{active, false}, {signature_algs, [{sha256, rsa}]} | ServerOpts]}]), -+ Port = ssl_test_lib:inet_port(Server), -+ Client = -+ ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, -+ {host, Hostname}, -+ {from, self()}, -+ {mfa, {ssl_test_lib, send_recv_result, []}}, -+ {options, [{active, false}, {signature_algs, [{sha256, rsa}]} | ClientOpts]}]), -+ -+ ct:log("Testcase ~p, Client ~p Server ~p ~n", -+ [self(), Client, Server]), -+ -+ ssl_test_lib:check_result(Server, ok, Client, ok), -+ -+ ssl_test_lib:close(Server), -+ ssl_test_lib:close(Client). -+ -+ -+%%-------------------------------------------------------------------- -+no_common_signature_algs() -> -+ [{doc,"Set the signature_algs option so that there client and server does not share any hash sign algorithms"}]. -+no_common_signature_algs(Config) when is_list(Config) -> -+ -+ ClientOpts = ?config(client_opts, Config), -+ ServerOpts = ?config(server_opts, Config), -+ -+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), -+ -+ -+ Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0}, -+ {from, self()}, -+ {options, [{signature_algs, [{sha256, rsa}]} -+ | ServerOpts]}]), -+ Port = ssl_test_lib:inet_port(Server), -+ Client = ssl_test_lib:start_client_error([{node, ClientNode}, {port, Port}, -+ {host, Hostname}, -+ {from, self()}, -+ {options, [{signature_algs, [{sha384, rsa}]} -+ | ClientOpts]}]), -+ -+ ssl_test_lib:check_result(Server, {error, {tls_alert, "insufficient security"}}, -+ Client, {error, {tls_alert, "insufficient security"}}). -+ - %%-------------------------------------------------------------------- - - dont_crash_on_handshake_garbage() -> ---- a/lib/ssl/test/ssl_handshake_SUITE.erl -+++ b/lib/ssl/test/ssl_handshake_SUITE.erl -@@ -166,10 +166,10 @@ ignore_hassign_extension_pre_tls_1_2(Config) -> - CertFile = proplists:get_value(certfile, Opts), - [{_, Cert, _}] = ssl_test_lib:pem_to_der(CertFile), - HashSigns = #hash_sign_algos{hash_sign_algos = [{sha512, rsa}, {sha, dsa}]}, -- {sha512, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, {3,3}), -+ {sha512, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,3}), {3,3}), - %%% Ignore -- {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, {3,2}), -- {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, {3,0}). -+ {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,2}), {3,2}), -+ {md5sha, rsa} = ssl_handshake:select_hashsign(HashSigns, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,0}), {3,0}). - - is_supported(Hash) -> - Algos = crypto:supports(), ---- a/lib/ssl/test/ssl_test_lib.erl -+++ b/lib/ssl/test/ssl_test_lib.erl -@@ -905,8 +905,8 @@ anonymous_suites() -> - {dh_anon, '3des_ede_cbc', sha}, - {dh_anon, aes_128_cbc, sha}, - {dh_anon, aes_256_cbc, sha}, -- {dh_anon, aes_128_gcm, null}, -- {dh_anon, aes_256_gcm, null}, -+ {dh_anon, aes_128_gcm, null, sha256}, -+ {dh_anon, aes_256_gcm, null, sha384}, - {ecdh_anon,rc4_128,sha}, - {ecdh_anon,'3des_ede_cbc',sha}, - {ecdh_anon,aes_128_cbc,sha}, -@@ -933,12 +933,12 @@ psk_suites() -> - {rsa_psk, aes_256_cbc, sha}, - {rsa_psk, aes_128_cbc, sha256}, - {rsa_psk, aes_256_cbc, sha384}, -- {psk, aes_128_gcm, null}, -- {psk, aes_256_gcm, null}, -- {dhe_psk, aes_128_gcm, null}, -- {dhe_psk, aes_256_gcm, null}, -- {rsa_psk, aes_128_gcm, null}, -- {rsa_psk, aes_256_gcm, null}], -+ {psk, aes_128_gcm, null, sha256}, -+ {psk, aes_256_gcm, null, sha384}, -+ {dhe_psk, aes_128_gcm, null, sha256}, -+ {dhe_psk, aes_256_gcm, null, sha384}, -+ {rsa_psk, aes_128_gcm, null, sha256}, -+ {rsa_psk, aes_256_gcm, null, sha384}], - ssl_cipher:filter_suites(Suites). - - psk_anon_suites() -> ---- a/lib/ssl/vsn.mk -+++ b/lib/ssl/vsn.mk -@@ -1 +1 @@ --SSL_VSN = 7.3 -+SSL_VSN = 7.3.1 ---- a/otp_versions.table -+++ b/otp_versions.table -@@ -1,3 +1,5 @@ -+OTP-18.3.2 : inets-6.2.2 ssl-7.3.1 # asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 : -+OTP-18.3.1 : erts-7.3.1 inets-6.2.1 mnesia-4.13.4 # asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 ssl-7.3 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 : - OTP-18.3 : asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosNotification-1.2.1 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3 eunit-2.2.13 hipe-3.15 inets-6.2 kernel-4.2 mnesia-4.13.3 observer-2.1.2 orber-3.8.1 public_key-1.1.1 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 ssl-7.3 stdlib-2.8 test_server-3.10 tools-2.8.3 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 # cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosProperty-1.2 et-1.5.1 gs-1.6 ic-4.4 jinterface-1.6.1 megaco-3.18 odbc-2.11.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 reltool-0.7 syntax_tools-1.7 typer-0.9.10 : - OTP-18.2.4 : common_test-1.11.2 # asn1-4.0.1 compiler-6.0.2 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6.2 debugger-4.1.1 dialyzer-2.8.2 diameter-1.11.1 edoc-0.7.17 eldap-1.2 erl_docgen-0.4.1 erl_interface-3.8.1 erts-7.2.1 et-1.5.1 eunit-2.2.12 gs-1.6 hipe-3.14 ic-4.4 inets-6.1.1 jinterface-1.6.1 kernel-4.1.1 megaco-3.18 mnesia-4.13.2 observer-2.1.1 odbc-2.11.1 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1 reltool-0.7 runtime_tools-1.9.2 sasl-2.6.1 snmp-5.2.1 ssh-4.2.1 ssl-7.2 stdlib-2.7 syntax_tools-1.7 test_server-3.9.1 tools-2.8.2 typer-0.9.10 webtool-0.9 wx-1.6 xmerl-1.3.9 : - OTP-18.2.3 : inets-6.1.1 # asn1-4.0.1 common_test-1.11.1 compiler-6.0.2 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6.2 debugger-4.1.1 dialyzer-2.8.2 diameter-1.11.1 edoc-0.7.17 eldap-1.2 erl_docgen-0.4.1 erl_interface-3.8.1 erts-7.2.1 et-1.5.1 eunit-2.2.12 gs-1.6 hipe-3.14 ic-4.4 jinterface-1.6.1 kernel-4.1.1 megaco-3.18 mnesia-4.13.2 observer-2.1.1 odbc-2.11.1 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1 reltool-0.7 runtime_tools-1.9.2 sasl-2.6.1 snmp-5.2.1 ssh-4.2.1 ssl-7.2 stdlib-2.7 syntax_tools-1.7 test_server-3.9.1 tools-2.8.2 typer-0.9.10 webtool-0.9 wx-1.6 xmerl-1.3.9 : -@@ -14,6 +16,7 @@ OTP-18.0.3 : erts-7.0.3 # asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 co - OTP-18.0.2 : erts-7.0.2 runtime_tools-1.9.1 # asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6 debugger-4.1 dialyzer-2.8 diameter-1.10 edoc-0.7.17 eldap-1.2 erl_docgen-0.4 erl_interface-3.8 et-1.5.1 eunit-2.2.10 gs-1.6 hipe-3.12 ic-4.4 inets-6.0 jinterface-1.6 kernel-4.0 megaco-3.18 mnesia-4.13 observer-2.1 odbc-2.11 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1 percept-0.8.11 public_key-1.0 reltool-0.7 sasl-2.5 snmp-5.2 ssh-4.0 ssl-7.0 stdlib-2.5 syntax_tools-1.7 test_server-3.9 tools-2.8 typer-0.9.9 webtool-0.9 wx-1.4 xmerl-1.3.8 : - OTP-18.0.1 : erts-7.0.1 # asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6 debugger-4.1 dialyzer-2.8 diameter-1.10 edoc-0.7.17 eldap-1.2 erl_docgen-0.4 erl_interface-3.8 et-1.5.1 eunit-2.2.10 gs-1.6 hipe-3.12 ic-4.4 inets-6.0 jinterface-1.6 kernel-4.0 megaco-3.18 mnesia-4.13 observer-2.1 odbc-2.11 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1 percept-0.8.11 public_key-1.0 reltool-0.7 runtime_tools-1.9 sasl-2.5 snmp-5.2 ssh-4.0 ssl-7.0 stdlib-2.5 syntax_tools-1.7 test_server-3.9 tools-2.8 typer-0.9.9 webtool-0.9 wx-1.4 xmerl-1.3.8 : - OTP-18.0 : asn1-4.0 common_test-1.11 compiler-6.0 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2 cosProperty-1.2 cosTime-1.2 cosTransactions-1.3 crypto-3.6 debugger-4.1 dialyzer-2.8 diameter-1.10 edoc-0.7.17 eldap-1.2 erl_docgen-0.4 erl_interface-3.8 erts-7.0 et-1.5.1 eunit-2.2.10 gs-1.6 hipe-3.12 ic-4.4 inets-6.0 jinterface-1.6 kernel-4.0 megaco-3.18 mnesia-4.13 observer-2.1 odbc-2.11 orber-3.8 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1 percept-0.8.11 public_key-1.0 reltool-0.7 runtime_tools-1.9 sasl-2.5 snmp-5.2 ssh-4.0 ssl-7.0 stdlib-2.5 syntax_tools-1.7 test_server-3.9 tools-2.8 typer-0.9.9 webtool-0.9 wx-1.4 xmerl-1.3.8 # : -+OTP-17.5.6.9 : diameter-1.9.2.4 erts-6.4.1.6 ssl-6.0.1.2 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 : - OTP-17.5.6.8 : diameter-1.9.2.3 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 erts-6.4.1.5 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 ssl-6.0.1.1 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 : - OTP-17.5.6.7 : diameter-1.9.2.2 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 erts-6.4.1.5 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 ssl-6.0.1.1 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 : - OTP-17.5.6.6 : erts-6.4.1.5 # asn1-3.0.4 common_test-1.10.1 compiler-5.0.4 cosEvent-2.1.15 cosEventDomain-1.1.14 cosFileTransfer-1.1.16 cosNotification-1.1.21 cosProperty-1.1.17 cosTime-1.1.14 cosTransactions-1.2.14 crypto-3.5 debugger-4.0.3.1 dialyzer-2.7.4 diameter-1.9.2.1 edoc-0.7.16 eldap-1.1.1 erl_docgen-0.3.7 erl_interface-3.7.20 et-1.5 eunit-2.2.9 gs-1.5.16 hipe-3.11.3 ic-4.3.6 inets-5.10.9 jinterface-1.5.12 kernel-3.2.0.1 megaco-3.17.3 mnesia-4.12.5 observer-2.0.4 odbc-2.10.22 orber-3.7.1 os_mon-2.3.1 ose-1.0.2 otp_mibs-1.0.10 parsetools-2.0.12 percept-0.8.10 public_key-0.23 reltool-0.6.6 runtime_tools-1.8.16.1 sasl-2.4.1 snmp-5.1.2 ssh-3.2.4 ssl-6.0.1.1 stdlib-2.4 syntax_tools-1.6.18 test_server-3.8.1 tools-2.7.2 typer-0.9.8 webtool-0.8.10 wx-1.3.3 xmerl-1.3.7 : diff --git a/community/erlang/APKBUILD b/community/erlang/APKBUILD index 34424f4d23..b968b9d2d1 100644 --- a/community/erlang/APKBUILD +++ b/community/erlang/APKBUILD @@ -2,8 +2,8 @@ # Maintainer: Marlus Saraiva pkgname=erlang -pkgver=18.3.2 -_srcver=18.3 +pkgver=19.0.1 +_srcver=19.0 pkgrel=0 pkgdesc="General-purpose programming language and runtime environment" url="http://www.erlang.org/" @@ -46,7 +46,6 @@ subpackages="$pkgname-dev $pkgname-odbc:odbc $pkgname-orber:orber $pkgname-os-mon:os_mon - $pkgname-ose:ose $pkgname-otp-mibs:otp_mibs $pkgname-parsetools:parsetools $pkgname-percept:percept @@ -59,23 +58,13 @@ subpackages="$pkgname-dev $pkgname-ssl:ssl $pkgname-stdlib:stdlib $pkgname-syntax-tools:syntax_tools - $pkgname-test-server:test_server $pkgname-tools:tools $pkgname-typer:typer - $pkgname-webtool:webtool $pkgname-xmerl:xmerl" -# Patches 0001-0007 found: http://pkgs.fedoraproject.org/gitweb/?p=erlang.git;a=tree source="http://www.erlang.org/download/otp_src_$_srcver.tar.gz - 0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch - 0002-Remove-rpath.patch - 0003-Do-not-install-C-sources.patch - 0004-Do-not-install-Java-sources.patch 0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch - 0006-Do-not-install-erlang-sources.patch - 0007-Split-off-webtool-dependency-from-tools.patch 0010-fix-nteventlog-remove.patch - 0060-set-disksup_posix_only-to-true.patch - 0070-otp-update-version-18.3.2.patch" + 0015-otp-update-version-19.0.1.patch" _builddir="$srcdir"/otp_src_$_srcver @@ -119,6 +108,7 @@ _mv_erlang_lib() { depends="$pkgname" mkdir -p "$subpkgdir"/usr/lib/erlang/lib + rm -f "$pkgdir"/usr/lib/erlang/lib/$lib-*/src/*.erl mv "$pkgdir"/usr/lib/erlang/lib/$lib-* "$subpkgdir"/usr/lib/erlang/lib/ } @@ -155,7 +145,6 @@ observer() { _mv_erlang_lib observer; } odbc() { _mv_erlang_lib odbc; } orber() { _mv_erlang_lib orber; } os_mon() { _mv_erlang_lib os_mon; } -ose() { _mv_erlang_lib ose; } otp_mibs() { _mv_erlang_lib otp_mibs; } parsetools() { _mv_erlang_lib parsetools; } percept() { _mv_erlang_lib percept; } @@ -168,10 +157,8 @@ ssh() { _mv_erlang_lib ssh; } ssl() { _mv_erlang_lib ssl; } stdlib() { _mv_erlang_lib stdlib; } syntax_tools() { _mv_erlang_lib syntax_tools; } -test_server() { _mv_erlang_lib test_server; } tools() { _mv_erlang_lib tools; } typer() { _mv_erlang_lib typer; } -webtool() { _mv_erlang_lib webtool; } xmerl() { _mv_erlang_lib xmerl; } dev() { @@ -209,36 +196,15 @@ dev() { } -md5sums="7e4ff32f97c36fb3dab736f8d481830b otp_src_18.3.tar.gz -11d2bfea3dd3138409337d62f2348ff2 0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch -ef4b726309a749010553259080960753 0002-Remove-rpath.patch -458118f96fb0c973a30630c070bd94aa 0003-Do-not-install-C-sources.patch -1c3b158ac8408fced9a0f3630f4498f1 0004-Do-not-install-Java-sources.patch +md5sums="f64eefc697d47193444aa224d971f367 otp_src_19.0.tar.gz f4aa0cc27dc57ea4dcd57191b1948a4d 0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch -a8e9e58c2444ac3994a6b418fd387369 0006-Do-not-install-erlang-sources.patch -b438c37818b5c82443682c3693dd7e53 0007-Split-off-webtool-dependency-from-tools.patch 0dd300003ff68fc46dc3c839c2541d53 0010-fix-nteventlog-remove.patch -d17fbaafa9f7820ade09b239c00aede6 0060-set-disksup_posix_only-to-true.patch -b0d5cf3bac335964a1c8ffd98d9f105d 0070-otp-update-version-18.3.2.patch" -sha256sums="fdab8129a1cb935db09f1832e3a7d511a4aeb2b9bb3602ca6a7ccb9730d5c9c3 otp_src_18.3.tar.gz -536e78192f915733cbbb264883af6d9b11c9e70c2c4d3d825b58c4dbec36db86 0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch -b2e5844215d7f5f5026a77342dd698d16103cc726d23f8265bcc8399d1a82bb9 0002-Remove-rpath.patch -81062f0eb9a72cbfac600fab56823161f92e1e5107b359f27f9f0ec511b8aec5 0003-Do-not-install-C-sources.patch -2ed61274decb534ab4142bd0a2116a75e3fe82d33a8ff145524173ce5773b0e2 0004-Do-not-install-Java-sources.patch +d706bb0d2b3fbd937c6a0e3e54a15dee 0015-otp-update-version-19.0.1.patch" +sha256sums="3fdc27a2a826e7f3d9cda43302d27d98704d6b41ce29a8a5df747a161da53bb1 otp_src_19.0.tar.gz 71c8a55fe036d5a04ba2c008b51d8950c3f18d83edaffb9bef2a9d19dd2f79f3 0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch -fcf2c37b3eaddd3e1bea2880c1b80f010623743ab2f43e144e0ecc7be874d4ff 0006-Do-not-install-erlang-sources.patch -9704a53bc4bd6f5624f9ce3f201128204011f4579f19b547df74d92ae22777cf 0007-Split-off-webtool-dependency-from-tools.patch 019c62ea3fee60068caa8c3152d7f96e76591fc5dc096abfcea48ec1593eb758 0010-fix-nteventlog-remove.patch -3ffda0b3acbde755b496c1a974c20e1ca580432c403944c1c16836f48e248429 0060-set-disksup_posix_only-to-true.patch -ec32540b798d2b3a7b8271cf95c63423dda864b24c8765368835295bf4575c61 0070-otp-update-version-18.3.2.patch" -sha512sums="f4a69bb14743d9f913d7060cfb6426f7c54693d07ed439506ede5160a0ba5a79a81cf08a56aaa02c68b3377cd22fed66a0fbeb216378330d7ad5c6348ed82014 otp_src_18.3.tar.gz -172f9b0f61748bf2f04737df0451bcc9c0812db0f365f0ef7c7c244fceb991987f79a5274eea578a89cc7d077f84645d1395d9dbcbf14010268b896a080c2ccf 0001-Do-not-format-man-pages-and-do-not-install-miscellan.patch -97c40c185b71b23ffcb924639af390b9a0be897070e396a9413e193e6d43048dfe3b86bcd0c5598b81a66ce1349de9e09f5228a452b51b6612cd947bbafb6377 0002-Remove-rpath.patch -1cae89d1e8f9d375ae08c7de2b8f7a5143bcded90eef878e97c408542a50e9a880166311820013301e46364be0ae090d3fc515b6f915ead14e787b98290beec1 0003-Do-not-install-C-sources.patch -b174e3c9103aa26e3b4993ae77b849a55f733e6f8e5dd7bb641a8548aea7fcc91b99d772c91ff8864fff5c30b388438f8cb41d7ac941a86fc7bb1891f9838068 0004-Do-not-install-Java-sources.patch +5d523de091a5eff46b4ab7000b09d3668f9e3949b8b04c7d7c1b36936e6cda95 0015-otp-update-version-19.0.1.patch" +sha512sums="fdab82883f7be04cca91041819d15e0b065bdd049b134d056fe4ea12657f1c6f77aeebd778c09b4064e6d974734fe087592739181e14fe60597dbe37f492684f otp_src_19.0.tar.gz 923addcb1f6472829ba13ccc91ad3cef161f269478404f0a19bc4997118e06edd7459011a60769eb393eac930f30d4bd6c5526301382a5f9815862237f4664d3 0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch -ef9045ec689e2a6517dba7626c1225a9a265f14675d704effd324529c3d5128260ba64cebfd41185364d2c5ac9a644ccc7088d0031c14c6ff74cd60f3c5bff1f 0006-Do-not-install-erlang-sources.patch -d65fcfc3a9441941c6292c33d354964a82da11cc7a411dd0440719e490075ed588c1e70690e80650561749010d737394567f12ff73bd460f0d00c792c77cfae3 0007-Split-off-webtool-dependency-from-tools.patch b7387f92f8c27a0565c7885bba4b357183c62d422616e073bc5ffad338a0e22cb5165dcb3b95bf0b920ba00831599f2216027883f4be255aa6f6150b68b7a37c 0010-fix-nteventlog-remove.patch -f3c50f8610e08173c365a575737079b0259db6fc0dfa5b1be63c281b52358bbce9e2595132a8f6a06772785d7d38d108f8da8515e2f7706cd03b6585aab4d071 0060-set-disksup_posix_only-to-true.patch -e472bdb4b322d66b9c0ad9627abc469b8c648145ffad1dd7f645b38b2fad43492f475d2fd4d0bab159be6110db5043bb6d792d72e8276b3c3869be46129c6616 0070-otp-update-version-18.3.2.patch" +bbacccc2a4b85ab4c1a6a24db70b8e4ae6ddd5f2b8b3c6c3ce1c767ff2881bb35a7f6adac973ecb4469149f658ab924825ec295efe8f41fb00229db526cb4ac3 0015-otp-update-version-19.0.1.patch" -- cgit v1.2.3