Forráskód Böngészése

Since OSX's SMBX server doesn't honor our buffer size request, we now grow the reception buffer as needed, closes #24

Julien 'Lta' BALLET 10 éve
szülő
commit
166f11b3e3

+ 2 - 0
include/bdsm/debug.h

@@ -19,6 +19,8 @@
 #ifndef __BDSM_DEBUG_H__
 # define __BDSM_DEBUG_H__
 
+# include "config.h"
+
 # ifdef BDSM_DEBUG
 #  include <stdio.h>
 #  define BDSM_dbg(...) fprintf(stderr, __VA_ARGS__)

+ 3 - 3
include/bdsm/smb_defs.h

@@ -26,14 +26,14 @@
 
 #include <bdsm/smb_packets.h>
 
-#define SMB_IO_BUFSIZE    (2 >> 16)
+#define SMB_DEFAULT_BUFSIZE     (8192)
 
 enum
 {
     /// SMB with Direct-TCP connection (OSX supports only this)
-    SMB_TRANSPORT_TCP       = 1,
+    SMB_TRANSPORT_TCP	        = 1,
     /// SMB with Netbios over TCP (older mechanism)
-    SMB_TRANSPORT_NBT       = 2
+    SMB_TRANSPORT_NBT	        = 2
 };
 
 //-----------------------------------------------------------------------------/

+ 3 - 5
include/bdsm/smb_session.h

@@ -56,11 +56,9 @@
  */
 #define SMB_FD(tid, fid)  ((((smb_fd)tid) << 16) | (((smb_fd) fid)))
 
-#define SMB_SESSION_MAX_BUFFER (SMB_IO_BUFSIZE                    \
-                                - sizeof(smb_header)              \
-                                - sizeof(netbios_session_packet)  \
-                                - sizeof(smb_packet))
-
+/* Our reception buffer grows as necessary, so we can put the max here */
+#define SMB_SESSION_MAX_BUFFER (0xffff)
+ 
 /**
  * @brief Allocates a new Session object
  * @details To be able to perform actions on shares and file, you'll need to

+ 35 - 6
src/netbios_session.c

@@ -44,6 +44,25 @@ error:
     return (0);
 }
 
+static int	session_buffer_realloc(netbios_session *s, size_t new_size)
+{
+    void        *new_ptr;
+
+    assert(s != NULL);
+
+    /* BDSM_dbg("session_buffer_realloc: from %ld bytes to %ld bytes\n", */
+    /* 	     s->packet_payload_size, new_size); */
+
+    new_ptr  = realloc(s->packet, new_size);
+    if (new_ptr != NULL)
+    {
+        s->packet_payload_size = new_size;
+        s->packet = new_ptr;
+	return (1);
+    }
+    return (0);
+}
+
 netbios_session *netbios_session_new(size_t buf_size)
 {
     netbios_session   *session;
@@ -187,16 +206,26 @@ ssize_t           netbios_session_packet_recv(netbios_session *s, void **data)
         perror("netbios_session_packet_recv: ");
         return (-1);
     }
-
-    if ((size_t)res > sizeof(netbios_session_packet) && data != NULL)
-        *data = (void *)s->packet->payload;
-    else if (data != NULL)
-        *data = NULL;
-
+    if ((size_t)res < sizeof(netbios_session_packet))
+    {
+        BDSM_dbg("netbios_session_packet_recv: packet received too small: %ld bytes",
+	         res);
+	if (data != NULL) 
+             *data = NULL;
+	return (-1);
+    }
+  
     total  = ntohs(s->packet->length);
     total |= (s->packet->flags & 0x01) << 16;
     sofar  = res - sizeof(netbios_session_packet);
 
+    if (total + sizeof(netbios_session_packet) > s->packet_payload_size)
+        if (!session_buffer_realloc(s, total + sizeof(netbios_session_packet)))
+            return (-1);
+
+    if (data != NULL)
+      *data = (void *) s->packet->payload;
+
     //fprintf(stderr, "Total = %ld, sofar = %ld\n", total, sofar);
 
     while (sofar < total)

+ 3 - 3
src/smb_file.c

@@ -137,8 +137,8 @@ ssize_t   smb_fread(smb_session *s, smb_fd fd, void *buf, size_t buf_size)
     smb_message     *req_msg, resp_msg;
     smb_read_req    *req;
     smb_read_resp   *resp;
-    size_t            max_read;
-    int               res;
+    size_t          max_read;
+    int             res;
 
     assert(s != NULL && buf != NULL);
     if (!fd)
@@ -151,7 +151,7 @@ ssize_t   smb_fread(smb_session *s, smb_fd fd, void *buf, size_t buf_size)
     smb_message_set_andx_members(req_msg);
     smb_message_advance(req_msg, sizeof(smb_read_req));
 
-    max_read = SMB_IO_BUFSIZE - 256; // XXX
+    max_read = 0xffff;
     max_read = max_read < buf_size ? max_read : buf_size;
 
     req = (smb_read_req *)req_msg->packet->payload;

+ 1 - 1
src/smb_session.c

@@ -136,7 +136,7 @@ int             smb_session_connect(smb_session *s, const char *name,
             goto error;
     }
 
-    if ((s->transport.session = s->transport.new(SMB_IO_BUFSIZE)) == NULL)
+    if ((s->transport.session = s->transport.new(SMB_DEFAULT_BUFSIZE)) == NULL)
         goto error;
     if (!s->transport.connect((struct in_addr *)&ip, s->transport.session, name))
         goto error;

+ 1 - 1
src/smb_share.c

@@ -203,7 +203,7 @@ size_t          smb_share_get_list(smb_session *s, char ***list)
 
     memset((void *)trans, 0, sizeof(smb_trans_req));
 
-    rpc_len = SMB_IO_BUFSIZE - 256; // XXX
+    rpc_len = 0xffff;
 
     trans->wct                    = 16;
     trans->total_data_count       = 72;

+ 1 - 1
src/smb_trans2.c

@@ -131,7 +131,7 @@ smb_file  *smb_find(smb_session *s, smb_tid tid, const char *pattern)
     tr2->wct                = 15;
 
     tr2->max_param_count    = 10; // ?? Why not the same or 12 ?
-    tr2->max_data_count     = 0xffff;
+    tr2->max_data_count     = 0xffff;;
     tr2->param_offset       = 68; // Offset of find_first_params in packet;
     tr2->data_count         = 0;
     tr2->data_offset        = 88; // Offset of pattern in packet

+ 2 - 0
src/smb_transport.c

@@ -21,6 +21,8 @@
 #include "bdsm/smb_transport.h"
 #include "bdsm/netbios_session.h"
 
+// XXX: This can be simplified, since we have only one function that differs
+
 int               transport_connect_nbt(struct in_addr *addr,
                                         netbios_session *s,
                                         const char *name)

+ 2 - 0
src/smb_utils.c

@@ -23,6 +23,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "config.h"
+
 #if HAVE_LANGINFO_H && !defined( __APPLE__ )
 # include <langinfo.h>
 #endif