Hello community,
here is the log from the commit of package libssh for openSUSE:Factory
checked in at Tue Sep 6 15:35:37 CEST 2011.
--------
--- libssh/libssh.changes 2011-05-31 16:50:18.000000000 +0200
+++ /mounts/work_src_done/STABLE/libssh/libssh.changes 2011-09-06 05:38:22.000000000 +0200
@@ -1,0 +2,24 @@
+Tue Sep 6 03:36:48 UTC 2011 - crrodriguez@opensuse.org
+
+- Build with OPENSSL_LOAD_CONF so we respect user's choice
+ of which "openssl engine" to use for crypto (aes-ni,intel-accel)
+
+-------------------------------------------------------------------
+Tue Aug 9 15:12:39 UTC 2011 - asn@cryptomilk.org
+
+- Update to version 0.5.1
+ * Added checks for NULL pointers in string.c.
+ * Set the channel max packet size to 32768.
+ * Don't (de)compress empty buffers.
+ * Fixed ssh_scp_write so it works when doing recursive copy.
+ * Fixed another source of endless wait.
+ * Fixed an endless loop in case of a channel_open error.
+ * Fixed session timeout handling.
+ * Fixed ssh_channel_from_local() loop.
+ * Fixed permissions of scp example when we copy a file.
+ * Workaround ssh_get_user_home_dir on LDAP users.
+ * Added pkg-config support for libssh_threads.
+ * Fixed compilation without server and sftp modes.
+ * Fix static .lib overwriting on Windows.
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
Old:
----
libssh-0.5.0.tar.bz2
New:
----
libssh-0.5.1.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libssh.spec ++++++
--- /var/tmp/diff_new_pack.iJ8Kat/_old 2011-09-06 15:24:57.000000000 +0200
+++ /var/tmp/diff_new_pack.iJ8Kat/_new 2011-09-06 15:24:57.000000000 +0200
@@ -23,7 +23,7 @@
BuildRequires: cmake doxygen gcc-c++ openssl-devel
License: LGPL v2.1 or later
Group: System/Libraries
-Version: 0.5.0
+Version: 0.5.1
Release: 1
Summary: SSH library
Source0: %{name}-%{version}.tar.bz2
@@ -119,7 +119,7 @@
fi
pushd build
cmake \
- -DCMAKE_C_FLAGS:STRING="%{optflags}" \
+ -DCMAKE_C_FLAGS:STRING="%{optflags} -DOPENSSL_LOAD_CONF" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_SKIP_RPATH=ON \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
@@ -162,6 +162,7 @@
%{_libdir}/libssh.so
%{_libdir}/libssh_threads.so
%{_libdir}/pkgconfig/libssh.pc
+%{_libdir}/pkgconfig/libssh_threads.pc
%files devel-doc
%defattr(-,root,root)
++++++ libssh-0.5.0.tar.bz2 -> libssh-0.5.1.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/CMakeLists.txt new/libssh-0.5.1/CMakeLists.txt
--- old/libssh-0.5.0/CMakeLists.txt 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/CMakeLists.txt 2011-08-09 14:48:21.000000000 +0200
@@ -8,7 +8,7 @@
set(APPLICATION_VERSION_MAJOR "0")
set(APPLICATION_VERSION_MINOR "5")
-set(APPLICATION_VERSION_PATCH "0")
+set(APPLICATION_VERSION_PATCH "1")
set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}")
@@ -19,7 +19,7 @@
# Increment AGE. Set REVISION to 0
# If the source code was changed, but there were no interface changes:
# Increment REVISION.
-set(LIBRARY_VERSION "4.2.0")
+set(LIBRARY_VERSION "4.2.1")
set(LIBRARY_SOVERSION "4")
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
@@ -78,9 +78,11 @@
# pkg-config file
configure_file(libssh.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc)
+configure_file(libssh_threads.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh_threads.pc)
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/libssh.pc
+ ${CMAKE_CURRENT_BINARY_DIR}/libssh_threads.pc
DESTINATION
${LIB_INSTALL_DIR}/pkgconfig
COMPONENT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/CPackConfig.cmake new/libssh-0.5.1/CPackConfig.cmake
--- old/libssh-0.5.0/CPackConfig.cmake 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/CPackConfig.cmake 2011-08-09 14:48:21.000000000 +0200
@@ -13,7 +13,7 @@
### versions
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "5")
-set(CPACK_PACKAGE_VERSION_PATCH "0")
+set(CPACK_PACKAGE_VERSION_PATCH "1")
set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/ChangeLog new/libssh-0.5.1/ChangeLog
--- old/libssh-0.5.0/ChangeLog 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/ChangeLog 2011-08-09 14:48:21.000000000 +0200
@@ -1,6 +1,21 @@
ChangeLog
==========
+version 0.5.1 (released 2011-08-09)
+ * Added checks for NULL pointers in string.c.
+ * Set the channel max packet size to 32768.
+ * Don't (de)compress empty buffers.
+ * Fixed ssh_scp_write so it works when doing recursive copy.
+ * Fixed another source of endless wait.
+ * Fixed an endless loop in case of a channel_open error.
+ * Fixed session timeout handling.
+ * Fixed ssh_channel_from_local() loop.
+ * Fixed permissions of scp example when we copy a file.
+ * Workaround ssh_get_user_home_dir on LDAP users.
+ * Added pkg-config support for libssh_threads.
+ * Fixed compilation without server and sftp modes.
+ * Fix static .lib overwriting on Windows.
+
version 0.5.0 (released 2011-06-01)
* Added ssh_ prefix to all functions.
* Added complete Windows support.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/ConfigureChecks.cmake new/libssh-0.5.1/ConfigureChecks.cmake
--- old/libssh-0.5.0/ConfigureChecks.cmake 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/ConfigureChecks.cmake 2011-08-09 14:48:21.000000000 +0200
@@ -119,6 +119,7 @@
check_function_exists(select HAVE_SELECT)
check_function_exists(cfmakeraw HAVE_CFMAKERAW)
check_function_exists(regcomp HAVE_REGCOMP)
+ check_function_exists(ntohll HAVE_NTOHLL)
endif (UNIX)
set(LIBSSH_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "libssh required system libraries")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/config.h.cmake new/libssh-0.5.1/config.h.cmake
--- old/libssh-0.5.0/config.h.cmake 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/config.h.cmake 2011-08-09 14:48:21.000000000 +0200
@@ -80,6 +80,9 @@
/* Define to 1 if you have the `clock_gettime' function. */
#cmakedefine HAVE_CLOCK_GETTIME 1
+/* Define to 1 if you have the `ntohll' function. */
+#cmakedefine HAVE_NTOHLL 1
+
/*************************** LIBRARIES ***************************/
/* Define to 1 if you have the `crypto' library (-lcrypto). */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/examples/libssh_scp.c new/libssh-0.5.1/examples/libssh_scp.c
--- old/libssh-0.5.0/examples/libssh_scp.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/examples/libssh_scp.c 2011-08-09 14:48:21.000000000 +0200
@@ -182,7 +182,7 @@
fd=fileno(src->file);
fstat(fd,&s);
size=s.st_size;
- mode = s.st_mode & S_IFMT;
+ mode = s.st_mode & ~S_IFMT;
filename=ssh_basename(src->path);
} else {
size=0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/include/libssh/libssh.h new/libssh-0.5.1/include/libssh/libssh.h
--- old/libssh-0.5.0/include/libssh/libssh.h 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/include/libssh/libssh.h 2011-08-09 14:48:21.000000000 +0200
@@ -79,7 +79,7 @@
/* libssh version */
#define LIBSSH_VERSION_MAJOR 0
#define LIBSSH_VERSION_MINOR 5
-#define LIBSSH_VERSION_MICRO 0
+#define LIBSSH_VERSION_MICRO 1
#define LIBSSH_VERSION_INT SSH_VERSION_INT(LIBSSH_VERSION_MAJOR, \
LIBSSH_VERSION_MINOR, \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/libssh_threads.pc.cmake new/libssh-0.5.1/libssh_threads.pc.cmake
--- old/libssh-0.5.0/libssh_threads.pc.cmake 1970-01-01 01:00:00.000000000 +0100
+++ new/libssh-0.5.1/libssh_threads.pc.cmake 2011-08-09 14:48:21.000000000 +0200
@@ -0,0 +1,5 @@
+Name: ${APPLICATION_NAME}_threads
+Description: The SSH Library Thread Extension
+Version: ${APPLICATION_VERSION}
+Libs: -L${LIB_INSTALL_DIR} -lssh_threads
+Cflags: -I${INCLUDE_INSTALL_DIR}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/CMakeLists.txt new/libssh-0.5.1/src/CMakeLists.txt
--- old/libssh-0.5.0/src/CMakeLists.txt 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/CMakeLists.txt 2011-08-09 14:48:21.000000000 +0200
@@ -184,6 +184,11 @@
if (WITH_STATIC_LIB)
add_library(${LIBSSH_STATIC_LIBRARY} STATIC ${libssh_SRCS})
+ if (MSVC)
+ set(OUTPUT_SUFFIX static)
+ else (MSVC)
+ set(OUTPUT_SUFFIX )
+ endif (MSVC)
set_target_properties(
${LIBSSH_STATIC_LIBRARY}
PROPERTIES
@@ -193,6 +198,8 @@
${LIBRARY_SOVERSION}
OUTPUT_NAME
ssh
+ ARCHIVE_OUTPUT_DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_SUFFIX}
)
if (WIN32)
@@ -208,7 +215,7 @@
TARGETS
${LIBSSH_STATIC_LIBRARY}
DESTINATION
- ${LIB_INSTALL_DIR}
+ ${LIB_INSTALL_DIR}/${OUTPUT_SUFFIX}
COMPONENT
libraries
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/auth.c new/libssh-0.5.1/src/auth.c
--- old/libssh-0.5.0/src/auth.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/auth.c 2011-08-09 14:48:21.000000000 +0200
@@ -62,23 +62,23 @@
* again is necessary
*/
static int ask_userauth(ssh_session session) {
- int rc = 0;
+ int rc = 0;
- enter_function();
- do {
- rc=ssh_service_request(session,"ssh-userauth");
- if(ssh_is_blocking(session)){
- if(rc==SSH_AGAIN)
- ssh_handle_packets(session,-1);
- } else {
- /* nonblocking */
- ssh_handle_packets(session,0);
- rc=ssh_service_request(session,"ssh-userauth");
- break;
- }
- } while(rc==SSH_AGAIN);
- leave_function();
- return rc;
+ enter_function();
+ do {
+ rc = ssh_service_request(session,"ssh-userauth");
+ if (ssh_is_blocking(session)) {
+ if(rc == SSH_AGAIN)
+ ssh_handle_packets(session, -2);
+ } else {
+ /* nonblocking */
+ ssh_handle_packets(session, 0);
+ rc = ssh_service_request(session, "ssh-userauth");
+ break;
+ }
+ } while (rc == SSH_AGAIN);
+ leave_function();
+ return rc;
}
/**
@@ -254,7 +254,7 @@
enter_function();
if(ssh_is_blocking(session)){
- if(ssh_handle_packets_termination(session,-1,auth_status_termination,
+ if(ssh_handle_packets_termination(session, -2, auth_status_termination,
session) == SSH_ERROR){
leave_function();
return SSH_AUTH_ERROR;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/auth1.c new/libssh-0.5.1/src/auth1.c
--- old/libssh-0.5.0/src/auth1.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/auth1.c 2011-08-09 14:48:21.000000000 +0200
@@ -38,7 +38,7 @@
enter_function();
/* wait for a packet */
while(session->auth_state == SSH_AUTH_STATE_NONE)
- if (ssh_handle_packets(session,-1) != SSH_OK)
+ if (ssh_handle_packets(session, -2) != SSH_OK)
break;
ssh_log(session,SSH_LOG_PROTOCOL,"Auth state : %d",session->auth_state);
leave_function();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/channels.c new/libssh-0.5.1/src/channels.c
--- old/libssh-0.5.0/src/channels.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/channels.c 2011-08-09 14:48:21.000000000 +0200
@@ -48,6 +48,14 @@
#define WINDOWBASE 128000
#define WINDOWLIMIT (WINDOWBASE/2)
+/*
+ * All implementations MUST be able to process packets with an
+ * uncompressed payload length of 32768 bytes or less and a total packet
+ * size of 35000 bytes or less.
+ */
+#define CHANNEL_MAX_PACKET 32768
+#define CHANNEL_INITIAL_WINDOW 64000
+
/**
* @defgroup libssh_channel The SSH channel functions
* @ingroup libssh
@@ -284,7 +292,11 @@
/* Todo: fix this into a correct loop */
/* wait until channel is opened by server */
while(channel->state == SSH_CHANNEL_STATE_NOT_OPEN){
- ssh_handle_packets(session,-1);
+ ssh_handle_packets(session, -2);
+ if (session->session_state == SSH_SESSION_STATE_ERROR) {
+ err = SSH_ERROR;
+ break;
+ }
}
if(channel->state == SSH_CHANNEL_STATE_OPEN)
err=SSH_OK;
@@ -292,24 +304,25 @@
return err;
}
-/* get ssh channel from local session? */
+/* return channel with corresponding local id, or NULL if not found */
ssh_channel ssh_channel_from_local(ssh_session session, uint32_t id) {
- ssh_channel initchan = session->channels;
- ssh_channel channel;
-
- /* We assume we are always the local */
- if (initchan == NULL) {
- return NULL;
- }
+ ssh_channel initchan = session->channels;
+ ssh_channel channel = initchan;
- for (channel = initchan; channel->local_channel != id;
- channel=channel->next) {
- if (channel->next == initchan) {
- return NULL;
+ for (;;) {
+ if (channel == NULL) {
+ return NULL;
+ }
+ if (channel->local_channel == id) {
+ return channel;
+ }
+ if (channel->next == initchan) {
+ return NULL;
+ }
+ channel = channel->next;
}
- }
- return channel;
+ return NULL;
}
/**
@@ -877,7 +890,11 @@
}
#endif
- return channel_open(channel,"session",64000,32000,NULL);
+ return channel_open(channel,
+ "session",
+ CHANNEL_INITIAL_WINDOW,
+ CHANNEL_MAX_PACKET,
+ NULL);
}
/**
@@ -952,7 +969,11 @@
goto error;
}
- rc = channel_open(channel, "direct-tcpip", 64000, 32000, payload);
+ rc = channel_open(channel,
+ "direct-tcpip",
+ CHANNEL_INITIAL_WINDOW,
+ CHANNEL_MAX_PACKET,
+ payload);
error:
ssh_buffer_free(payload);
@@ -1404,7 +1425,12 @@
return SSH_OK;
}
while(channel->request_state == SSH_CHANNEL_REQ_STATE_PENDING){
- ssh_handle_packets(session,-1);
+ ssh_handle_packets(session, -2);
+ if(session->session_state == SSH_SESSION_STATE_ERROR) {
+ channel->request_state = SSH_CHANNEL_REQ_STATE_ERROR;
+ break;
+ }
+
}
/* we received something */
switch (channel->request_state){
@@ -1721,7 +1747,7 @@
for (t = timeout_ms; t >= 0; t -= 50)
{
- ssh_handle_packets(session,50);
+ ssh_handle_packets(session, 50);
if (session->ssh_message_list) {
iterator = ssh_list_get_iterator(session->ssh_message_list);
@@ -1878,7 +1904,7 @@
return SSH_OK;
}
while(session->global_req_state == SSH_CHANNEL_REQ_STATE_PENDING){
- rc=ssh_handle_packets(session,-1);
+ rc=ssh_handle_packets(session, -2);
if(rc==SSH_ERROR){
session->global_req_state = SSH_CHANNEL_REQ_STATE_ERROR;
break;
@@ -2262,7 +2288,7 @@
leave_function();
return 0;
}
- ssh_handle_packets(channel->session, -1);
+ ssh_handle_packets(channel->session, -2);
} while (r == 0);
}
while(total < count){
@@ -2360,7 +2386,7 @@
break;
}
- ssh_handle_packets(session,-1);
+ ssh_handle_packets(session, -2);
}
len = buffer_get_rest_len(stdbuf);
@@ -2450,7 +2476,7 @@
}
if (buffer_get_rest_len(stdbuf) == 0 && channel->remote_eof == 0) {
- if (ssh_handle_packets(channel->session,0)==SSH_ERROR) {
+ if (ssh_handle_packets(channel->session, 0)==SSH_ERROR) {
leave_function();
return SSH_ERROR;
}
@@ -2497,7 +2523,7 @@
while ((channel->remote_eof == 0 || channel->exit_status == -1) && channel->session->alive) {
/* Parse every incoming packet */
- if (ssh_handle_packets(channel->session,-1) != SSH_OK) {
+ if (ssh_handle_packets(channel->session, -2) != SSH_OK) {
return -1;
}
/* XXX We should actually wait for a close packet and not a close
@@ -2532,7 +2558,7 @@
chan = rchans[i];
while (ssh_channel_is_open(chan) && ssh_socket_data_available(chan->session->socket)) {
- ssh_handle_packets(chan->session,-1);
+ ssh_handle_packets(chan->session, -2);
}
if ((chan->stdout_buffer && buffer_get_rest_len(chan->stdout_buffer) > 0) ||
@@ -2803,7 +2829,11 @@
goto error;
}
- rc = channel_open(channel, "forwarded-tcpip", 64000, 32000, payload);
+ rc = channel_open(channel,
+ "forwarded-tcpip",
+ CHANNEL_INITIAL_WINDOW,
+ CHANNEL_MAX_PACKET,
+ payload);
error:
ssh_buffer_free(payload);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/client.c new/libssh-0.5.1/src/client.c
--- old/libssh-0.5.0/src/client.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/client.c 2011-08-09 14:48:21.000000000 +0200
@@ -684,19 +684,21 @@
session->alive = 1;
ssh_log(session,SSH_LOG_PROTOCOL,"Socket connecting, now waiting for the callbacks to work");
pending:
- session->pending_call_state=SSH_PENDING_CALL_CONNECT;
- if(ssh_is_blocking(session)) {
- int timeout = session->timeout * 1000 + session->timeout_usec;
- if (timeout <= 0)
- timeout = -1;
- ssh_handle_packets_termination(session,timeout,ssh_connect_termination,session);
- if(!ssh_connect_termination(session)){
- ssh_set_error(session,SSH_FATAL,"Timeout connecting to %s",session->host);
- session->session_state = SSH_SESSION_STATE_ERROR;
- }
- }
+ session->pending_call_state=SSH_PENDING_CALL_CONNECT;
+ if(ssh_is_blocking(session)) {
+ int timeout = (session->timeout * 1000) + (session->timeout_usec / 1000);
+ if (timeout == 0) {
+ timeout = 10 * 1000;
+ }
+ ssh_log(session,SSH_LOG_PACKET,"ssh_connect: Actual timeout : %d", timeout);
+ ssh_handle_packets_termination(session, timeout, ssh_connect_termination, session);
+ if(!ssh_connect_termination(session)){
+ ssh_set_error(session,SSH_FATAL,"Timeout connecting to %s",session->host);
+ session->session_state = SSH_SESSION_STATE_ERROR;
+ }
+ }
else
- ssh_handle_packets_termination(session,0,ssh_connect_termination, session);
+ ssh_handle_packets_termination(session, 0, ssh_connect_termination, session);
ssh_log(session,SSH_LOG_PACKET,"ssh_connect: Actual state : %d",session->session_state);
if(!ssh_is_blocking(session) && !ssh_connect_termination(session)){
leave_function();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/kex.c new/libssh-0.5.1/src/kex.c
--- old/libssh-0.5.0/src/kex.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/kex.c 2011-08-09 14:48:21.000000000 +0200
@@ -814,14 +814,14 @@
ssh_log(session, SSH_LOG_PROTOCOL, "Waiting for a SSH_SMSG_PUBLIC_KEY");
/* Here the callback is called */
while(session->session_state==SSH_SESSION_STATE_INITIAL_KEX){
- ssh_handle_packets(session,-1);
+ ssh_handle_packets(session, -2);
}
if(session->session_state==SSH_SESSION_STATE_ERROR)
goto error;
ssh_log(session, SSH_LOG_PROTOCOL, "Waiting for a SSH_SMSG_SUCCESS");
/* Waiting for SSH_SMSG_SUCCESS */
while(session->session_state==SSH_SESSION_STATE_KEXINIT_RECEIVED){
- ssh_handle_packets(session,-1);
+ ssh_handle_packets(session, -2);
}
if(session->session_state==SSH_SESSION_STATE_ERROR)
goto error;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/messages.c new/libssh-0.5.1/src/messages.c
--- old/libssh-0.5.0/src/messages.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/messages.c 2011-08-09 14:48:21.000000000 +0200
@@ -69,6 +69,26 @@
return msg;
}
+#ifndef WITH_SERVER
+
+/* Reduced version of the reply default that only reply with
+ * SSH_MSG_UNIMPLEMENTED
+ */
+static int ssh_message_reply_default(ssh_message msg) {
+ ssh_log(msg->session, SSH_LOG_FUNCTIONS, "Reporting unknown packet");
+
+ if (buffer_add_u8(msg->session->out_buffer, SSH2_MSG_UNIMPLEMENTED) < 0)
+ goto error;
+ if (buffer_add_u32(msg->session->out_buffer,
+ htonl(msg->session->recv_seq-1)) < 0)
+ goto error;
+ return packet_send(msg->session);
+ error:
+ return SSH_ERROR;
+}
+
+#endif
+
static int ssh_execute_message_callback(ssh_session session, ssh_message msg) {
int ret;
if(session->ssh_message_callback != NULL) {
@@ -161,7 +181,7 @@
session->ssh_message_list = ssh_list_new();
}
do {
- if (ssh_handle_packets(session,-1) == SSH_ERROR) {
+ if (ssh_handle_packets(session, -2) == SSH_ERROR) {
leave_function();
return NULL;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/misc.c new/libssh-0.5.1/src/misc.c
--- old/libssh-0.5.0/src/misc.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/misc.c 2011-08-09 14:48:21.000000000 +0200
@@ -215,7 +215,8 @@
rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);
if (rc != 0) {
- return NULL;
+ szPath=getenv("HOME");
+ return szPath ? strdup(szPath) : NULL;
}
szPath = strdup(pwd.pw_dir);
@@ -286,18 +287,20 @@
#endif /* _WIN32 */
+#ifndef HAVE_NTOHLL
uint64_t ntohll(uint64_t a) {
#ifdef WORDS_BIGENDIAN
return a;
-#else
+#else /* WORDS_BIGENDIAN */
uint32_t low = (uint32_t)(a & 0xffffffff);
uint32_t high = (uint32_t)(a >> 32);
low = ntohl(low);
high = ntohl(high);
return ((((uint64_t) low) << 32) | ( high));
-#endif
+#endif /* WORDS_BIGENDIAN */
}
+#endif /* HAVE_NTOHLL */
char *ssh_lowercase(const char* str) {
char *new, *p;
@@ -937,15 +940,15 @@
* @param[in] ts pointer to an existing timestamp
* @param[in] timeout timeout in milliseconds. Negative values mean infinite
* timeout
- * @returns remaining time in milliseconds, 0 if elapsed, -1 if never.
+ * @returns remaining time in milliseconds, 0 if elapsed, -1 if never,
+ * -2 if option-set-timeout.
*/
int ssh_timeout_update(struct ssh_timestamp *ts, int timeout){
struct ssh_timestamp now;
int ms, ret;
- if(timeout == 0)
- return 0;
- if(timeout==-1)
- return -1;
+ if (timeout <= 0) {
+ return timeout;
+ }
ssh_timestamp_init(&now);
ms = ssh_timestamp_difference(ts,&now);
if(ms < 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/packet.c new/libssh-0.5.1/src/packet.c
--- old/libssh-0.5.0/src/packet.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/packet.c 2011-08-09 14:48:21.000000000 +0200
@@ -255,7 +255,9 @@
"After padding, %d bytes left in buffer",
buffer_get_rest_len(session->in_buffer));
#if defined(HAVE_LIBZ) && defined(WITH_LIBZ)
- if (session->current_crypto && session->current_crypto->do_compress_in) {
+ if (session->current_crypto
+ && session->current_crypto->do_compress_in
+ && buffer_get_rest_len(session->in_buffer)) {
ssh_log(session, SSH_LOG_PACKET, "Decompressing in_buffer ...");
if (decompress_buffer(session, session->in_buffer,MAX_PACKET_LEN) < 0) {
goto error;
@@ -457,7 +459,9 @@
"Writing on the wire a packet having %u bytes before", currentlen);
#if defined(HAVE_LIBZ) && defined(WITH_LIBZ)
- if (session->current_crypto && session->current_crypto->do_compress_out) {
+ if (session->current_crypto
+ && session->current_crypto->do_compress_out
+ && buffer_get_rest_len(session->out_buffer)) {
ssh_log(session, SSH_LOG_PACKET, "Compressing out_buffer ...");
if (compress_buffer(session,session->out_buffer) < 0) {
goto error;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/poll.c new/libssh-0.5.1/src/poll.c
--- old/libssh-0.5.0/src/poll.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/poll.c 2011-08-09 14:48:21.000000000 +0200
@@ -608,11 +608,16 @@
if (!ctx->pollfds[i].revents) {
i++;
} else {
+ int ret;
+
p = ctx->pollptrs[i];
fd = ctx->pollfds[i].fd;
revents = ctx->pollfds[i].revents;
- if (p->cb(p, fd, revents, p->cb_data) < 0) {
+ if (p->cb && (ret = p->cb(p, fd, revents, p->cb_data)) < 0) {
+ if (ret == -2) {
+ return -1;
+ }
/* the poll was removed, reload the used counter and start again */
used = ctx->polls_used;
i=0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/scp.c new/libssh-0.5.1/src/scp.c
--- old/libssh-0.5.0/src/scp.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/scp.c 2011-08-09 14:48:21.000000000 +0200
@@ -380,8 +380,8 @@
*/
int ssh_scp_write(ssh_scp scp, const void *buffer, size_t len){
int w;
- //int r;
- //uint8_t code;
+ int r;
+ uint8_t code;
if(scp==NULL)
return SSH_ERROR;
if(scp->state != SSH_SCP_WRITE_WRITING){
@@ -400,19 +400,27 @@
//return=channel_get_exit_status(scp->channel);
return SSH_ERROR;
}
- /* Check if we arrived at end of file */
- if(scp->processed == scp->filelen) {
-/* r=channel_read(scp->channel,&code,1,0);
- if(r==SSH_ERROR){
- scp->state=SSH_SCP_ERROR;
+ /* Far end sometimes send a status message, which we need to read
+ * and handle */
+ r = ssh_channel_poll(scp->channel,0);
+ if(r > 0){
+ r = ssh_channel_read(scp->channel, &code, 1, 0);
+ if(r == SSH_ERROR){
+ return SSH_ERROR;
+ }
+ if(code == 1 || code == 2){
+ ssh_set_error(scp->session,SSH_REQUEST_DENIED, "SCP: Error: status code %i received", code);
return SSH_ERROR;
}
- if(code != 0){
- ssh_set_error(scp->session,SSH_FATAL, "scp status code %ud not valid", code);
- scp->state=SSH_SCP_ERROR;
+ }
+ /* Check if we arrived at end of file */
+ if(scp->processed == scp->filelen) {
+ code = 0;
+ w = ssh_channel_write(scp->channel, &code, 1);
+ if(w == SSH_ERROR){
+ scp->state = SSH_SCP_ERROR;
return SSH_ERROR;
}
-*/
scp->processed=scp->filelen=0;
scp->state=SSH_SCP_WRITE_INITED;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/server.c new/libssh-0.5.1/src/server.c
--- old/libssh-0.5.0/src/server.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/server.c 2011-08-09 14:48:21.000000000 +0200
@@ -479,7 +479,7 @@
* loop until SSH_SESSION_STATE_BANNER_RECEIVED or
* SSH_SESSION_STATE_ERROR
*/
- ssh_handle_packets(session,-1);
+ ssh_handle_packets(session, -2);
ssh_log(session,SSH_LOG_PACKET, "ssh_handle_key_exchange: Actual state : %d",
session->session_state);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/session.c new/libssh-0.5.1/src/session.c
--- old/libssh-0.5.0/src/session.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/session.c 2011-08-09 14:48:21.000000000 +0200
@@ -404,6 +404,17 @@
ssh_socket_set_except(session->socket);
}
+static int ssh_make_milliseconds(long sec, long usec) {
+ int res = usec ? (usec / 1000) : 0;
+ res += (sec * 1000);
+ if (res == 0) {
+ res = 10 * 1000; /* use a reasonable default value in case
+ * SSH_OPTIONS_TIMEOUT is not set in options. */
+ }
+
+ return res;
+}
+
/**
* @internal
*
@@ -415,38 +426,56 @@
* @param[in] session The session handle to use.
*
* @param[in] timeout Set an upper limit on the time for which this function
- * will block, in milliseconds. Specifying a negative value
- * means an infinite timeout. This parameter is passed to
- * the poll() function.
+ * will block, in milliseconds. Specifying -1
+ * means an infinite timeout.
+ * Specifying -2 means to use the timeout specified in
+ * options. 0 means poll will return immediately. This
+ * parameter is passed to the poll() function.
*
* @return SSH_OK on success, SSH_ERROR otherwise.
*/
int ssh_handle_packets(ssh_session session, int timeout) {
- ssh_poll_handle spoll_in,spoll_out;
- ssh_poll_ctx ctx;
- int rc;
- if(session==NULL || session->socket==NULL)
- return SSH_ERROR;
- enter_function();
- spoll_in=ssh_socket_get_poll_handle_in(session->socket);
- spoll_out=ssh_socket_get_poll_handle_out(session->socket);
- if(session->server)
- ssh_poll_add_events(spoll_in, POLLIN);
- ctx=ssh_poll_get_ctx(spoll_in);
- if(ctx==NULL){
- ctx=ssh_poll_get_default_ctx(session);
- ssh_poll_ctx_add(ctx,spoll_in);
- if(spoll_in != spoll_out)
- ssh_poll_ctx_add(ctx,spoll_out);
- }
- rc = ssh_poll_ctx_dopoll(ctx,timeout);
- if(rc == SSH_ERROR)
- session->session_state = SSH_SESSION_STATE_ERROR;
- leave_function();
- if (session->session_state != SSH_SESSION_STATE_ERROR)
- return SSH_OK;
- else
- return SSH_ERROR;
+ ssh_poll_handle spoll_in,spoll_out;
+ ssh_poll_ctx ctx;
+ int tm = timeout;
+ int rc;
+
+ if (session == NULL || session->socket == NULL) {
+ return SSH_ERROR;
+ }
+ enter_function();
+
+ spoll_in = ssh_socket_get_poll_handle_in(session->socket);
+ spoll_out = ssh_socket_get_poll_handle_out(session->socket);
+ if (session->server) {
+ ssh_poll_add_events(spoll_in, POLLIN);
+ }
+ ctx = ssh_poll_get_ctx(spoll_in);
+
+ if (!ctx) {
+ ctx = ssh_poll_get_default_ctx(session);
+ ssh_poll_ctx_add(ctx, spoll_in);
+ if (spoll_in != spoll_out) {
+ ssh_poll_ctx_add(ctx, spoll_out);
+ }
+ }
+
+ if (timeout == -2) {
+ tm = ssh_make_milliseconds(session->timeout, session->timeout_usec);
+ }
+ rc = ssh_poll_ctx_dopoll(ctx, tm);
+
+ if (rc == SSH_ERROR) {
+ session->session_state = SSH_SESSION_STATE_ERROR;
+ }
+
+ leave_function();
+
+ if (session->session_state == SSH_SESSION_STATE_ERROR) {
+ return SSH_ERROR;
+ }
+
+ return SSH_OK;
}
/**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/socket.c new/libssh-0.5.1/src/socket.c
--- old/libssh-0.5.0/src/socket.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/socket.c 2011-08-09 14:48:21.000000000 +0200
@@ -246,32 +246,34 @@
s->read_wontblock=1;
r=ssh_socket_unbuffered_read(s,buffer,sizeof(buffer));
if(r<0){
- if(p != NULL) {
- ssh_poll_remove_events(p, POLLIN);
- }
+ if(p != NULL) {
+ ssh_poll_remove_events(p, POLLIN);
+ }
if(s->callbacks && s->callbacks->exception){
s->callbacks->exception(
SSH_SOCKET_EXCEPTION_ERROR,
s->last_errno,s->callbacks->userdata);
- /* p may have been freed, so don't use it
- * anymore in this function */
- p = NULL;
+ /* p may have been freed, so don't use it
+ * anymore in this function */
+ p = NULL;
+ return -2;
}
}
if(r==0){
- if(p != NULL) {
- ssh_poll_remove_events(p, POLLIN);
- }
- if(p != NULL) {
- ssh_poll_remove_events(p, POLLIN);
- }
+ if(p != NULL) {
+ ssh_poll_remove_events(p, POLLIN);
+ }
+ if(p != NULL) {
+ ssh_poll_remove_events(p, POLLIN);
+ }
if(s->callbacks && s->callbacks->exception){
s->callbacks->exception(
SSH_SOCKET_EXCEPTION_EOF,
0,s->callbacks->userdata);
- /* p may have been freed, so don't use it
- * anymore in this function */
- p = NULL;
+ /* p may have been freed, so don't use it
+ * anymore in this function */
+ p = NULL;
+ return -2;
}
}
if(r>0){
@@ -282,9 +284,9 @@
buffer_get_rest_len(s->in_buffer),
s->callbacks->userdata);
buffer_pass_bytes(s->in_buffer,r);
- /* p may have been freed, so don't use it
- * anymore in this function */
- p = NULL;
+ /* p may have been freed, so don't use it
+ * anymore in this function */
+ p = NULL;
}
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libssh-0.5.0/src/string.c new/libssh-0.5.1/src/string.c
--- old/libssh-0.5.0/src/string.c 2011-05-31 16:29:52.000000000 +0200
+++ new/libssh-0.5.1/src/string.c 2011-08-09 14:48:21.000000000 +0200
@@ -21,6 +21,7 @@
* MA 02111-1307, USA.
*/
+#include