diff --git a/libs/freetdm/src/include/zap_buffer.h b/libs/freetdm/src/include/zap_buffer.h
index cd16825787..eaa71524f9 100644
--- a/libs/freetdm/src/include/zap_buffer.h
+++ b/libs/freetdm/src/include/zap_buffer.h
@@ -124,6 +124,7 @@ void zap_buffer_destroy(zap_buffer_t **buffer);
 
 /** @} */
 
+zap_size_t zap_buffer_zwrite(zap_buffer_t *buffer, const void *data, zap_size_t datalen);
 
 #endif
 /* For Emacs:
diff --git a/libs/freetdm/src/zap_buffer.c b/libs/freetdm/src/zap_buffer.c
index 1db918665d..9cfb354ad4 100644
--- a/libs/freetdm/src/zap_buffer.c
+++ b/libs/freetdm/src/zap_buffer.c
@@ -187,8 +187,7 @@ zap_size_t zap_buffer_write(zap_buffer_t *buffer, const void *data, zap_size_t d
 	}
 
 	actual_freespace = buffer->datalen - buffer->actually_used;
-
-	if (actual_freespace < datalen) {
+	if (actual_freespace < datalen && (!buffer->max_len || (buffer->datalen + datalen <= buffer->max_len))) {
 		memmove(buffer->data, buffer->head, buffer->used);
 		buffer->head = buffer->data;
 		buffer->actually_used = buffer->used;
@@ -246,6 +245,18 @@ void zap_buffer_zero(zap_buffer_t *buffer)
 	buffer->head = buffer->data;
 }
 
+zap_size_t zap_buffer_zwrite(zap_buffer_t *buffer, const void *data, zap_size_t datalen)
+{
+	zap_size_t w;
+	
+	if (!(w = zap_buffer_write(buffer, data, datalen))) {
+		zap_buffer_zero(buffer);
+		return zap_buffer_write(buffer, data, datalen);
+	}
+
+	return w;
+}
+
 void zap_buffer_destroy(zap_buffer_t **buffer)
 {
 	if (*buffer) {