aboutsummaryrefslogtreecommitdiff
path: root/ssl/packet_locl.h
diff options
context:
space:
mode:
authorEmilia Kasper <emilia@openssl.org>2015-09-01 18:19:14 +0200
committerEmilia Kasper <emilia@openssl.org>2015-09-09 12:47:05 +0200
commit6d41fc80e6152a6bf9d062b2a8e835a388ed0062 (patch)
treecc392b5acae15a064d074c2cdef7838bb2f37139 /ssl/packet_locl.h
parentd728f0f5f28c9c5347ac371373e3cd4cb350760f (diff)
downloadopenssl-6d41fc80e6152a6bf9d062b2a8e835a388ed0062.zip
openssl-6d41fc80e6152a6bf9d062b2a8e835a388ed0062.tar.gz
openssl-6d41fc80e6152a6bf9d062b2a8e835a388ed0062.tar.bz2
PACKET: add PACKET_memdup and PACKET_strndup
Use each once in s3_srvr.c to show how they work. Also fix a bug introduced in c3fc7eeab884b6876a1b4006163f190d325aa047 and made apparent by this change: ssl3_get_next_proto wasn't updating next_proto_negotiated_len Reviewed-by: Matt Caswell <matt@openssl.org>
Diffstat (limited to 'ssl/packet_locl.h')
-rw-r--r--ssl/packet_locl.h56
1 files changed, 54 insertions, 2 deletions
diff --git a/ssl/packet_locl.h b/ssl/packet_locl.h
index 3f03fa7..3200c22 100644
--- a/ssl/packet_locl.h
+++ b/ssl/packet_locl.h
@@ -335,9 +335,12 @@ __owur static inline int PACKET_peek_copy_bytes(const PACKET *pkt,
return 1;
}
-/* Read |len| bytes from |pkt| and copy them to |data| */
+/*
+ * Read |len| bytes from |pkt| and copy them to |data|.
+ * The caller is responsible for ensuring that |data| can hold |len| bytes.
+ */
__owur static inline int PACKET_copy_bytes(PACKET *pkt, unsigned char *data,
- size_t len)
+ size_t len)
{
if (!PACKET_peek_copy_bytes(pkt, data, len))
return 0;
@@ -347,6 +350,55 @@ __owur static inline int PACKET_copy_bytes(PACKET *pkt, unsigned char *data,
return 1;
}
+/*
+ * Copy |pkt| bytes to a newly allocated buffer and store a pointer to the
+ * result in |*data|, and the length in |len|.
+ * If |*data| is not NULL, the old data is OPENSSL_free'd.
+ * If the packet is empty, or malloc fails, |*data| will be set to NULL.
+ * Returns 1 if the malloc succeeds and 0 otherwise.
+ * Does not forward PACKET position (because it is typically the last thing
+ * done with a given PACKET).
+ */
+__owur static inline int PACKET_memdup(const PACKET *pkt, unsigned char **data,
+ size_t *len)
+{
+ size_t length;
+
+ OPENSSL_free(*data);
+ *data = NULL;
+ *len = 0;
+
+ length = PACKET_remaining(pkt);
+
+ if (length == 0)
+ return 1;
+
+ *data = BUF_memdup(pkt->curr, length);
+
+ if (*data == NULL)
+ return 0;
+
+ *len = length;
+ return 1;
+}
+
+/*
+ * Read a C string from |pkt| and copy to a newly allocated, NUL-terminated
+ * buffer. Store a pointer to the result in |*data|.
+ * If |*data| is not NULL, the old data is OPENSSL_free'd.
+ * If the data in |pkt| does not contain a NUL-byte, the entire data is
+ * copied and NUL-terminated.
+ * Returns 1 if the malloc succeeds and 0 otherwise.
+ * Does not forward PACKET position (because it is typically the last thing done
+ * with a given PACKET).
+ */
+__owur static inline int PACKET_strndup(const PACKET *pkt, char **data)
+{
+ OPENSSL_free(*data);
+ *data = BUF_strndup((const char*)pkt->curr, PACKET_remaining(pkt));
+ return (*data != NULL);
+}
+
/* Move the current reading position back |len| bytes */
__owur static inline int PACKET_back(PACKET *pkt, size_t len)
{