s3-talloc Change TALLOC_REALLOC_ARRAY() to talloc_realloc()
[ira/wip.git] / source3 / smbd / srvstr.c
index 409fd30a6791ac9a96e3c1ce2c059183c159bf95..c069dd4a5ecb1fec0dca400eaabd5a754e8d3dd7 100644 (file)
@@ -6,7 +6,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
-extern int max_send;
+#include "smbd/smbd.h"
+#include "smbd/globals.h"
 
 /* Make sure we can't write a string past the end of the buffer */
 
-size_t srvstr_push_fn(const char *function, unsigned int line, 
-                     const char *base_ptr, void *dest, 
+size_t srvstr_push_fn(const char *base_ptr, uint16 smb_flags2, void *dest,
                      const char *src, int dest_len, int flags)
 {
-       size_t buf_used = PTR_DIFF(dest, base_ptr);
-       if (dest_len == -1) {
-               if (((ptrdiff_t)dest < (ptrdiff_t)base_ptr) || (buf_used > (size_t)max_send)) {
-#if 0
-                       DEBUG(0, ("Pushing string of 'unlimited' length into non-SMB buffer!\n"));
-#endif
-                       return push_string_fn(function, line, base_ptr, dest, src, -1, flags);
-               }
-               return push_string_fn(function, line, base_ptr, dest, src, max_send - buf_used, flags);
+       if (dest_len < 0) {
+               return 0;
        }
-       
+
        /* 'normal' push into size-specified buffer */
-       return push_string_fn(function, line, base_ptr, dest, src, dest_len, flags);
+       return push_string_base(base_ptr, smb_flags2, dest, src,
+                               dest_len, flags);
+}
+
+/*******************************************************************
+ Add a string to the end of a smb_buf, adjusting bcc and smb_len.
+ Return the bytes added
+********************************************************************/
+
+ssize_t message_push_string(uint8 **outbuf, const char *str, int flags)
+{
+       size_t buf_size = smb_len(*outbuf) + 4;
+       size_t grow_size;
+       size_t result;
+       uint8 *tmp;
+
+       /*
+        * We need to over-allocate, now knowing what srvstr_push will
+        * actually use. This is very generous by incorporating potential
+        * padding, the terminating 0 and at most 4 chars per UTF-16 code
+        * point.
+        */
+       grow_size = (strlen(str) + 2) * 4;
+
+       if (!(tmp = talloc_realloc(NULL, *outbuf, uint8,
+                                        buf_size + grow_size))) {
+               DEBUG(0, ("talloc failed\n"));
+               return -1;
+       }
+
+       result = srvstr_push((char *)tmp, SVAL(tmp, smb_flg2),
+                            tmp + buf_size, str, grow_size, flags);
+
+       if (result == (size_t)-1) {
+               DEBUG(0, ("srvstr_push failed\n"));
+               return -1;
+       }
+       set_message_bcc((char *)tmp, smb_buflen(tmp) + result);
+
+       *outbuf = tmp;
+
+       return result;
 }