Projects
Kolab:Winterfell
erlang
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 3
View file
erlang.spec
Changed
@@ -1,10 +1,6 @@ -%global bootstrap 1 +%global need_bootstrap_set 0 -%if 0%{?suse_version} < 1 && 0%{?fedora} < 1 && 0%{?rhel} < 7 -%global with_systemd 0 -%else -%global with_systemd 1 -%endif +%{!?need_bootstrap: %global need_bootstrap %{need_bootstrap_set}} %ifarch %{arm} # For some reason, fop hangs on arm, so for now don't generate docs by @@ -18,8 +14,61 @@ %global __with_hipe 1 %endif +## +## Optional components +## + +%global __with_emacs 1 +%global __with_examples 1 +%global __with_java 1 +%global __with_tcltk 1 +# +# wxWidgets plugin blocks the following ones: +# +# * debugger - https://bugzilla.redhat.com/1095715 +# * dialyzer - https://bugzilla.redhat.com/1095717 +# * et - https://bugzilla.redhat.com/1095718 +# * observer - https://bugzilla.redhat.com/1095721 +# * reltool - https://bugzilla.redhat.com/1095727 +# +# debugger blocks: +# +# * common_test +# * megaco +# +# dialyzer blocks: +# +# * typer +# +# et blocks: +# +# * megaco +# +# observer blocks: +# +# * common_test +# * test_server +# * webtool +# +# So finally we have to disable the following plugins: +# +# common_test +# debugger +# dialyzer +# et +# megaco +# observer +# reltool (*) +# test_server +# typer +# webtool +# wx +# +%global __with_wxwidgets 1 + + Name: erlang -Version: 18.3.3 +Version: 18.3.4.4 Release: 1%{?dist} Summary: General-purpose programming language and runtime environment @@ -77,46 +126,42 @@ # Add patch to crash dump on large distribution Patch8: otp-0008-Add-patch-to-crash-dump-on-large-distribution.patch # Fedora specific patch -# Quickfix for cmpxchg8b inline asm when pic and gcc >= 5.0 is -Patch10: otp-0010-Quickfix-for-cmpxchg8b-inline-asm-when-pic-and-gcc-5.patch +# Don't send unasked for systemd notifications +Patch9: otp-0009-Don-t-send-unasked-for-systemd-notifications.patch +# Fedora specific patch +# Fix decoding of LLONG_MIN in erl_decode +Patch10: otp-0010-Fix-decoding-of-LLONG_MIN-in-erl_decode.patch +# Fedora specific patch +# Respect -proto_dist switch while connection to EPMD +Patch11: otp-0011-Respect-proto_dist-switch-while-connection-to-EPMD.patch # end of autogenerated patch tag list BuildRequires: flex %if %{with doc} -%if 0%{?bootstrap} < 1 +%if 0%{?need_bootstrap} < 1 # Required for building docs (escript) BuildRequires: erlang %endif %endif -%if 0%{?with_systemd} -%if 0%{?suse_version} -Requires(post): systemd -Requires(postun): systemd -Requires(preun): systemd -%else -BuildRequires: systemd-devel -Requires(post): systemd-units -Requires(postun): systemd-units -Requires(preun): coreutils -Requires(preun): systemd-units -%endif -%else -Requires(post): chkconfig -Requires(post): initscripts -Requires(postun): initscripts -Requires(preun): chkconfig -Requires(preun): initscripts +%if 0%{?el7}%{?fedora} +# for <systemd/sd-daemon.h> +BuildRequires: systemd-devel +BuildRequires: systemd +Requires(post): systemd +Requires(preun):systemd +Requires(postun):systemd +Requires: systemd %endif - - BuildRequires: autoconf BuildRequires: automake -BuildRequires: erlang-rpm-macros +#BuildRequires: erlang-rpm-macros Requires: %{name}-asn1%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-common_test%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-compiler%{?_isa} = %{version}-%{release} Requires: %{name}-cosEvent%{?_isa} = %{version}-%{release} Requires: %{name}-cosEventDomain%{?_isa} = %{version}-%{release} @@ -126,25 +171,41 @@ Requires: %{name}-cosTime%{?_isa} = %{version}-%{release} Requires: %{name}-cosTransactions%{?_isa} = %{version}-%{release} Requires: %{name}-crypto%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-debugger%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} Requires: %{name}-dialyzer%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-diameter%{?_isa} = %{version}-%{release} Requires: %{name}-edoc%{?_isa} = %{version}-%{release} Requires: %{name}-eldap%{?_isa} = %{version}-%{release} Requires: %{name}-erl_docgen%{?_isa} = %{version}-%{release} Requires: %{name}-erl_interface%{?_isa} = %{version}-%{release} Requires: %{name}-erts%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-et%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-eunit%{?_isa} = %{version}-%{release} +%if %{__with_tcltk} Requires: %{name}-gs%{?_isa} = %{version}-%{release} +%endif %{__with_tcltk} Requires: %{name}-hipe%{?_isa} = %{version}-%{release} +%if %{__with_java} Requires: %{name}-ic%{?_isa} = %{version}-%{release} +%endif %{__with_java} Requires: %{name}-inets%{?_isa} = %{version}-%{release} +%if %{__with_java} Requires: %{name}-jinterface%{?_isa} = %{version}-%{release} +%endif %{__with_java} Requires: %{name}-kernel%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-megaco%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-mnesia%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-observer%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-odbc%{?_isa} = %{version}-%{release} Requires: %{name}-orber%{?_isa} = %{version}-%{release} Requires: %{name}-os_mon%{?_isa} = %{version}-%{release} @@ -153,7 +214,9 @@ Requires: %{name}-parsetools%{?_isa} = %{version}-%{release} Requires: %{name}-percept%{?_isa} = %{version}-%{release} Requires: %{name}-public_key%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-reltool%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-runtime_tools%{?_isa} = %{version}-%{release} Requires: %{name}-sasl%{?_isa} = %{version}-%{release} Requires: %{name}-snmp%{?_isa} = %{version}-%{release} @@ -161,11 +224,19 @@ Requires: %{name}-ssl%{?_isa} = %{version}-%{release} Requires: %{name}-stdlib%{?_isa} = %{version}-%{release} Requires: %{name}-syntax_tools%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-test_server%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-tools%{?_isa} = %{version}-%{release} +%if %{__with_wxwidgets} Requires: %{name}-typer%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} Requires: %{name}-webtool%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} Requires: %{name}-wx%{?_isa} = %{version}-%{release} +%endif %{__with_wxwidgets} Requires: %{name}-xmerl%{?_isa} = %{version}-%{release} %description @@ -176,6 +247,7 @@ ### BEGIN OF AUTOGENERATED LIST ### +%if %{__with_emacs} %package -n emacs-erlang Summary: Compiled elisp files for erlang-mode under GNU Emacs Group: Applications/Editors @@ -196,6 +268,7 @@ %description -n emacs-erlang-el Erlang mode for GNU Emacs (source lisp files). +%endif %{__with_emacs} %package asn1 Summary: Provides support for Abstract Syntax Notation One @@ -207,6 +280,7 @@ %description asn1 Provides support for Abstract Syntax Notation One. +%if %{__with_wxwidgets} %package common_test Summary: A portable framework for automatic testing Group: Development/Languages @@ -228,6 +302,7 @@ %description common_test A portable framework for automatic testing. +%endif %{__with_wxwidgets} %package compiler Summary: A byte code compiler for Erlang which produces highly compact code @@ -337,6 +412,7 @@ %description crypto Cryptographical support. +%if %{__with_wxwidgets} %package debugger Summary: A debugger for debugging and testing of Erlang programs Group: Development/Languages @@ -348,7 +424,9 @@ %description debugger A debugger for debugging and testing of Erlang programs. +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} %package dialyzer Summary: A DIscrepancy AnaLYZer for ERlang programs Group: Development/Languages @@ -363,6 +441,7 @@ %description dialyzer A DIscrepancy AnaLYZer for ERlang programs. +%endif %{__with_wxwidgets} %package diameter Summary: Diameter (RFC 3588) library @@ -463,6 +542,7 @@ %description erts Functionality necessary to run the Erlang System itself. +%if %{__with_wxwidgets} %package et Summary: An event tracer for Erlang programs Group: Development/Languages @@ -474,6 +554,7 @@ %description et An event tracer for Erlang programs. +%endif %{__with_wxwidgets} %package eunit Summary: Support for unit testing @@ -485,11 +566,14 @@ %description eunit Support for unit testing. +%if %{__with_examples} %package examples Summary: Examples for some Erlang modules Group: Development/Languages Requires: %{name}-erts%{?_isa} = %{version}-%{release} +%if %{__with_tcltk} Requires: %{name}-gs%{?_isa} = %{version}-%{release} +%endif %{__with_tcltk} Requires: %{name}-kernel%{?_isa} = %{version}-%{release} Requires: %{name}-public_key%{?_isa} = %{version}-%{release} Requires: %{name}-sasl%{?_isa} = %{version}-%{release} @@ -498,7 +582,9 @@ %description examples Examples for some Erlang modules. +%endif %{__with_examples} +%if %{__with_tcltk} %package gs Summary: A library for Tcl/Tk support in Erlang Group: Development/Languages @@ -511,6 +597,7 @@ %description gs A Graphics System used to write platform independent user interfaces. +%endif %{__with_tcltk} %package hipe Summary: High Performance Erlang @@ -527,7 +614,9 @@ %package ic Summary: IDL compiler Group: Development/Languages +%if %{__with_java} BuildRequires: java-devel +%endif %{__with_java} Requires: %{name}-erts%{?_isa} = %{version}-%{release} Requires: %{name}-kernel%{?_isa} = %{version}-%{release} Requires: %{name}-stdlib%{?_isa} = %{version}-%{release} @@ -548,6 +637,7 @@ %description inets A set of services such as a Web server and a ftp client etc. +%if %{__with_java} %package jinterface Summary: A library for accessing Java from Erlang Group: Development/Languages @@ -556,6 +646,7 @@ %description jinterface Low level interface to Java. +%endif %{__with_java} %package kernel Summary: Main erlang library @@ -566,6 +657,7 @@ %description kernel Main erlang library. +%if %{__with_wxwidgets} %package megaco Summary: Megaco/H.248 support library Group: Development/Languages @@ -581,6 +673,7 @@ Megaco/H.248 is a protocol for control of elements in a physically decomposed multimedia gateway, enabling separation of call control from media conversion. +%endif %{__with_wxwidgets} %package mnesia Summary: A heavy duty real-time distributed database @@ -592,6 +685,7 @@ %description mnesia A heavy duty real-time distributed database. +%if %{__with_wxwidgets} %package observer Summary: A set of tools for tracing and investigation of distributed systems Group: Development/Languages @@ -605,6 +699,7 @@ %description observer A set of tools for tracing and investigation of distributed systems. +%endif %{__with_wxwidgets} %package odbc Summary: A library for unixODBC support in Erlang @@ -700,6 +795,7 @@ %description public_key API to public key infrastructure. +%if %{__with_wxwidgets} %package reltool Summary: A release management tool Group: Development/Languages @@ -717,6 +813,7 @@ dependencies and enables interactive customization of a target system. The backend provides a batch interface for generation of customized target systems. +%endif %{__with_wxwidgets} %package runtime_tools Summary: A set of tools to include in a production system @@ -803,6 +900,7 @@ A utility used to handle abstract Erlang syntax trees, reading source files differently, pretty-printing syntax trees. +%if %{__with_wxwidgets} %package test_server Summary: The OTP Test Server Group: Development/Languages @@ -817,6 +915,7 @@ %description test_server The OTP Test Server. +%endif %{__with_wxwidgets} %package tools Summary: A set of programming tools including a coverage analyzer etc @@ -833,11 +932,14 @@ %if 0%{?fedora} >= 21 || 0%{?rhel} >= 8 Suggests: %{name}-webtool%{?_isa} = %{version}-%{release} %endif +%if %{__with_emacs} Provides: emacs-common-erlang = %{version}-%{release} +%endif %{__with_emacs} %description tools A set of programming tools including a coverage analyzer etc. +%if %{__with_wxwidgets} %package typer Summary: TYPe annotator for ERlang programs Group: Development/Languages @@ -850,7 +952,9 @@ %description typer TYPe annotator for ERlang programs. +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} %package webtool Summary: A tool that simplifying the use of web based Erlang tools Group: Development/Languages @@ -862,7 +966,9 @@ %description webtool A tool that simplifying the use of web based Erlang tools. +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} %package wx Summary: A library for wxWidgets support in Erlang Group: Development/Languages @@ -875,6 +981,7 @@ %description wx A Graphics System used to write platform independent user interfaces. +%endif %{__with_wxwidgets} %package xmerl Summary: Provides support for XML 1.0 @@ -886,6 +993,7 @@ %description xmerl Provides support for XML 1.0. +%if %{__with_emacs} %package -n xemacs-erlang Summary: Compiled elisp files for erlang-mode under XEmacs Group: Applications/Editors @@ -906,6 +1014,7 @@ %description -n xemacs-erlang-el Erlang mode for XEmacs (source lisp files). +%endif %{__with_emacs} ### END OF AUTOGENERATED LIST ### @@ -921,7 +1030,9 @@ %patch6 -p1 -b .Do_not_install_erlang_sources %patch7 -p1 -b .Split_off_webtool_dependency_from_tools %patch8 -p1 -b .Add_patch_to_crash_dump_on_large_distribution -%patch10 -p1 -b .Quickfix_for_cmpxchg8b_inline_asm_when_pic_and_gcc_5 +%patch9 -p1 -b .Don_t_send_unasked_for_systemd_notifications +%patch10 -p1 -b .Fix_decoding_of_LLONG_MIN_in_erl_decode +%patch11 -p1 -b .Respect_proto_dist_switch_while_connection_to_EPMD # end of autogenerated prep patch list # FIXME we should come up with a better solution @@ -941,18 +1052,38 @@ ERL_FLAGS="${RPM_OPT_FLAGS} -fno-strict-aliasing" %endif -CFLAGS="${ERL_FLAGS}" CXXFLAGS="${ERL_FLAGS}" %configure \ - --enable-shared-zlib \ - --enable-sctp \ -%if 0%{?with_systemd} - --enable-systemd \ -%endif - %{?__with_hipe:--enable-hipe} \ - --with-wx-config=/usr/bin/wx-config-3.0 +CFLAGS="${ERL_FLAGS}" CXXFLAGS="${ERL_FLAGS}" %configure --enable-shared-zlib --enable-sctp --enable-systemd \ + %{?__with_hipe:--enable-hipe} \ +%if %{__with_java} + \ +%else + --without-jinterface \ +%endif %{__with_java} +%if %{__with_tcltk} + \ +%else + --without-gs \ +%endif %{__with_tcltk} +%if %{__with_wxwidgets} + --with-wx-config=/usr/bin/wx-config-3.0 +%else + --without-common_test \ + --without-debugger \ + --without-dialyzer \ + --without-et \ + --without-megaco \ + --without-observer \ + --without-reltool \ + --without-test_server \ + --without-typer \ + --without-webtool \ + --without-wx +%endif %{__with_wxwidgets} # Remove pre-built BEAM files make clean +%if %{__with_emacs} # GNU Emacs/XEmacs related stuff erlang_tools_vsn="$(sed -n 's/TOOLS_VSN = //p' lib/tools/vsn.mk)" @@ -982,8 +1113,9 @@ pushd xemacs-erlang %{_xemacs_bytecompile} *.el popd +%endif %{__with_emacs} -make %{?_smp_flags} +make %if %{with doc} # should use FOP_OPTS after #832323 is resolved @@ -997,6 +1129,7 @@ %install +%if %{__with_emacs} # GNU Emacs/XEmacs related stuff erlang_tools_vsn="$(sed -n 's/TOOLS_VSN = //p' lib/tools/vsn.mk)" @@ -1022,6 +1155,7 @@ done rm -f "$RPM_BUILD_ROOT%{_xemacs_sitelispdir}/erlang/erlang-flymake.el" install -m 0644 xemacs-erlang/*.elc "$RPM_BUILD_ROOT%{_xemacs_sitelispdir}/erlang/" +%endif %{__with_emacs} make DESTDIR=$RPM_BUILD_ROOT install @@ -1032,9 +1166,15 @@ # Do not install info files - they are almost empty and useless find $RPM_BUILD_ROOT%{_libdir}/erlang -type f -name info -exec rm -f {} \; +%if %{__with_examples} # fix 0775 permission on some directories find $RPM_BUILD_ROOT%{_libdir}/erlang/lib/ssl-*/examples/ -type d -perm 0775 | xargs chmod 755 find $RPM_BUILD_ROOT%{_libdir}/erlang/lib/kernel-*/examples/uds_dist -type d -perm 0775 | xargs chmod 755 +%else +# Remove all examples +find $RPM_BUILD_ROOT%{_libdir}/erlang/lib/ -mindepth 1 -maxdepth 2 -type d -name examples -exec rm -rf {} \; +%endif %{__with_examples} + chmod 0755 $RPM_BUILD_ROOT%{_libdir}/erlang/bin # Relocate doc-files into the proper directory @@ -1084,6 +1224,7 @@ fi done +%if %{__with_java} # symlink *.jar files to appropriate places for subpackages install -m 0755 -d "$RPM_BUILD_ROOT%{_javadir}/%{name}" @@ -1096,9 +1237,10 @@ jinterface_lib_dir="$(ls -d1 $RPM_BUILD_ROOT%{_libdir}/erlang/lib/jinterface-*/ | sed "s,^$RPM_BUILD_ROOT,,")" test -d "$RPM_BUILD_ROOT$jinterface_lib_dir" ln -s "${jinterface_lib_dir}priv/OtpErlang.jar" "$RPM_BUILD_ROOT%{_javadir}/%{name}/" +%endif %{__with_java} # systemd-related stuff -%if 0%{?with_systemd} +%if 0%{?el7}%{?fedora} install -D -p -m 0644 %{SOURCE5} %{buildroot}%{_unitdir}/epmd.service install -D -p -m 0644 %{SOURCE6} %{buildroot}%{_unitdir}/epmd.socket install -D -p -m 0644 %{SOURCE7} %{buildroot}%{_unitdir}/epmd@.service @@ -1106,6 +1248,19 @@ %endif +%if %{__with_wxwidgets} +echo "No need to fix additional scripts" +%else +# FIXME workaround for broken Erlang install procedure +for exe in ct_run dialyzer typer +do + rm -f $RPM_BUILD_ROOT/%{_bindir}/${exe} + rm -f $RPM_BUILD_ROOT/%{_libdir}/erlang/bin/${exe} + rm -f $RPM_BUILD_ROOT/%{_libdir}/erlang/erts-*/bin/${exe} +done +%endif %{__with_wxwidgets} + + %check # FIXME run tests somehow # make tests || exit 0 @@ -1139,10 +1294,14 @@ %{_libdir}/erlang/man/man3/asn1rt.* %endif +%if %{__with_wxwidgets} %files common_test %{_bindir}/ct_run +%{_libdir}/erlang/bin/ct_run +%{_libdir}/erlang/erts-*/bin/ct_run %{_libdir}/erlang/lib/common_test-*/ %if %{with doc} +%{_libdir}/erlang/man/man1/ct_run.* %{_libdir}/erlang/man/man3/ct.* %{_libdir}/erlang/man/man3/ct_cover.* %{_libdir}/erlang/man/man3/ct_ftp.* @@ -1158,6 +1317,7 @@ %{_libdir}/erlang/man/man3/unix_telnet.* %{_libdir}/erlang/man/man6/common_test.* %endif +%endif %{__with_wxwidgets} %files compiler %{_libdir}/erlang/lib/compiler-*/ @@ -1290,6 +1450,7 @@ %{_libdir}/erlang/man/man6/crypto.* %endif +%if %{__with_wxwidgets} %files debugger %{_libdir}/erlang/lib/debugger-*/ %if %{with doc} @@ -1297,7 +1458,9 @@ %{_libdir}/erlang/man/man3/i.* %{_libdir}/erlang/man/man3/int.* %endif +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} %files dialyzer %{_bindir}/dialyzer %{_libdir}/erlang/bin/dialyzer @@ -1306,6 +1469,7 @@ %if %{with doc} %{_libdir}/erlang/man/man3/dialyzer.* %endif +%endif %{__with_wxwidgets} %files diameter %dir %{_libdir}/erlang/lib/diameter-*/ @@ -1394,7 +1558,6 @@ %{_bindir}/escript %{_bindir}/run_erl %{_bindir}/to_erl -%{_libdir}/erlang/bin/ct_run %{_libdir}/erlang/bin/epmd %{_libdir}/erlang/bin/erl %{_libdir}/erlang/bin/erlc @@ -1413,7 +1576,6 @@ %{_libdir}/erlang/erts-*/bin/beam %{_libdir}/erlang/erts-*/bin/beam.smp %{_libdir}/erlang/erts-*/bin/child_setup -%{_libdir}/erlang/erts-*/bin/ct_run %{_libdir}/erlang/erts-*/bin/dyn_erl %{_libdir}/erlang/erts-*/bin/epmd %{_libdir}/erlang/erts-*/bin/erl @@ -1433,7 +1595,6 @@ %{_libdir}/erlang/erts-*/src/ %{_libdir}/erlang/lib/erts-*/ %if %{with doc} -%{_libdir}/erlang/man/man1/ct_run.* %{_libdir}/erlang/man/man1/epmd.* %{_libdir}/erlang/man/man1/erl.* %{_libdir}/erlang/man/man1/erlc.* @@ -1452,13 +1613,14 @@ %endif %{_libdir}/erlang/releases/* %{_libdir}/erlang/usr/ -%if 0%{?with_systemd} +%if 0%{?el7}%{?fedora} %{_unitdir}/epmd.service %{_unitdir}/epmd.socket %{_unitdir}/epmd@.service %{_unitdir}/epmd@.socket %endif +%if %{__with_wxwidgets} %files et %dir %{_libdir}/erlang/lib/et-*/ %{_libdir}/erlang/lib/et-*/ebin @@ -1470,6 +1632,7 @@ %{_libdir}/erlang/man/man3/et_selector.* %{_libdir}/erlang/man/man3/et_viewer.* %endif +%endif %{__with_wxwidgets} %files eunit %dir %{_libdir}/erlang/lib/eunit-*/ @@ -1481,20 +1644,31 @@ %{_libdir}/erlang/man/man3/eunit_surefire.* %endif +%if %{__with_examples} %files examples %{_libdir}/erlang/lib/asn1-*/examples/ %{_libdir}/erlang/lib/diameter-*/examples/ +%if %{__with_wxwidgets} %{_libdir}/erlang/lib/et-*/examples/ +%endif %{__with_wxwidgets} %{_libdir}/erlang/lib/eunit-*/examples/ +%if %{__with_tcltk} %{_libdir}/erlang/lib/gs-*/examples/ +%endif %{__with_tcltk} +%if %{__with_java} %{_libdir}/erlang/lib/ic-*/examples/ +%endif %{__with_java} %{_libdir}/erlang/lib/inets-*/examples/ %{_libdir}/erlang/lib/kernel-*/examples/ %{_libdir}/erlang/lib/megaco-*/examples/ %{_libdir}/erlang/lib/mnesia-*/examples/ +%if %{__with_wxwidgets} %{_libdir}/erlang/lib/observer-*/examples/ +%endif %{__with_wxwidgets} %{_libdir}/erlang/lib/orber-*/examples/ +%if %{__with_wxwidgets} %{_libdir}/erlang/lib/reltool-*/examples/ +%endif %{__with_wxwidgets} %{_libdir}/erlang/lib/runtime_tools-*/examples/ %{_libdir}/erlang/lib/sasl-*/examples/ %{_libdir}/erlang/lib/snmp-*/examples/ @@ -1502,8 +1676,12 @@ %{_libdir}/erlang/lib/stdlib-*/examples/ %{_libdir}/erlang/lib/syntax_tools-*/examples/ %{_libdir}/erlang/lib/tools-*/examples/ +%if %{__with_wxwidgets} %{_libdir}/erlang/lib/wx-*/examples/ +%endif %{__with_wxwidgets} +%endif %{__with_examples} +%if %{__with_tcltk} %files gs %dir %{_libdir}/erlang/lib/gs-*/ %{_libdir}/erlang/lib/gs-*/contribs @@ -1513,6 +1691,7 @@ %if %{with doc} %{_libdir}/erlang/man/man3/gs.* %endif +%endif %{__with_tcltk} %files hipe %{_libdir}/erlang/lib/hipe-*/ @@ -1525,7 +1704,9 @@ %{_libdir}/erlang/lib/ic-*/src # FIXME see erlang-jinterface also #%dir %{_javadir}/%{name}/ +%if %{__with_java} %{_javadir}/%{name}/ic.jar +%endif %{__with_java} %if %{with doc} %{_libdir}/erlang/man/man3/ic.* %{_libdir}/erlang/man/man3/ic_clib.* @@ -1554,11 +1735,13 @@ %{_libdir}/erlang/man/man3/tftp.* %endif +%if %{__with_java} %files jinterface # FIXME see erlang-ic also #%dir %{_javadir}/%{name}/ %{_javadir}/%{name}/OtpErlang.jar %{_libdir}/erlang/lib/jinterface-*/ +%endif %{__with_java} %files kernel %dir %{_libdir}/erlang/lib/kernel-*/ @@ -1600,6 +1783,7 @@ %{_libdir}/erlang/man/man6/kernel.* %endif +%if %{__with_wxwidgets} %files megaco %dir %{_libdir}/erlang/lib/megaco-*/ %{_libdir}/erlang/lib/megaco-*/ebin @@ -1620,6 +1804,7 @@ %{_libdir}/erlang/man/man3/megaco_udp.* %{_libdir}/erlang/man/man3/megaco_user.* %endif +%endif %{__with_wxwidgets} %files mnesia %dir %{_libdir}/erlang/lib/mnesia-*/ @@ -1631,6 +1816,7 @@ %{_libdir}/erlang/man/man3/mnesia_registry.* %endif +%if %{__with_wxwidgets} %files observer %dir %{_libdir}/erlang/lib/observer-*/ %{_libdir}/erlang/lib/observer-*/ebin/ @@ -1640,10 +1826,12 @@ %if %{with doc} %{_libdir}/erlang/man/man1/cdv.* %{_libdir}/erlang/man/man3/crashdump.* +%{_libdir}/erlang/man/man3/etop.* %{_libdir}/erlang/man/man3/observer.* %{_libdir}/erlang/man/man3/ttb.* %{_libdir}/erlang/man/man6/observer.* %endif +%endif %{__with_wxwidgets} %files odbc %{_libdir}/erlang/lib/odbc-*/ @@ -1668,7 +1856,6 @@ %{_libdir}/erlang/man/man3/any.* %{_libdir}/erlang/man/man3/corba.* %{_libdir}/erlang/man/man3/corba_object.* -%{_libdir}/erlang/man/man3/etop.* %{_libdir}/erlang/man/man3/fixed.* %{_libdir}/erlang/man/man3/interceptors.* %{_libdir}/erlang/man/man3/lname.* @@ -1727,6 +1914,7 @@ %{_libdir}/erlang/man/man3/public_key.* %endif +%if %{__with_wxwidgets} %files reltool %dir %{_libdir}/erlang/lib/reltool-*/ %{_libdir}/erlang/lib/reltool-*/ebin @@ -1734,6 +1922,7 @@ %if %{with doc} %{_libdir}/erlang/man/man3/reltool.* %endif +%endif %{__with_wxwidgets} %files runtime_tools %dir %{_libdir}/erlang/lib/runtime_tools-*/ @@ -1942,6 +2131,7 @@ %{_libdir}/erlang/man/man3/prettypr.* %endif +%if %{__with_wxwidgets} %files test_server %{_libdir}/erlang/lib/test_server-*/ %if %{with doc} @@ -1949,6 +2139,7 @@ %{_libdir}/erlang/man/man3/test_server_ctrl.* %{_libdir}/erlang/man/man6/test_server.* %endif +%endif %{__with_wxwidgets} %files tools %dir %{_libdir}/erlang/lib/tools-*/ @@ -1970,20 +2161,25 @@ %{_libdir}/erlang/man/man3/xref.* %endif +%if %{__with_wxwidgets} %files typer %{_bindir}/typer %{_libdir}/erlang/bin/typer %{_libdir}/erlang/erts-*/bin/typer %dir %{_libdir}/erlang/lib/typer-*/ %{_libdir}/erlang/lib/typer-*/ebin/ +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} %files webtool %{_libdir}/erlang/lib/webtool-*/ %if %{with doc} %{_libdir}/erlang/man/man1/start_webtool.* %{_libdir}/erlang/man/man3/webtool.* %endif +%endif %{__with_wxwidgets} +%if %{__with_wxwidgets} %files wx %dir %{_libdir}/erlang/lib/wx-*/ %{_libdir}/erlang/lib/wx-*/ebin @@ -2221,6 +2417,7 @@ %{_libdir}/erlang/man/man3/wxWindowDestroyEvent.* %{_libdir}/erlang/man/man3/wxXmlResource.* %endif +%endif %{__with_wxwidgets} %files xmerl %{_libdir}/erlang/lib/xmerl-*/ @@ -2234,6 +2431,7 @@ %{_libdir}/erlang/man/man3/xmerl_xsd.* %endif +%if %{__with_emacs} %files -n emacs-erlang %dir %{_emacs_sitelispdir}/erlang %doc %{_emacs_sitelispdir}/erlang/README @@ -2251,9 +2449,45 @@ %files -n xemacs-erlang-el %{_xemacs_sitelispdir}/erlang/*.el +%endif %{__with_emacs} %changelog +* Tue Aug 16 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.4.4-1 +- Ver. 18.3.4.4 + +* Tue Jul 26 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.4.2-1 +- Ver. 18.3.4.2 + +* Fri Jul 15 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.4.1-1 +- Ver. 18.3.4.1 +- Allow node registration via IPv6 (PR erlang/otp#1129) + +* Tue Jun 14 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.4-1 +- Ver. 18.3.4 + +* Mon Jun 13 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.3-2 +- Fix regression with GCC 6.x.y + +* Wed May 11 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.3-1 +- Ver. 18.3.3 + +* Wed Apr 27 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.2-1 +- Ver. 18.3.2 + +* Sun Apr 10 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.1-2 +- Enable selective building + +* Thu Apr 7 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.1-1 +- Ver. 18.3.1 + +* Thu Mar 31 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3-2 +- Added patch to suppress sending systemd notifications from epmd if not + started as a systemd service. + +* Thu Mar 24 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3-1 +- Ver. 18.3 + * Sun Feb 28 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.2.4-2 - Fixed issue with nodes registration over IPv6
View file
otp-0006-Do-not-install-erlang-sources.patch
Changed
@@ -472,10 +472,10 @@ $(INSTALL_DATA) $(TARGET_FILES) $(BEHAVIOUR_TARGET_FILES) "$(RELSYSDIR)/ebin" diff --git a/lib/inets/src/inets_app/Makefile b/lib/inets/src/inets_app/Makefile -index 0a4b625..1b1d83d 100644 +index 7f51676..093f462 100644 --- a/lib/inets/src/inets_app/Makefile +++ b/lib/inets/src/inets_app/Makefile -@@ -115,7 +115,7 @@ include $(ERL_TOP)/make/otp_release_targets.mk +@@ -116,7 +116,7 @@ include $(ERL_TOP)/make/otp_release_targets.mk release_spec: opt $(INSTALL_DIR) "$(RELSYSDIR)/src" $(INSTALL_DIR) "$(RELSYSDIR)/src/inets_app" @@ -874,10 +874,10 @@ $(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) $(APP_TARGET) \ $(APPUP_TARGET) "$(RELSYSDIR)/ebin" diff --git a/lib/ssl/src/Makefile b/lib/ssl/src/Makefile -index 790328d..db08822 100644 +index 7a7a373..419fa9e 100644 --- a/lib/ssl/src/Makefile +++ b/lib/ssl/src/Makefile -@@ -141,7 +141,7 @@ include $(ERL_TOP)/make/otp_release_targets.mk +@@ -142,7 +142,7 @@ include $(ERL_TOP)/make/otp_release_targets.mk release_spec: opt $(INSTALL_DIR) "$(RELSYSDIR)/src"
View file
otp-0008-Add-patch-to-crash-dump-on-large-distribution.patch
Changed
@@ -7,10 +7,11 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1291856 https://bugzilla.redhat.com/show_bug.cgi?id=1291857 -diff -ur otp-OTP-18.3.3.orig/erts/emulator/beam/dist.c otp-OTP-18.3.3/erts/emulator/beam/dist.c ---- otp-OTP-18.3.3.orig/erts/emulator/beam/dist.c 2016-05-03 10:11:12.000000000 +0200 -+++ otp-OTP-18.3.3/erts/emulator/beam/dist.c 2016-05-29 12:35:03.801225329 +0200 -@@ -1980,7 +1980,7 @@ +diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c +index 787241b..069d80a 100644 +--- a/erts/emulator/beam/dist.c ++++ b/erts/emulator/beam/dist.c +@@ -1980,7 +1980,7 @@ dist_port_command(Port *prt, ErtsDistOutputBuf *obuf) ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt)); if (size > (Uint) INT_MAX) @@ -19,7 +20,7 @@ "Absurdly large distribution output data buffer " "(%beu bytes) passed.\n", size); -@@ -2020,7 +2020,7 @@ +@@ -2020,7 +2020,7 @@ dist_port_commandv(Port *prt, ErtsDistOutputBuf *obuf) ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt)); if (size > (Uint) INT_MAX)
View file
otp-0009-Don-t-send-unasked-for-systemd-notifications.patch
Added
@@ -0,0 +1,56 @@ +From: Alexey Lebedeff <alebedev@mirantis.com> +Date: Tue, 29 Mar 2016 20:30:22 +0300 +Subject: [PATCH] Don't send unasked for systemd notifications + +Suppose we have some erlang system that uses systemd unit with +Type=notify - so this should send startup confirmation itself. But if +systemd-enabled epmd will be started as a first step of that system +startup, empd startup confirmation will be misinterpeted by systemd. And +our erlang service will be considered 'ready' to early. Also this will +interefere with systemd MAINPID detection: systemd will be monitoring +`epmd` process instead of `beam` one. + +For example, rabbitmq works around this issue by starting epmd using +separate short-lived beam process, with NOTIFY_SOCKET environment +variable reset - only in this way we could be sure that epmd will not +interfere with rabbit startup sequence. + +This patch disables indiscriminate confirmation sending, and does it +only when it was explicitly asked to do so. + +diff --git a/erts/epmd/src/epmd.c b/erts/epmd/src/epmd.c +index 5513cb2..4740ce8 100644 +--- a/erts/epmd/src/epmd.c ++++ b/erts/epmd/src/epmd.c +@@ -592,8 +592,10 @@ void epmd_cleanup_exit(EpmdVars *g, int exitval) + free(g->argv); + } + #ifdef HAVE_SYSTEMD_DAEMON +- sd_notifyf(0, "STATUS=Exited.\n" +- "ERRNO=%i", exitval); ++ if (g->is_systemd){ ++ sd_notifyf(0, "STATUS=Exited.\n" ++ "ERRNO=%i", exitval); ++ } + #endif /* HAVE_SYSTEMD_DAEMON */ + exit(exitval); + } +diff --git a/erts/epmd/src/epmd_srv.c b/erts/epmd/src/epmd_srv.c +index e1bac99..59d59ad 100644 +--- a/erts/epmd/src/epmd_srv.c ++++ b/erts/epmd/src/epmd_srv.c +@@ -452,9 +452,11 @@ void run(EpmdVars *g) + num_sockets = bound; + #ifdef HAVE_SYSTEMD_DAEMON + } +- sd_notifyf(0, "READY=1\n" +- "STATUS=Processing port mapping requests...\n" +- "MAINPID=%lu", (unsigned long) getpid()); ++ if (g->is_systemd) { ++ sd_notifyf(0, "READY=1\n" ++ "STATUS=Processing port mapping requests...\n" ++ "MAINPID=%lu", (unsigned long) getpid()); ++ } + #endif /* HAVE_SYSTEMD_DAEMON */ + + dbg_tty_printf(g,2,"entering the main select() loop");
View file
otp-0010-Fix-decoding-of-LLONG_MIN-in-erl_decode.patch
Added
@@ -0,0 +1,69 @@ +From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= <egil@erlang.org> +Date: Fri, 10 Jun 2016 16:40:38 +0200 +Subject: [PATCH] Fix decoding of LLONG_MIN in erl_decode + +Reported-by: Peter Lemenkov + +diff --git a/lib/erl_interface/src/legacy/erl_marshal.c b/lib/erl_interface/src/legacy/erl_marshal.c +index a4216c9..6a1b573 100644 +--- a/lib/erl_interface/src/legacy/erl_marshal.c ++++ b/lib/erl_interface/src/legacy/erl_marshal.c +@@ -727,6 +727,13 @@ static ETERM *erl_decode_it(unsigned char **ext) + ((*ext)[2]) << 8 |((*ext)[3]); + *ext += 4; + big_cont: ++ ++#ifdef _MSC_VER ++#define MAX_TO_NEGATE 0x8000000000000000Ui64 ++#else ++#define MAX_TO_NEGATE 0x8000000000000000ULL ++#endif ++ + sign = *(*ext)++; + if (arity > 8) + goto big_truncate; +@@ -763,23 +770,28 @@ static ETERM *erl_decode_it(unsigned char **ext) + *ext += arity; + return ep; + } else { +- /* Fits in a long long */ +- int x; +- long long l = 0LL; +- +- for(x = 0 ; x < arity ; x++) { +- l |= ((long long)(*ext)[x]) << ((long long)(8*x)); +- } +- if (sign) { +- l = -l; +- if (l > 0) goto big_truncate; +- } +- +- ERL_TYPE(ep) = ERL_LONGLONG; +- ep->uval.llval.i = l; +- *ext += arity; +- return ep; ++ /* Fits in a signed long long */ ++ int x; ++ unsigned long long l = 0LL; ++ long long sl; ++ ++ for(x = 0 ; x < arity ; x++) { ++ l |= ((unsigned long long)(*ext)[x]) << ((unsigned long long)(8*x)); ++ } ++ ++ sl = (long long)l; ++ ++ if (sign && l != MAX_TO_NEGATE) { ++ sl = -sl; ++ if (sl > 0) goto big_truncate; ++ } ++ ++ ERL_TYPE(ep) = ERL_LONGLONG; ++ ep->uval.llval.i = sl; ++ *ext += arity; ++ return ep; + } ++#undef MAX_TO_NEGATE + big_truncate: + /* truncate to: (+/-) 1 */ + #ifdef DEBUG
View file
otp-0010-Quickfix-for-cmpxchg8b-inline-asm-when-pic-and-gcc-5.patch
Deleted
@@ -1,26 +0,0 @@ -From: Rickard Green <rickard@erlang.org> -Date: Tue, 9 Feb 2016 18:23:26 +0100 -Subject: [PATCH] Quickfix for cmpxchg8b inline asm when pic and gcc >= 5.0 is - used - - -diff -ur otp-OTP-18.3.3.0008/erts/include/internal/i386/ethr_dw_atomic.h otp-OTP-18.3.3/erts/include/internal/i386/ethr_dw_atomic.h ---- otp-OTP-18.3.3.0008/erts/include/internal/i386/ethr_dw_atomic.h 2016-05-03 10:11:12.000000000 +0200 -+++ otp-OTP-18.3.3/erts/include/internal/i386/ethr_dw_atomic.h 2016-05-29 12:39:23.181764902 +0200 -@@ -115,6 +115,8 @@ - return (ethr_sint_t *) ETHR_DW_NATMC_MEM__(var); - } - -+#if !ETHR_AT_LEAST_GCC_VSN__(5, 0, 0) -+ - #if defined(ETHR_CMPXCHG8B_PIC_NO_CLOBBER_EBX) && defined(__PIC__) && __PIC__ - #if ETHR_SIZEOF_PTR != 4 - # error unexpected pic issue -@@ -144,6 +146,7 @@ - # endif - #endif - -+#endif /* < gcc-5.0 */ - - #define ETHR_HAVE_ETHR_NATIVE_DW_ATOMIC_CMPXCHG_MB -
View file
otp-0011-Respect-proto_dist-switch-while-connection-to-EPMD.patch
Added
@@ -0,0 +1,47 @@ +From: Peter Lemenkov <lemenkov@gmail.com> +Date: Thu, 14 Jul 2016 17:51:16 +0300 +Subject: [PATCH] Respect -proto_dist switch while connection to EPMD + +Signed-off-by: Peter Lemenkov <lemenkov@gmail.com> + +diff --git a/lib/kernel/src/erl_epmd.erl b/lib/kernel/src/erl_epmd.erl +index c6202dd..ec2e330 100644 +--- a/lib/kernel/src/erl_epmd.erl ++++ b/lib/kernel/src/erl_epmd.erl +@@ -103,6 +103,10 @@ names(EpmdAddr) -> + + register_node(Name, PortNo) -> + register_node(Name, PortNo, inet). ++register_node(Name, PortNo, inet_tcp) -> ++ register_node(Name, PortNo, inet); ++register_node(Name, PortNo, inet6_tcp) -> ++ register_node(Name, PortNo, inet6); + register_node(Name, PortNo, Family) -> + gen_server:call(erl_epmd, {register, Name, PortNo, Family}, infinity). + +diff --git a/lib/kernel/src/inet_tcp_dist.erl b/lib/kernel/src/inet_tcp_dist.erl +index 64b28bb..ffbd5d5 100644 +--- a/lib/kernel/src/inet_tcp_dist.erl ++++ b/lib/kernel/src/inet_tcp_dist.erl +@@ -73,7 +73,7 @@ gen_listen(Driver, Name) -> + {ok, Socket} -> + TcpAddress = get_tcp_address(Driver, Socket), + {_,Port} = TcpAddress#net_address.address, +- case erl_epmd:register_node(Name, Port) of ++ case erl_epmd:register_node(Name, Port, Driver) of + {ok, Creation} -> + {ok, {Socket, TcpAddress, Creation}}; + Error -> +diff --git a/lib/ssl/src/ssl_tls_dist_proxy.erl b/lib/ssl/src/ssl_tls_dist_proxy.erl +index 4c78979..7c6b14f 100644 +--- a/lib/ssl/src/ssl_tls_dist_proxy.erl ++++ b/lib/ssl/src/ssl_tls_dist_proxy.erl +@@ -116,7 +116,7 @@ handle_call({listen, Driver, Name}, _From, State) -> + {ok, TcpAddress} = get_tcp_address(Socket), + {ok, WorldTcpAddress} = get_tcp_address(World), + {_,Port} = WorldTcpAddress#net_address.address, +- case erl_epmd:register_node(Name, Port) of ++ case erl_epmd:register_node(Name, Port, Driver) of + {ok, Creation} -> + {reply, {ok, {Socket, TcpAddress, Creation}}, + State#state{listen={Socket, World}}};
View file
otp-OTP-18.3.3.tar.gz/OTP_VERSION -> otp-OTP-18.3.4.4.tar.gz/OTP_VERSION
Changed
@@ -1,1 +1,1 @@ -18.3.3 +18.3.4.4
View file
otp-OTP-18.3.3.tar.gz/erts/doc/src/notes.xml -> otp-OTP-18.3.4.4.tar.gz/erts/doc/src/notes.xml
Changed
@@ -32,6 +32,46 @@ <p>This document describes the changes made to the ERTS application.</p> +<section><title>Erts 7.3.1.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Fixed a race that could cause a lost wakeup of a process + that timed out in a <c>receive ... after</c>. This bug + was introduced in ERTS version 7.0.</p> + <p> + Own Id: OTP-13798 Aux Id: OTP-11997 </p> + </item> + <item> + <p> + Fixed segfault after writing an erl crash dump.</p> + <p> + Own Id: OTP-13799</p> + </item> + </list> + </section> + +</section> + +<section><title>Erts 7.3.1.1</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Fix scheduler deadlock bug in <c>ets:update_counter/4</c> + when key is not found and inserting the default object + causes the table to grow.</p> + <p> + Own Id: OTP-13731 Aux Id: ERL-188 </p> + </item> + </list> + </section> + +</section> + <section><title>Erts 7.3.1</title> <section><title>Fixed Bugs and Malfunctions</title>
View file
otp-OTP-18.3.3.tar.gz/erts/emulator/beam/beam_emu.c -> otp-OTP-18.3.4.4.tar.gz/erts/emulator/beam/beam_emu.c
Changed
@@ -2182,7 +2182,10 @@ c_p->i = (BeamInstr *) Arg(0); /* L1 */ SWAPOUT; c_p->arity = 0; - erts_smp_atomic32_read_band_relb(&c_p->state, ~ERTS_PSFLG_ACTIVE); + + if (!ERTS_PTMR_IS_TIMED_OUT(c_p)) + erts_smp_atomic32_read_band_relb(&c_p->state, + ~ERTS_PSFLG_ACTIVE); ASSERT(!ERTS_PROC_IS_EXITING(c_p)); erts_smp_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); c_p->current = NULL;
View file
otp-OTP-18.3.3.tar.gz/erts/emulator/beam/erl_db_hash.c -> otp-OTP-18.3.4.4.tar.gz/erts/emulator/beam/erl_db_hash.c
Changed
@@ -2869,15 +2869,7 @@ q->hvalue = hval; q->next = NULL; *bp = b = q; - - { - int nitems = erts_smp_atomic_inc_read_nob(&tb->common.nitems); - int nactive = NACTIVE(tb); - - if (nitems > nactive * (CHAIN_LEN + 1) && !IS_FIXED(tb)) { - grow(tb, nactive); - } - } + flags |= DB_INC_TRY_GROW; } else { HashDbTerm *q, *next = b->next; @@ -2916,6 +2908,7 @@ HashDbTerm **bp = (HashDbTerm **) handle->bp; HashDbTerm *b = *bp; erts_smp_rwmtx_t* lck = (erts_smp_rwmtx_t*) handle->lck; + HashDbTerm* free_me = NULL; ERTS_SMP_LC_ASSERT(IS_HASH_WLOCKED(tb, lck)); /* locked by db_lookup_dbterm_hash */ @@ -2927,21 +2920,34 @@ b->hvalue = INVALID_HASH; } else { *bp = b->next; - free_term(tb, b); + free_me = b; } WUNLOCK_HASH(lck); erts_smp_atomic_dec_nob(&tb->common.nitems); try_shrink(tb); - } else if (handle->flags & DB_MUST_RESIZE) { - db_finalize_resize(handle, offsetof(HashDbTerm,dbterm)); - WUNLOCK_HASH(lck); - - free_term(tb, b); - } - else { - WUNLOCK_HASH(lck); + } else { + if (handle->flags & DB_MUST_RESIZE) { + db_finalize_resize(handle, offsetof(HashDbTerm,dbterm)); + free_me = b; + } + if (handle->flags & DB_INC_TRY_GROW) { + int nactive; + int nitems = erts_smp_atomic_inc_read_nob(&tb->common.nitems); + WUNLOCK_HASH(lck); + nactive = NACTIVE(tb); + + if (nitems > nactive * (CHAIN_LEN + 1) && !IS_FIXED(tb)) { + grow(tb, nactive); + } + } else { + WUNLOCK_HASH(lck); + } } + + if (free_me) + free_term(tb, free_me); + #ifdef DEBUG handle->dbterm = 0; #endif
View file
otp-OTP-18.3.3.tar.gz/erts/emulator/beam/erl_db_util.h -> otp-OTP-18.3.4.4.tar.gz/erts/emulator/beam/erl_db_util.h
Changed
@@ -79,6 +79,7 @@ #define DB_MUST_RESIZE 1 #define DB_NEW_OBJECT 2 +#define DB_INC_TRY_GROW 4 /* Info about a database entry while it's being updated * (by update_counter or update_element)
View file
otp-OTP-18.3.3.tar.gz/erts/emulator/beam/erl_hl_timer.c -> otp-OTP-18.3.4.4.tar.gz/erts/emulator/beam/erl_hl_timer.c
Changed
@@ -735,7 +735,10 @@ if (tmr == (void *) erts_smp_atomic_cmpxchg_mb(&proc->common.timer, ERTS_PTMR_TIMEDOUT, (erts_aint_t) tmr)) { - erts_aint32_t state = erts_smp_atomic32_read_acqb(&proc->state); + erts_aint32_t state; + erts_smp_proc_lock(proc, ERTS_PROC_LOCKS_MSG_RECEIVE); + state = erts_smp_atomic32_read_acqb(&proc->state); + erts_smp_proc_unlock(proc, ERTS_PROC_LOCKS_MSG_RECEIVE); if (!(state & (ERTS_PSFLG_ACTIVE|ERTS_PSFLG_EXITING))) erts_schedule_process(proc, state, 0); return 1;
View file
otp-OTP-18.3.3.tar.gz/erts/emulator/beam/erl_init.c -> otp-OTP-18.3.4.4.tar.gz/erts/emulator/beam/erl_init.c
Changed
@@ -2256,14 +2256,15 @@ if (erts_mtrace_enabled) erts_mtrace_exit((Uint32) n); + if (fmt != NULL && *fmt != '\0') + erl_error(fmt, args2); /* Print error message. */ + /* Produce an Erlang core dump if error */ if (((n == ERTS_ERROR_EXIT && erts_no_crash_dump == 0) || n == ERTS_DUMP_EXIT) && erts_initialized) { erl_crash_dump_v((char*) NULL, 0, fmt, args1); } - if (fmt != NULL && *fmt != '\0') - erl_error(fmt, args2); /* Print error message. */ sys_tty_reset(n); if (n == ERTS_INTR_EXIT)
View file
otp-OTP-18.3.3.tar.gz/erts/vsn.mk -> otp-OTP-18.3.4.4.tar.gz/erts/vsn.mk
Changed
@@ -18,7 +18,7 @@ # %CopyrightEnd% # -VSN = 7.3.1 +VSN = 7.3.1.2 # Port number 4365 in 4.2 # Port number 4366 in 4.3
View file
otp-OTP-18.3.3.tar.gz/lib/common_test/doc/src/notes.xml -> otp-OTP-18.3.4.4.tar.gz/lib/common_test/doc/src/notes.xml
Changed
@@ -33,6 +33,24 @@ <file>notes.xml</file> </header> +<section><title>Common_Test 1.12.1.1</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + If the telnet server would pause during transmission of a + line of text before terminating the line, the + ct_telnet:expect/3 function would print the line twice in + the test case HTML log. This problem has been fixed.</p> + <p> + Own Id: OTP-13730 Aux Id: seq13135 </p> + </item> + </list> + </section> + +</section> + <section><title>Common_Test 1.12.1</title> <section><title>Fixed Bugs and Malfunctions</title>
View file
otp-OTP-18.3.3.tar.gz/lib/common_test/src/ct_gen_conn.erl -> otp-OTP-18.3.4.4.tar.gz/lib/common_test/src/ct_gen_conn.erl
Changed
@@ -27,7 +27,7 @@ -export([start/4, stop/1, get_conn_pid/1, check_opts/1]). -export([call/2, call/3, return/2, do_within_time/2]). --export([log/3, start_log/1, cont_log/2, end_log/0]). +-export([log/3, start_log/1, cont_log/2, cont_log_no_timestamp/2, end_log/0]). %%---------------------------------------------------------------------- %% Exported types @@ -175,6 +175,14 @@ log(cont_log,[Format,Args]). %%%----------------------------------------------------------------- +%%% @spec cont_log_no_timestamp(Format,Args) -> ok +%%% +%%% @doc Log activities on the current connection (tool-internal use only). +%%% @see ct_logs:cont_log/2 +cont_log_no_timestamp(Format,Args) -> + log(cont_log_no_timestamp,[Format,Args]). + +%%%----------------------------------------------------------------- %%% @spec end_log() -> ok %%% %%% @doc Log activities on the current connection (tool-internal use only).
View file
otp-OTP-18.3.3.tar.gz/lib/common_test/src/ct_logs.erl -> otp-OTP-18.3.4.4.tar.gz/lib/common_test/src/ct_logs.erl
Changed
@@ -32,7 +32,7 @@ -export([init/2, close/2, init_tc/1, end_tc/1]). -export([register_groupleader/2, unregister_groupleader/1]). -export([get_log_dir/0, get_log_dir/1]). --export([log/3, start_log/1, cont_log/2, end_log/0]). +-export([log/3, start_log/1, cont_log/2, cont_log_no_timestamp/2, end_log/0]). -export([set_stylesheet/2, clear_stylesheet/1]). -export([add_external_logs/1, add_link/3]). -export([make_last_run_index/0]). @@ -358,6 +358,20 @@ ok. %%%----------------------------------------------------------------- +%%% @spec cont_log_no_timestamp(Format,Args) -> ok +%%% +%%% @doc Adds information about an activity (tool-internal use only). +%%% +%%% @see start_log/1 +%%% @see end_log/0 +cont_log_no_timestamp([],[]) -> + ok; +cont_log_no_timestamp(Format,Args) -> + cast({log,sync,self(),group_leader(),ct_internal,?MAX_IMPORTANCE, + [{Format,Args}],true}), + ok. + +%%%----------------------------------------------------------------- %%% @spec end_log() -> ok %%% %%% @doc Ends the logging of an activity (tool-internal use only). @@ -580,7 +594,6 @@ div_footer() -> "</pre></div>\n<pre>". - maybe_log_timestamp() -> {MS,S,US} = ?now, case get(log_timestamp) of
View file
otp-OTP-18.3.3.tar.gz/lib/common_test/src/ct_telnet.erl -> otp-OTP-18.3.4.4.tar.gz/lib/common_test/src/ct_telnet.erl
Changed
@@ -954,7 +954,7 @@ true -> ok; false -> - ct_gen_conn:cont_log(String,Args) + ct_gen_conn:cont_log_no_timestamp(String,Args) end; ForcePrint == true -> @@ -965,7 +965,7 @@ %% called ct_gen_conn:log(heading(Action,Name1),String,Args); false -> - ct_gen_conn:cont_log(String,Args) + ct_gen_conn:cont_log_no_timestamp(String,Args) end end end. @@ -1224,7 +1224,6 @@ EOMod = if TotalTO /= infinity -> EO#eo{total_timeout=trunc(TotalTO)}; true -> EO end, - ExpectFun = case EOMod#eo.seq of true -> fun() -> seq_expect(Name,Pid,Data,Pattern,Acc,EOMod) @@ -1247,38 +1246,34 @@ true -> IdleTO end, + {PatOrPats1,Acc1,Rest1} = case NotFinished of + {nomatch,Rest0} -> + %% one expect + {Pattern,[],Rest0}; + {continue,Pats0,Acc0,Rest0} -> + %% sequence + {Pats0,Acc0,Rest0} + end, case timer:tc(ct_gen_conn, do_within_time, [Fun,BreakAfter]) of - {_,{error,Reason}} -> + {_,{error,Reason}} -> %% A timeout will occur when the telnet connection %% is idle for EO#eo.idle_timeout milliseconds. + if Rest1 /= [] -> + log(name_or_pid(Name,Pid)," ~ts",[Rest1]); + true -> + ok + end, {error,Reason}; {_,{ok,Data1}} when TotalTO == infinity -> - case NotFinished of - {nomatch,Rest} -> - %% One expect - teln_expect1(Name,Pid,Rest++Data1, - Pattern,[],EOMod); - {continue,Patterns1,Acc1,Rest} -> - %% Sequence - teln_expect1(Name,Pid,Rest++Data1, - Patterns1,Acc1,EOMod) - end; + teln_expect1(Name,Pid,Rest1++Data1,PatOrPats1,Acc1,EOMod); {Elapsed,{ok,Data1}} -> TVal = TotalTO - (Elapsed/1000), if TVal =< 0 -> {error,timeout}; true -> EO1 = EO#eo{total_timeout = TVal}, - case NotFinished of - {nomatch,Rest} -> - %% One expect - teln_expect1(Name,Pid,Rest++Data1, - Pattern,[],EO1); - {continue,Patterns1,Acc1,Rest} -> - %% Sequence - teln_expect1(Name,Pid,Rest++Data1, - Patterns1,Acc1,EO1) - end + teln_expect1(Name,Pid,Rest1++Data1, + PatOrPats1,Acc1,EO1) end end end. @@ -1416,14 +1411,14 @@ case one_line(Data,[]) of {noline,Rest} when FoundPrompt=/=false -> %% This is the line including the prompt - case match_line(Name,Pid,Rest,Patterns,FoundPrompt,EO) of + case match_line(Name,Pid,Rest,Patterns,FoundPrompt,false,EO) of nomatch -> {nomatch,prompt}; {Tag,Match} -> {Tag,Match,[]} end; {noline,Rest} when EO#eo.prompt_check==false -> - case match_line(Name,Pid,Rest,Patterns,false,EO) of + case match_line(Name,Pid,Rest,Patterns,false,false,EO) of nomatch -> {nomatch,Rest}; {Tag,Match} -> @@ -1432,7 +1427,7 @@ {noline,Rest} -> {nomatch,Rest}; {Line,Rest} -> - case match_line(Name,Pid,Line,Patterns,false,EO) of + case match_line(Name,Pid,Line,Patterns,false,true,EO) of nomatch -> match_lines(Name,Pid,Rest,Patterns,EO); {Tag,Match} -> @@ -1440,45 +1435,50 @@ end end. - %% For one line, match each pattern -match_line(Name,Pid,Line,Patterns,FoundPrompt,EO) -> - match_line(Name,Pid,Line,Patterns,FoundPrompt,EO,match). +match_line(Name,Pid,Line,Patterns,FoundPrompt,Terminated,EO) -> + match_line(Name,Pid,Line,Patterns,FoundPrompt,Terminated,EO,match). -match_line(Name,Pid,Line,[prompt|Patterns],false,EO,RetTag) -> - match_line(Name,Pid,Line,Patterns,false,EO,RetTag); -match_line(Name,Pid,Line,[prompt|_Patterns],FoundPrompt,_EO,RetTag) -> +match_line(Name,Pid,Line,[prompt|Patterns],false,Term,EO,RetTag) -> + match_line(Name,Pid,Line,Patterns,false,Term,EO,RetTag); +match_line(Name,Pid,Line,[prompt|_Patterns],FoundPrompt,_Term,_EO,RetTag) -> log(name_or_pid(Name,Pid)," ~ts",[Line]), log(name_or_pid(Name,Pid),"PROMPT: ~ts",[FoundPrompt]), {RetTag,{prompt,FoundPrompt}}; -match_line(Name,Pid,Line,[{prompt,PromptType}|_Patterns],FoundPrompt,_EO,RetTag) - when PromptType==FoundPrompt -> +match_line(Name,Pid,Line,[{prompt,PromptType}|_Patterns],FoundPrompt,_Term, + _EO,RetTag) when PromptType==FoundPrompt -> log(name_or_pid(Name,Pid)," ~ts",[Line]), log(name_or_pid(Name,Pid),"PROMPT: ~ts",[FoundPrompt]), {RetTag,{prompt,FoundPrompt}}; -match_line(Name,Pid,Line,[{prompt,PromptType}|Patterns],FoundPrompt,EO,RetTag) +match_line(Name,Pid,Line,[{prompt,PromptType}|Patterns],FoundPrompt,Term, + EO,RetTag) when PromptType=/=FoundPrompt -> - match_line(Name,Pid,Line,Patterns,FoundPrompt,EO,RetTag); -match_line(Name,Pid,Line,[{Tag,Pattern}|Patterns],FoundPrompt,EO,RetTag) -> + match_line(Name,Pid,Line,Patterns,FoundPrompt,Term,EO,RetTag); +match_line(Name,Pid,Line,[{Tag,Pattern}|Patterns],FoundPrompt,Term,EO,RetTag) -> case re:run(Line,Pattern,[{capture,all,list}]) of nomatch -> - match_line(Name,Pid,Line,Patterns,FoundPrompt,EO,RetTag); + match_line(Name,Pid,Line,Patterns,FoundPrompt,Term,EO,RetTag); {match,Match} -> log(name_or_pid(Name,Pid),"MATCH: ~ts",[Line]), {RetTag,{Tag,Match}} end; -match_line(Name,Pid,Line,[Pattern|Patterns],FoundPrompt,EO,RetTag) -> +match_line(Name,Pid,Line,[Pattern|Patterns],FoundPrompt,Term,EO,RetTag) -> case re:run(Line,Pattern,[{capture,all,list}]) of nomatch -> - match_line(Name,Pid,Line,Patterns,FoundPrompt,EO,RetTag); + match_line(Name,Pid,Line,Patterns,FoundPrompt,Term,EO,RetTag); {match,Match} -> log(name_or_pid(Name,Pid),"MATCH: ~ts",[Line]), {RetTag,Match} end; -match_line(Name,Pid,Line,[],FoundPrompt,EO,match) -> - match_line(Name,Pid,Line,EO#eo.haltpatterns,FoundPrompt,EO,halt); -match_line(Name,Pid,Line,[],_FoundPrompt,_EO,halt) -> +match_line(Name,Pid,Line,[],FoundPrompt,Term,EO,match) -> + match_line(Name,Pid,Line,EO#eo.haltpatterns,FoundPrompt,Term,EO,halt); +%% print any terminated line that can not be matched +match_line(Name,Pid,Line,[],_FoundPrompt,true,_EO,halt) -> log(name_or_pid(Name,Pid)," ~ts",[Line]), + nomatch; +%% if there's no line termination, Line is saved as Rest (above) and will +%% be printed later +match_line(_Name,_Pid,_Line,[],_FoundPrompt,false,_EO,halt) -> nomatch. one_line([$\n|Rest],Line) ->
View file
otp-OTP-18.3.3.tar.gz/lib/common_test/vsn.mk -> otp-OTP-18.3.4.4.tar.gz/lib/common_test/vsn.mk
Changed
@@ -1,1 +1,1 @@ -COMMON_TEST_VSN = 1.12.1 +COMMON_TEST_VSN = 1.12.1.1
View file
otp-OTP-18.3.3.tar.gz/lib/inets/doc/src/notes.xml -> otp-OTP-18.3.4.4.tar.gz/lib/inets/doc/src/notes.xml
Changed
@@ -33,7 +33,22 @@ <file>notes.xml</file> </header> - <section><title>Inets 6.2.3</title> + <section><title>Inets 6.2.4</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Handle multiple \t in mime types file</p> + <p> + Own Id: OTP-13663 Aux Id: seq13132 </p> + </item> + </list> + </section> + +</section> + +<section><title>Inets 6.2.3</title> <section><title>Improvements and New Features</title> <list>
View file
otp-OTP-18.3.3.tar.gz/lib/inets/src/http_server/httpd_conf.erl -> otp-OTP-18.3.4.4.tar.gz/lib/inets/src/http_server/httpd_conf.erl
Changed
@@ -1004,7 +1004,8 @@ %% Ignore commented lines for efficiency later .. read_config_file(Stream, SoFar); Line -> - NewLine = re:replace(clean(Line),"[\t\r\f ]"," ", [{return,list}]), + NewLine = re:replace(white_space_clean(Line), + "[\t\r\f ]"," ", [{return,list}, global]), case NewLine of [] -> %% Also ignore empty lines .. @@ -1020,7 +1021,7 @@ eof -> eof; String -> - white_space_clean(String) + re:replace(white_space_clean(String), "[\t\r\f ]"," ", [{return,list}, global]) end, parse_mime_types(Stream, MimeTypesList, Line). parse_mime_types(Stream, MimeTypesList, eof) -> @@ -1042,6 +1043,8 @@ suffixes(_MimeType,[]) -> []; +suffixes(MimeType,[""|Rest]) -> + suffixes(MimeType, Rest); suffixes(MimeType,[Suffix|Rest]) -> [{Suffix,MimeType}|suffixes(MimeType,Rest)].
View file
otp-OTP-18.3.3.tar.gz/lib/inets/test/httpd_SUITE.erl -> otp-OTP-18.3.4.4.tar.gz/lib/inets/test/httpd_SUITE.erl
Changed
@@ -70,7 +70,8 @@ {group, https_security}, {group, http_reload}, {group, https_reload}, - {group, http_mime_types} + {group, http_mime_types}, + mime_types_format ]. groups() -> @@ -1291,6 +1292,115 @@ inets_test_lib:close(Type, Socket), [{server_name, "httpd_non_disturbing_" ++ Version}] = httpd:info(Server, [server_name]). +%%------------------------------------------------------------------------- +mime_types_format(Config) when is_list(Config) -> + DataDir = proplists:get_value(data_dir, Config), + MimeTypes = filename:join(DataDir, "mime_types.txt"), + {ok,[{"wrl","x-world/x-vrml"}, + {"vrml","x-world/x-vrml"}, + {"ice","x-conference/x-cooltalk"}, + {"movie","video/x-sgi-movie"}, + {"avi","video/x-msvideo"}, + {"qt","video/quicktime"}, + {"mov","video/quicktime"}, + {"mpeg","video/mpeg"}, + {"mpg","video/mpeg"}, + {"mpe","video/mpeg"}, + {"sgml","text/x-sgml"}, + {"sgm","text/x-sgml"}, + {"etx","text/x-setext"}, + {"tsv","text/tab-separated-values"}, + {"rtx","text/richtext"}, + {"txt","text/plain"}, + {"html","text/html"}, + {"htm","text/html"}, + {"css","text/css"}, + {"xwd","image/x-xwindowdump"}, + {"xpm","image/x-xpixmap"}, + {"xbm","image/x-xbitmap"}, + {"rgb","image/x-rgb"}, + {"ppm","image/x-portable-pixmap"}, + {"pgm","image/x-portable-graymap"}, + {"pbm","image/x-portable-bitmap"}, + {"pnm","image/x-portable-anymap"}, + {"ras","image/x-cmu-raster"}, + {"tiff","image/tiff"}, + {"tif","image/tiff"}, + {"png","image/png"}, + {"jpeg","image/jpeg"}, + {"jpg","image/jpeg"}, + {"jpe","image/jpeg"}, + {"ief","image/ief"}, + {"gif","image/gif"}, + {"pdb","chemical/x-pdb"}, + {"xyz","chemical/x-pdb"}, + {"wav","audio/x-wav"}, + {"ra","audio/x-realaudio"}, + {"rpm","audio/x-pn-realaudio-plugin"}, + {"ram","audio/x-pn-realaudio"}, + {"aif","audio/x-aiff"}, + {"aiff","audio/x-aiff"}, + {"aifc","audio/x-aiff"}, + {"mpga","audio/mpeg"}, + {"mp2","audio/mpeg"}, + {"au","audio/basic"}, + {"snd","audio/basic"}, + {"zip","application/zip"}, + {"src","application/x-wais-source"}, + {"ustar","application/x-ustar"}, + {"ms","application/x-troff-ms"}, + {"me","application/x-troff-me"}, + {"man","application/x-troff-man"}, + {"t","application/x-troff"}, + {"tr","application/x-troff"}, + {"roff","application/x-troff"}, + {"texinfo","application/x-texinfo"}, + {"texi","application/x-texinfo"}, + {"tex","application/x-tex"}, + {"tcl","application/x-tcl"}, + {"tar","application/x-tar"}, + {"sv4crc","application/x-sv4crc"}, + {"sv4cpio","application/x-sv4cpio"}, + {"sit","application/x-stuffit"}, + {"shar","application/x-shar"}, + {"sh","application/x-sh"}, + {"nc","application/x-netcdf"}, + {"cdf","application/x-netcdf"}, + {"mif","application/x-mif"}, + {"latex","application/x-latex"}, + {"skp","application/x-koan"}, + {"skd","application/x-koan"}, + {"skt","application/x-koan"}, + {"skm","application/x-koan"}, + {"cgi","application/x-httpd-cgi"}, + {"hdf","application/x-hdf"}, + {"gz","application/x-gzip"}, + {"gtar","application/x-gtar"}, + {"dvi","application/x-dvi"}, + {"dcr","application/x-director"}, + {"dir","application/x-director"}, + {"dxr","application/x-director"}, + {"csh","application/x-csh"}, + {"cpio","application/x-cpio"}, + {"Z","application/x-compress"}, + {"vcd","application/x-cdlink"}, + {"bcpio","application/x-bcpio"}, + {"rtf","application/rtf"}, + {"ppt","application/powerpoint"}, + {"ai","application/postscript"}, + {"eps","application/postscript"}, + {"ps","application/postscript"}, + {"pdf","application/pdf"}, + {"oda","application/oda"}, + {"bin","application/octet-stream"}, + {"dms","application/octet-stream"}, + {"lha","application/octet-stream"}, + {"lzh","application/octet-stream"}, + {"exe","application/octet-stream"}, + {"class","application/octet-stream"}, + {"doc","application/msword"}, + {"cpt","application/mac-compactpro"}, + {"hqx","application/mac-binhex40"}]} = httpd_conf:load_mime_types(MimeTypes). %%-------------------------------------------------------------------- %% Internal functions -----------------------------------
View file
otp-OTP-18.3.4.4.tar.gz/lib/inets/test/httpd_SUITE_data/mime_types.txt
Added
@@ -0,0 +1,100 @@ +# This is a comment. I love comments. + + +application/activemessage +application/andrew-inset +application/applefile +application/atomicmail +application/dca-rft +application/dec-dx +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/msword doc +application/news-message-id +application/news-transmission +application/octet-stream bin dms lha lzh exe class +application/oda oda +application/pdf pdf +application/postscript ai eps ps +application/powerpoint ppt +application/remote-printing +application/rtf rtf +application/slate +application/wita +application/wordperfect5.1 +application/x-bcpio bcpio +application/x-cdlink vcd +application/x-compress Z +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-gtar gtar +application/x-gzip gz +application/x-hdf hdf +application/x-httpd-cgi cgi +application/x-koan skp skd skt skm +application/x-latex latex +application/x-mif mif +application/x-netcdf nc cdf +application/x-sh sh +application/x-shar shar +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/zip zip +audio/basic au snd +audio/mpeg mpga mp2 +audio/x-aiff aif aiff aifc +audio/x-pn-realaudio ram +audio/x-pn-realaudio-plugin rpm +audio/x-realaudio ra +audio/x-wav wav +chemical/x-pdb pdb xyz +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/png png +image/tiff tiff tif +image/x-cmu-raster ras +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/external-body +message/news +message/partial +message/rfc822 +multipart/alternative +multipart/appledouble +multipart/digest +multipart/mixed +multipart/parallel +text/css css +text/html html htm +text/plain txt +text/richtext rtx +text/tab-separated-values tsv +text/x-setext etx +text/x-sgml sgml sgm +video/mpeg mpeg mpg mpe +video/quicktime qt mov +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice +x-world/x-vrml wrl vrml
View file
otp-OTP-18.3.3.tar.gz/lib/inets/vsn.mk -> otp-OTP-18.3.4.4.tar.gz/lib/inets/vsn.mk
Changed
@@ -19,6 +19,6 @@ # %CopyrightEnd% APPLICATION = inets -INETS_VSN = 6.2.3 +INETS_VSN = 6.2.4 PRE_VSN = APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)"
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/doc/src/notes.xml -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/doc/src/notes.xml
Changed
@@ -30,6 +30,39 @@ <file>notes.xml</file> </header> +<section><title>Ssh 4.2.2.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Upgrade of an established client connection could crash + because the ssh client supervisors children had wrong + type. This is fixed now.</p> + <p> + Own Id: OTP-13782 Aux Id: seq13158 </p> + </item> + </list> + </section> + +</section> + +<section><title>Ssh 4.2.2.1</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + SSH client does not any longer retry a bad password given + as option to ssh:connect et al.</p> + <p> + Own Id: OTP-13674 Aux Id: TR-HU92273 </p> + </item> + </list> + </section> + +</section> + <section><title>Ssh 4.2.2</title> <section><title>Fixed Bugs and Malfunctions</title>
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/src/ssh_auth.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/src/ssh_auth.erl
Changed
@@ -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 = + <<?BOOLEAN(?FALSE), + ?STRING(unicode:characters_to_binary(Password))>>}, + 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 @@ 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 @@ 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 = - <<?BOOLEAN(?FALSE), - ?STRING(unicode:characters_to_binary(Password))>>}, - 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 @@ language = "en"}) 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 @@ 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 = <<?UINT32(Sz), Password:Sz/binary>>}, #ssh{opts = Opts, @@ -369,11 +413,6 @@ [{"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 @@ 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_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),
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/src/ssh_connection_handler.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/src/ssh_connection_handler.erl
Changed
@@ -612,11 +612,14 @@ userauth_keyboard_interactive(#ssh_msg_userauth_info_request{} = Msg, - #state{ssh_params = #ssh{role = client, - io_cb = IoCb} = Ssh0} = State) -> - {ok, {Reply, Ssh}} = ssh_auth:handle_userauth_info_request(Msg, IoCb, Ssh0), - send_msg(Reply, State), - {next_state, userauth_keyboard_interactive_info_response, next_packet(State#state{ssh_params = Ssh})}; + #state{ssh_params = #ssh{role = client} = Ssh0} = State) -> + case ssh_auth:handle_userauth_info_request(Msg, Ssh0) of + {ok, {Reply, Ssh}} -> + send_msg(Reply, State), + {next_state, userauth_keyboard_interactive_info_response, next_packet(State#state{ssh_params = Ssh})}; + not_ok -> + userauth(Msg, State) + end; userauth_keyboard_interactive(#ssh_msg_userauth_info_response{} = Msg, #state{ssh_params = #ssh{role = server, @@ -646,7 +649,18 @@ userauth_keyboard_interactive_info_response(Msg=#ssh_msg_userauth_failure{}, - #state{ssh_params = #ssh{role = client}} = State) -> + #state{ssh_params = #ssh{role = client, + opts = Opts} = Ssh0} = State0) -> + + State = case proplists:get_value(password, Opts) of + undefined -> + State0; + _ -> + State0#state{ssh_params = + Ssh0#ssh{opts = + lists:keyreplace(password,1,Opts, + {password,not_ok})}} + end, userauth(Msg, State); userauth_keyboard_interactive_info_response(Msg=#ssh_msg_userauth_success{}, #state{ssh_params = #ssh{role = client}} = State) -> @@ -1247,7 +1261,7 @@ end, AuthMethods = proplists:get_value(auth_methods, Options, - ?SUPPORTED_AUTH_METHODS), + undefined), {ok, PeerAddr} = inet:peername(Socket), PeerName = proplists:get_value(host, Options),
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/src/ssh_io.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/src/ssh_io.erl
Changed
@@ -31,56 +31,55 @@ 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([$\n|Cs]) -> trim(Cs); trim1([$\t|Cs]) -> trim(Cs); trim1(Cs) -> Cs. - - -
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/src/sshc_sup.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/src/sshc_sup.erl
Changed
@@ -64,7 +64,7 @@ Name = undefined, % As simple_one_for_one is used. StartFunc = {ssh_connection_handler, start_link, []}, Restart = temporary, - Shutdown = infinity, + Shutdown = 4000, Modules = [ssh_connection_handler], - Type = supervisor, + Type = worker, {Name, StartFunc, Restart, Shutdown, Type, Modules}.
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/test/ssh_basic_SUITE.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/test/ssh_basic_SUITE.erl
Changed
@@ -49,7 +49,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, @@ -99,7 +104,8 @@ daemon_opt_fd, multi_daemon_opt_fd, packet_size_zero, - ssh_info_print + ssh_info_print, + {group, login_bad_pwd_no_retry} ]. groups() -> @@ -115,7 +121,13 @@ {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 + ]} ]. @@ -1089,6 +1101,72 @@ %%-------------------------------------------------------------------- +%% 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
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/test/ssh_sup_SUITE.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/test/ssh_sup_SUITE.erl
Changed
@@ -105,16 +105,16 @@ {ok, Pid1} = ssh:connect(Host, Port, [{silently_accept_hosts, true}, {user_interaction, false}, {user, ?USER}, {password, ?PASSWD},{user_dir, UserDir}]), - [{_, _,supervisor,[ssh_connection_handler]}] = + [{_, _,worker,[ssh_connection_handler]}] = supervisor:which_children(sshc_sup), {ok, Pid2} = ssh:connect(Host, Port, [{silently_accept_hosts, true}, {user_interaction, false}, {user, ?USER}, {password, ?PASSWD}, {user_dir, UserDir}]), - [{_,_,supervisor,[ssh_connection_handler]}, - {_,_,supervisor,[ssh_connection_handler]}] = + [{_,_,worker,[ssh_connection_handler]}, + {_,_,worker,[ssh_connection_handler]}] = supervisor:which_children(sshc_sup), ssh:close(Pid1), - [{_,_,supervisor,[ssh_connection_handler]}] = + [{_,_,worker,[ssh_connection_handler]}] = supervisor:which_children(sshc_sup), ssh:close(Pid2), ct:sleep(?WAIT_FOR_SHUTDOWN),
View file
otp-OTP-18.3.3.tar.gz/lib/ssh/vsn.mk -> otp-OTP-18.3.4.4.tar.gz/lib/ssh/vsn.mk
Changed
@@ -1,5 +1,5 @@ #-*-makefile-*- ; force emacs to enter makefile-mode -SSH_VSN = 4.2.2 +SSH_VSN = 4.2.2.2 APP_VSN = "ssh-$(SSH_VSN)"
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/doc/src/notes.xml -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/doc/src/notes.xml
Changed
@@ -28,6 +28,71 @@ <p>This document describes the changes made to the SSL application.</p> +<section><title>SSL 7.3.3.1</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + The TLS/SSL protocol version selection for the SSL server + has been corrected to follow RFC 5246 Appendix E.1 + especially in case where the list of supported versions + has gaps. Now the server selects the highest protocol + version it supports that is not higher than what the + client supports.</p> + <p> + Own Id: OTP-13753 Aux Id: seq13150 </p> + </item> + </list> + </section> + +</section> + +<section><title>SSL 7.3.3</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Correct ssl:prf/5 to use the negotiated cipher suite's + prf function in ssl:prf/5 instead of the default prf.</p> + <p> + Own Id: OTP-13546</p> + </item> + <item> + <p> + Timeouts may have the value 0, guards have been corrected + to allow this</p> + <p> + Own Id: OTP-13635</p> + </item> + <item> + <p> + Change of internal handling of hash sign pairs as the + used one enforced to much restrictions making some valid + combinations unavailable.</p> + <p> + Own Id: OTP-13670</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Create a little randomness in sending of session + invalidation messages, to mitigate load when whole table + is invalidated.</p> + <p> + Own Id: OTP-13490</p> + </item> + </list> + </section> + +</section> + <section><title>SSL 7.3.2</title> <section><title>Fixed Bugs and Malfunctions</title>
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/src/ssl.appup.src -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/src/ssl.appup.src
Changed
@@ -1,14 +1,20 @@ %% -*- erlang -*- {"%VSN%", [ - {<<"7\\..*">>, [{restart_application, ssl}]}, + {<<"^7[.]3[.]3$">>, + [{load_module, ssl_handshake, soft_purge, soft_purge, []} + ]}, + {<<"^7[.][^.].*">>, [{restart_application, ssl}]}, {<<"6\\..*">>, [{restart_application, ssl}]}, {<<"5\\..*">>, [{restart_application, ssl}]}, {<<"4\\..*">>, [{restart_application, ssl}]}, {<<"3\\..*">>, [{restart_application, ssl}]} ], [ - {<<"7\\..*">>, [{restart_application, ssl}]}, + {<<"^7[.]3[.]3$">>, + [{load_module, ssl_handshake, soft_purge, soft_purge, []} + ]}, + {<<"^7[.][^.].*">>, [{restart_application, ssl}]}, {<<"6\\..*">>, [{restart_application, ssl}]}, {<<"5\\..*">>, [{restart_application, ssl}]}, {<<"4\\..*">>, [{restart_application, ssl}]},
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/src/ssl.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/src/ssl.erl
Changed
@@ -97,7 +97,7 @@ connect(Socket, SslOptions, infinity). connect(Socket, SslOptions0, Timeout) when is_port(Socket), - (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity) -> + (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) -> {Transport,_,_,_} = proplists:get_value(cb_info, SslOptions0, {gen_tcp, tcp, tcp_closed, tcp_error}), EmulatedOptions = ssl_socket:emulated_options(), @@ -123,7 +123,7 @@ connect(Host, Port, Options) -> connect(Host, Port, Options, infinity). -connect(Host, Port, Options, Timeout) when (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity) -> +connect(Host, Port, Options, Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) -> try handle_options(Options, client) of {ok, Config} -> do_connect(Host,Port,Config,Timeout) @@ -173,7 +173,7 @@ #config{transport_info = {Transport,_,_, _} =CbInfo, connection_cb = ConnectionCb, ssl = SslOpts, - emulated = Tracker}}}, Timeout) when (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity) -> + emulated = Tracker}}}, Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) -> case Transport:accept(ListenSocket, Timeout) of {ok, Socket} -> {ok, EmOpts} = ssl_socket:get_emulated_opts(Tracker), @@ -206,25 +206,25 @@ ssl_accept(ListenSocket) -> ssl_accept(ListenSocket, infinity). -ssl_accept(#sslsocket{} = Socket, Timeout) when (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity) -> +ssl_accept(#sslsocket{} = Socket, Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) -> ssl_connection:handshake(Socket, Timeout); - -ssl_accept(ListenSocket, SslOptions) when is_port(ListenSocket) -> + +ssl_accept(ListenSocket, SslOptions) when is_port(ListenSocket) -> ssl_accept(ListenSocket, SslOptions, infinity). -ssl_accept(#sslsocket{} = Socket, [], Timeout) when (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity)-> +ssl_accept(#sslsocket{} = Socket, [], Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity)-> ssl_accept(#sslsocket{} = Socket, Timeout); -ssl_accept(#sslsocket{fd = {_, _, _, Tracker}} = Socket, SslOpts0, Timeout) when - (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity)-> - try - {ok, EmOpts, InheritedSslOpts} = ssl_socket:get_all_opts(Tracker), +ssl_accept(#sslsocket{fd = {_, _, _, Tracker}} = Socket, SslOpts0, Timeout) when + (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity)-> + try + {ok, EmOpts, InheritedSslOpts} = ssl_socket:get_all_opts(Tracker), SslOpts = handle_options(SslOpts0, InheritedSslOpts), ssl_connection:handshake(Socket, {SslOpts, emulated_socket_options(EmOpts, #socket_options{})}, Timeout) catch Error = {error, _Reason} -> Error end; ssl_accept(Socket, SslOptions, Timeout) when is_port(Socket), - (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity) -> + (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) -> {Transport,_,_,_} = proplists:get_value(cb_info, SslOptions, {gen_tcp, tcp, tcp_closed, tcp_error}), EmulatedOptions = ssl_socket:emulated_options(), @@ -252,17 +252,17 @@ Transport:close(ListenSocket). %%-------------------------------------------------------------------- --spec close(#sslsocket{}, integer() | {pid(), integer()}) -> term(). +-spec close(#sslsocket{}, timeout() | {pid(), integer()}) -> term(). %% %% Description: Close an ssl connection %%-------------------------------------------------------------------- -close(#sslsocket{pid = TLSPid}, - {Pid, Timeout} = DownGrade) when is_pid(TLSPid), - is_pid(Pid), - (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity) -> +close(#sslsocket{pid = TLSPid}, + {Pid, Timeout} = DownGrade) when is_pid(TLSPid), + is_pid(Pid), + (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) -> ssl_connection:close(TLSPid, {close, DownGrade}); -close(#sslsocket{pid = TLSPid}, Timeout) when is_pid(TLSPid), - (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity) -> +close(#sslsocket{pid = TLSPid}, Timeout) when is_pid(TLSPid), + (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) -> ssl_connection:close(TLSPid, {close, Timeout}); close(#sslsocket{pid = {ListenSocket, #config{transport_info={Transport,_, _, _}}}}, _) -> Transport:close(ListenSocket). @@ -286,7 +286,7 @@ recv(Socket, Length) -> recv(Socket, Length, infinity). recv(#sslsocket{pid = Pid}, Length, Timeout) when is_pid(Pid), - (is_integer(Timeout) andalso Timeout > 0) or (Timeout == infinity)-> + (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity)-> ssl_connection:recv(Pid, Length, Timeout); recv(#sslsocket{pid = {Listen, #config{transport_info = {Transport, _, _, _}}}}, _,_) when is_port(Listen)->
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/src/ssl_connection.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/src/ssl_connection.erl
Changed
@@ -821,7 +821,8 @@ SecParams = ConnectionState#connection_state.security_parameters, #security_parameters{master_secret = MasterSecret, client_random = ClientRandom, - server_random = ServerRandom} = SecParams, + server_random = ServerRandom, + prf_algorithm = PRFAlgorithm} = SecParams, Reply = try SecretToUse = case Secret of _ when is_binary(Secret) -> Secret; @@ -832,7 +833,7 @@ (client_random, Acc) -> [ClientRandom|Acc]; (server_random, Acc) -> [ServerRandom|Acc] end, [], Seed)), - ssl_handshake:prf(Version, SecretToUse, Label, SeedToUse, WantedLength) + ssl_handshake:prf(Version, PRFAlgorithm, SecretToUse, Label, SeedToUse, WantedLength) catch exit:_ -> {error, badarg}; error:Reason -> {error, Reason}
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/src/ssl_handshake.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/src/ssl_handshake.erl
Changed
@@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2013-2015. All Rights Reserved. +%% Copyright Ericsson AB 2013-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -74,7 +74,7 @@ ]). %% MISC --export([select_version/3, prf/5, select_hashsign/5, +-export([select_version/3, prf/6, select_hashsign/5, select_hashsign_algs/3, premaster_secret/2, premaster_secret/3, premaster_secret/4]). @@ -564,17 +564,15 @@ server_key_exchange_hash(Hash, Value) -> crypto:hash(Hash, Value). %%-------------------------------------------------------------------- --spec prf(ssl_record:ssl_version(), binary(), binary(), [binary()], non_neg_integer()) -> +-spec prf(ssl_record:ssl_version(), non_neg_integer(), binary(), binary(), [binary()], non_neg_integer()) -> {ok, binary()} | {error, undefined}. %% %% Description: use the TLS PRF to generate key material %%-------------------------------------------------------------------- -prf({3,0}, _, _, _, _) -> +prf({3,0}, _, _, _, _, _) -> {error, undefined}; -prf({3,1}, Secret, Label, Seed, WantedLength) -> - {ok, tls_v1:prf(?MD5SHA, Secret, Label, Seed, WantedLength)}; -prf({3,_N}, Secret, Label, Seed, WantedLength) -> - {ok, tls_v1:prf(?SHA256, Secret, Label, Seed, WantedLength)}. +prf({3,_N}, PRFAlgo, Secret, Label, Seed, WantedLength) -> + {ok, tls_v1:prf(PRFAlgo, Secret, Label, Seed, WantedLength)}. %%-------------------------------------------------------------------- @@ -1260,8 +1258,40 @@ end. select_version(RecordCB, ClientVersion, Versions) -> - ServerVersion = RecordCB:highest_protocol_version(Versions), - RecordCB:lowest_protocol_version(ClientVersion, ServerVersion). + do_select_version(RecordCB, ClientVersion, Versions). + +do_select_version(_, ClientVersion, []) -> + ClientVersion; +do_select_version(RecordCB, ClientVersion, [Version | Versions]) -> + case RecordCB:is_higher(Version, ClientVersion) of + true -> + %% Version too high for client - keep looking + do_select_version(RecordCB, ClientVersion, Versions); + false -> + %% Version ok for client - look for a higher + do_select_version(RecordCB, ClientVersion, Versions, Version) + end. +%% +do_select_version(_, _, [], GoodVersion) -> + GoodVersion; +do_select_version( + RecordCB, ClientVersion, [Version | Versions], GoodVersion) -> + BetterVersion = + case RecordCB:is_higher(Version, ClientVersion) of + true -> + %% Version too high for client + GoodVersion; + false -> + %% Version ok for client + case RecordCB:is_higher(Version, GoodVersion) of + true -> + %% Use higher version + Version; + false -> + GoodVersion + end + end, + do_select_version(RecordCB, ClientVersion, Versions, BetterVersion). renegotiation_info(_, client, _, false) -> #renegotiation_info{renegotiated_connection = undefined};
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/src/ssl_manager.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/src/ssl_manager.erl
Changed
@@ -67,6 +67,7 @@ -define(CLEAN_SESSION_DB, 60000). -define(CLEAN_CERT_DB, 500). -define(DEFAULT_MAX_SESSION_CACHE, 1000). +-define(LOAD_MITIGATION, 10). %%==================================================================== %% API @@ -196,10 +197,12 @@ %%-------------------------------------------------------------------- -spec invalidate_session(host(), inet:port_number(), #session{}) -> ok. invalidate_session(Host, Port, Session) -> + load_mitigation(), cast({invalidate_session, Host, Port, Session}). -spec invalidate_session(inet:port_number(), #session{}) -> ok. invalidate_session(Port, Session) -> + load_mitigation(), cast({invalidate_session, Port, Session}). -spec invalidate_pem(File::binary()) -> ok. @@ -719,3 +722,11 @@ start_session_validator(Cache, CacheCb, {invalidate_before, erlang:monotonic_time()}, undefined); invalidate_session_cache(Pid, _CacheCb, _Cache) -> Pid. + +load_mitigation() -> + MSec = rand:uniform(?LOAD_MITIGATION), + receive + after + MSec -> + continue + end.
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/src/tls_handshake.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/src/tls_handshake.erl
Changed
@@ -283,7 +283,8 @@ SupportedHashSigns; available_signature_algs(#hash_sign_algos{hash_sign_algos = ClientHashSigns}, SupportedHashSigns, _, {Major, Minor}) when (Major >= 3) andalso (Minor >= 3) -> - ordsets:intersection(ClientHashSigns, SupportedHashSigns); + sets:to_list(sets:intersection(sets:from_list(ClientHashSigns), + sets:from_list(SupportedHashSigns))); available_signature_algs(_, _, _, _) -> undefined.
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/test/ssl_basic_SUITE.erl -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/test/ssl_basic_SUITE.erl
Changed
@@ -145,7 +145,8 @@ versions_option, server_name_indication_option, accept_pool, - new_options_in_accept + new_options_in_accept, + prf ]. session_tests() -> @@ -324,6 +325,31 @@ ct:log("TLS/SSL version ~p~n ", [tls_record:supported_protocol_versions()]), ct:timetrap({seconds, 40}), Config; +init_per_testcase(prf, Config) -> + ct:log("TLS/SSL version ~p~n ", [tls_record:supported_protocol_versions()]), + ct:timetrap({seconds, 40}), + case ?config(tc_group_path, Config) of + [] -> Prop = []; + [Prop] -> Prop + end, + case ?config(name, Prop) of + undefined -> TlsVersions = [sslv3, tlsv1, 'tlsv1.1', 'tlsv1.2']; + TlsVersion when is_atom(TlsVersion) -> + TlsVersions = [TlsVersion] + end, + PRFS=[md5, sha, sha256, sha384, sha512], + %All are the result of running tls_v1:prf(PrfAlgo, <<>>, <<>>, <<>>, 16) + %with the specified PRF algorithm + ExpectedPrfResults= + [{md5, <<96,139,180,171,236,210,13,10,28,32,2,23,88,224,235,199>>}, + {sha, <<95,3,183,114,33,169,197,187,231,243,19,242,220,228,70,151>>}, + {sha256, <<166,249,145,171,43,95,158,232,6,60,17,90,183,180,0,155>>}, + {sha384, <<153,182,217,96,186,130,105,85,65,103,123,247,146,91,47,106>>}, + {sha512, <<145,8,98,38,243,96,42,94,163,33,53,49,241,4,127,28>>}, + %TLS 1.0 and 1.1 PRF: + {md5sha, <<63,136,3,217,205,123,200,177,251,211,17,229,132,4,173,80>>}], + TestPlan = prf_create_plan(TlsVersions, PRFS, ExpectedPrfResults), + [{prf_test_plan, TestPlan} | Config]; init_per_testcase(TestCase, Config) when TestCase == ssl_accept_timeout; TestCase == client_closes_socket; @@ -429,6 +455,25 @@ ssl_test_lib:close(Server), ssl_test_lib:close(Client). %%-------------------------------------------------------------------- +prf() -> + [{doc,"Test that ssl:prf/5 uses the negotiated PRF."}]. +prf(Config) when is_list(Config) -> + TestPlan = ?config(prf_test_plan, Config), + case TestPlan of + [] -> ct:fail({error, empty_prf_test_plan}); + _ -> lists:foreach(fun(Suite) -> + lists:foreach( + fun(Test) -> + V = ?config(tls_ver, Test), + C = ?config(ciphers, Test), + E = ?config(expected, Test), + P = ?config(prf, Test), + prf_run_test(Config, V, C, E, P) + end, Suite) + end, TestPlan) + end. + +%%-------------------------------------------------------------------- connection_info() -> [{doc,"Test the API function ssl:connection_information/1"}]. @@ -3662,8 +3707,84 @@ ssl_test_lib:close(Server), ssl_test_lib:close(Client). +prf_create_plan(TlsVersions, PRFs, Results) -> + lists:foldl(fun(Ver, Acc) -> + A = prf_ciphers_and_expected(Ver, PRFs, Results), + [A|Acc] + end, [], TlsVersions). +prf_ciphers_and_expected(TlsVer, PRFs, Results) -> + case TlsVer of + TlsVer when TlsVer == sslv3 orelse TlsVer == tlsv1 + orelse TlsVer == 'tlsv1.1' -> + Ciphers = ssl:cipher_suites(), + {_, Expected} = lists:keyfind(md5sha, 1, Results), + [[{tls_ver, TlsVer}, {ciphers, Ciphers}, {expected, Expected}, {prf, md5sha}]]; + 'tlsv1.2' -> + lists:foldl( + fun(PRF, Acc) -> + Ciphers = prf_get_ciphers(TlsVer, PRF), + case Ciphers of + [] -> + ct:log("No ciphers for PRF algorithm ~p. Skipping.", [PRF]), + Acc; + Ciphers -> + {_, Expected} = lists:keyfind(PRF, 1, Results), + [[{tls_ver, TlsVer}, {ciphers, Ciphers}, {expected, Expected}, + {prf, PRF}] | Acc] + end + end, [], PRFs) + end. +prf_get_ciphers(TlsVer, PRF) -> + case TlsVer of + 'tlsv1.2' -> + lists:filter( + fun(C) when tuple_size(C) == 4 andalso + element(4, C) == PRF -> + true; + (_) -> false + end, ssl:cipher_suites()) + end. +prf_run_test(_, TlsVer, [], _, Prf) -> + ct:fail({error, cipher_list_empty, TlsVer, Prf}); +prf_run_test(Config, TlsVer, Ciphers, Expected, Prf) -> + {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + BaseOpts = [{active, true}, {versions, [TlsVer]}, {ciphers, Ciphers}], + ServerOpts = BaseOpts ++ ?config(server_opts, Config), + ClientOpts = BaseOpts ++ ?config(client_opts, Config), + Server = ssl_test_lib:start_server( + [{node, ServerNode}, {port, 0}, {from, self()}, + {mfa, {?MODULE, prf_verify_value, [TlsVer, Expected, Prf]}}, + {options, ServerOpts}]), + Port = ssl_test_lib:inet_port(Server), + Client = ssl_test_lib:start_client( + [{node, ClientNode}, {port, Port}, + {host, Hostname}, {from, self()}, + {mfa, {?MODULE, prf_verify_value, [TlsVer, Expected, Prf]}}, + {options, ClientOpts}]), + ssl_test_lib:check_result(Server, ok, Client, ok), + ssl_test_lib:close(Server), + ssl_test_lib:close(Client). +prf_verify_value(Socket, TlsVer, Expected, Algo) -> + Ret = ssl:prf(Socket, <<>>, <<>>, [<<>>], 16), + case TlsVer of + sslv3 -> + case Ret of + {error, undefined} -> ok; + _ -> + {error, {expected, {error, undefined}, + got, Ret, tls_ver, TlsVer, prf_algorithm, Algo}} + end; + _ -> + case Ret of + {ok, Expected} -> ok; + {ok, Val} -> {error, {expected, Expected, got, Val, tls_ver, TlsVer, + prf_algorithm, Algo}} + end + end. + send_recv_result_timeout_client(Socket) -> {error, timeout} = ssl:recv(Socket, 11, 500), + {error, timeout} = ssl:recv(Socket, 11, 0), ssl:send(Socket, "Hello world"), receive Msg ->
View file
otp-OTP-18.3.3.tar.gz/lib/ssl/vsn.mk -> otp-OTP-18.3.4.4.tar.gz/lib/ssl/vsn.mk
Changed
@@ -1,1 +1,1 @@ -SSL_VSN = 7.3.2 +SSL_VSN = 7.3.3.1
View file
otp-OTP-18.3.3.tar.gz/lib/stdlib/test/ets_SUITE.erl -> otp-OTP-18.3.4.4.tar.gz/lib/stdlib/test/ets_SUITE.erl
Changed
@@ -49,6 +49,7 @@ fixtable_next/1, fixtable_insert/1, rename/1, rename_unnamed/1, evil_rename/1, update_element/1, update_counter/1, evil_update_counter/1, partly_bound/1, match_heavy/1]). -export([update_counter_with_default/1]). +-export([update_counter_table_growth/1]). -export([member/1]). -export([memory/1]). -export([select_fail/1]). @@ -102,6 +103,7 @@ heavy_lookup_element_do/1, member_do/1, otp_5340_do/1, otp_7665_do/1, meta_wb_do/1, do_heavy_concurrent/1, tab2file2_do/2, exit_large_table_owner_do/2, types_do/1, sleeper/0, memory_do/1, update_counter_with_default_do/1, + update_counter_table_growth_do/1, ms_tracee_dummy/1, ms_tracee_dummy/2, ms_tracee_dummy/3, ms_tracee_dummy/4 ]). @@ -141,6 +143,7 @@ rename, rename_unnamed, evil_rename, update_element, update_counter, evil_update_counter, update_counter_with_default, partly_bound, + update_counter_table_growth, match_heavy, {group, fold}, member, t_delete_object, t_init_table, t_whitebox, t_delete_all_objects, t_insert_list, t_test_ms, t_select_delete, t_ets_dets, @@ -2063,6 +2066,16 @@ ok. +update_counter_table_growth(_Config) -> + repeat_for_opts(update_counter_table_growth_do). + +update_counter_table_growth_do(Opts) -> + Set = ets_new(b, [set | Opts]), + [ets:update_counter(Set, N, {2, 1}, {N, 1}) || N <- lists:seq(1,10000)], + OrderedSet = ets_new(b, [ordered_set | Opts]), + [ets:update_counter(OrderedSet, N, {2, 1}, {N, 1}) || N <- lists:seq(1,10000)], + ok. + fixtable_next(doc) -> ["Check that a first-next sequence always works on a fixed table"]; fixtable_next(suite) ->
View file
otp-OTP-18.3.3.tar.gz/otp_versions.table -> otp-OTP-18.3.4.4.tar.gz/otp_versions.table
Changed
@@ -1,3 +1,8 @@ +OTP-18.3.4.4 : erts-7.3.1.2 # asn1-4.0.2 common_test-1.12.1.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 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 inets-6.2.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.2 ssl-7.3.3.1 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.4.3 : ssh-4.2.2.2 # asn1-4.0.2 common_test-1.12.1.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.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 inets-6.2.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 ssl-7.3.3.1 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.4.2 : common_test-1.12.1.1 erts-7.3.1.1 ssl-7.3.3.1 # 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 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 inets-6.2.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.1 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.4.1 : ssh-4.2.2.1 # 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 inets-6.2.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 ssl-7.3.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.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 : 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 :
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.