summaryrefslogtreecommitdiff
path: root/src/common/packed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/packed.c')
-rw-r--r--src/common/packed.c55
1 files changed, 51 insertions, 4 deletions
diff --git a/src/common/packed.c b/src/common/packed.c
index 117b557..b8ed21b 100644
--- a/src/common/packed.c
+++ b/src/common/packed.c
@@ -166,6 +166,32 @@ void copy_packed_buffer(packed_buffer_t *dest, const packed_buffer_t *src)
/******************************************************************************
* *
+* Paramètres : dest = tampon de données à constituer. *
+* src = tampon de données à copier. *
+* *
+* Description : Inclut les données d'un tampon dans un autre. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool include_packed_buffer(packed_buffer_t *dest, const packed_buffer_t *src)
+{
+ bool result; /* Bilan à retourner */
+
+ assert(src->allocated >= (sizeof(uint32_t) + src->used));
+
+ result = extend_packed_buffer(dest, src->data + sizeof(uint32_t), src->used, false);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : pbuf = paquet de données à consulter. *
* *
* Description : Indique le nombre d'octets de la charge utile d'un paquet. *
@@ -565,7 +591,10 @@ bool ssl_recv_packed_buffer(packed_buffer_t *pbuf, SSL *fd)
{
bool result; /* Bilan à retourner */
uint32_t used; /* Taille de charge utile */
- int got; /* Quantité de données traitées*/
+ size_t pos; /* Localisation du stockage */
+ size_t remaining; /* Quantité à lire restante */
+ size_t got; /* QUantité lue par appel */
+ int ret; /* Code de retour d'une lecture*/
got = SSL_read(fd, &used, sizeof(uint32_t));
if (got <= 0) LOG_ERROR_OPENSSL;
@@ -584,10 +613,28 @@ bool ssl_recv_packed_buffer(packed_buffer_t *pbuf, SSL *fd)
pbuf->used = used;
- got = SSL_read(fd, pbuf->data + pbuf->pos, used);
- if (got <= 0) LOG_ERROR_OPENSSL;
+ pos = pbuf->pos;
+ remaining = used;
+
+ while (remaining > 0)
+ {
+ ret = SSL_read_ex(fd, pbuf->data + pos, remaining, &got);
+
+ if (ret > 0)
+ {
+ pos += got;
+ remaining -= got;
+ }
+
+ else
+ {
+ LOG_ERROR_OPENSSL;
+ break;
+ }
+
+ }
- result = (got == used);
+ result = (remaining == 0);
}