]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
Make buffer_export comply to documentation and fix buffer2str
authorWillem Toorop <willem@NLnetLabs.nl>
Wed, 22 Aug 2012 09:28:33 +0000 (09:28 +0000)
committerWillem Toorop <willem@NLnetLabs.nl>
Wed, 22 Aug 2012 09:28:33 +0000 (09:28 +0000)
Changelog
buffer.c
examples/ldns-testpkts.c
host2str.c
host2wire.c
keys.c
ldns/buffer.h
ldns/host2str.h
ldns_symbols.def
net.c

index 648fe756f9289705be8e6834595bfdfeca589a3a..09cd99074a3cc343fdb08c61b445ab4a6fbfcc64 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -1,4 +1,5 @@
 1.6.14
+       * Make buffer_export comply to documentation and fix buffer2str
        * Various improvements and fixes of pyldns from Katel Slany
        * bugfix: Make ldns_resolver_pop_nameserver clear the array when
          there was only one.
index 5a6b0ba74c85636704a0e8e85ae8e4a51cb9c990..fc6c17e7a9f3507259d83d22d408ad4454549ef6 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -140,7 +140,8 @@ ldns_buffer_free(ldns_buffer *buffer)
                return;
        }
 
-       LDNS_FREE(buffer->_data);
+       if (!buffer->_fixed)
+               LDNS_FREE(buffer->_data);
 
        LDNS_FREE(buffer);
 }
index d8139511ab5cbcd755e1aa77328afccbd82fbb9b..0bc4a7edc0c2ed8e2ba26647e39629dc3f626127 100644 (file)
@@ -323,7 +323,7 @@ data_buffer2wire(ldns_buffer *data_buffer)
        uint8_t *hexbuf;
        int hexbufpos = 0;
        size_t wirelen;
-       uint8_t *data_wire = (uint8_t *) ldns_buffer_export(data_buffer);
+       uint8_t *data_wire = (uint8_t *) ldns_buffer_begin(data_buffer);
        uint8_t *wire = LDNS_XMALLOC(uint8_t, LDNS_MAX_PACKETLEN);
        
        hexbuf = LDNS_XMALLOC(uint8_t, LDNS_MAX_PACKETLEN);
@@ -815,7 +815,7 @@ handle_query(uint8_t* inbuf, ssize_t inlen, struct entry* entries, int* count,
                                /* still try to adjust ID */
                                answer_size = ldns_buffer_capacity(p->reply_from_hex);
                                outbuf = LDNS_XMALLOC(uint8_t, answer_size);
-                               memcpy(outbuf, ldns_buffer_export(p->reply_from_hex), answer_size);
+                               memcpy(outbuf, ldns_buffer_begin(p->reply_from_hex), answer_size);
                                if(entry->copy_id) {
                                        ldns_write_uint16(outbuf, 
                                                ldns_pkt_id(query_pkt));
index 8cfe96bf2485565763a024752a784d5f45aad1c3..ff750b5a3e0ebaafc7922eca465d4aba238a191b 100644 (file)
@@ -196,7 +196,7 @@ ldns_pkt_opcode2str(ldns_pkt_opcode opcode)
 
        str = NULL;
        if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) {
-               str = ldns_buffer2str(buf);
+               str = ldns_buffer_export2str(buf);
        }
 
        ldns_buffer_free(buf);
@@ -216,7 +216,7 @@ ldns_pkt_rcode2str(ldns_pkt_rcode rcode)
 
        str = NULL;
        if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) {
-               str = ldns_buffer2str(buf);
+               str = ldns_buffer_export2str(buf);
        }
 
        ldns_buffer_free(buf);
@@ -237,7 +237,7 @@ ldns_pkt_algorithm2str(ldns_algorithm algorithm)
        str = NULL;
        if (ldns_algorithm2buffer_str(buf, algorithm)
            == LDNS_STATUS_OK) {
-               str = ldns_buffer2str(buf);
+               str = ldns_buffer_export2str(buf);
        }
 
        ldns_buffer_free(buf);
@@ -258,7 +258,7 @@ ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)
        str = NULL;
        if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm)
            == LDNS_STATUS_OK) {
-               str = ldns_buffer2str(buf);
+               str = ldns_buffer_export2str(buf);
        }
 
        ldns_buffer_free(buf);
@@ -568,7 +568,7 @@ ldns_rr_type2str(const ldns_rr_type type)
 
        str = NULL;
        if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) {
-               str = ldns_buffer2str(buf);
+               str = ldns_buffer_export2str(buf);
        }
 
        ldns_buffer_free(buf);
@@ -604,7 +604,7 @@ ldns_rr_class2str(const ldns_rr_class klass)
 
        str = NULL;
        if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) {
-               str = ldns_buffer2str(buf);
+               str = ldns_buffer_export2str(buf);
        }
        ldns_buffer_free(buf);
        return str;
@@ -2039,12 +2039,11 @@ error:
 }
 
 /*
- * Zero terminate the buffer and fix it to the size of the string.
+ * Zero terminate the buffer and copy data.
  */
 char *
 ldns_buffer2str(ldns_buffer *buffer)
 {
-       char *tmp_str;
        char *str;
 
        /* check if buffer ends with \0, if not, and
@@ -2059,16 +2058,34 @@ ldns_buffer2str(ldns_buffer *buffer)
                }
        }
 
-       tmp_str = ldns_buffer_export(buffer);
-       str = LDNS_XMALLOC(char, strlen(tmp_str) + 1);
+       str = strdup((const char *)ldns_buffer_begin(buffer));
         if(!str) {
                 return NULL;
         }
-       memcpy(str, tmp_str, strlen(tmp_str) + 1);
-
        return str;
 }
 
+/*
+ * Zero terminate the buffer and export data.
+ */
+char *
+ldns_buffer_export2str(ldns_buffer *buffer)
+{
+       /* check if buffer ends with \0, if not, and
+          if there is space, add it */
+       if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) {
+               if (!ldns_buffer_reserve(buffer, 1)) {
+                       return NULL;
+               }
+               ldns_buffer_write_u8(buffer, (uint8_t) '\0');
+               if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) {
+                       return NULL;
+               }
+       }
+
+       return ldns_buffer_export(buffer);
+}
+
 char *
 ldns_rdf2str(const ldns_rdf *rdf)
 {
@@ -2080,7 +2097,7 @@ ldns_rdf2str(const ldns_rdf *rdf)
        }
        if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) {
                /* export and return string, destroy rest */
-               result = ldns_buffer2str(tmp_buffer);
+               result = ldns_buffer_export2str(tmp_buffer);
        }
        ldns_buffer_free(tmp_buffer);
        return result;
@@ -2098,7 +2115,7 @@ ldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr)
        if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr)
                        == LDNS_STATUS_OK) {
                /* export and return string, destroy rest */
-               result = ldns_buffer2str(tmp_buffer);
+               result = ldns_buffer_export2str(tmp_buffer);
        }
        ldns_buffer_free(tmp_buffer);
        return result;
@@ -2122,7 +2139,7 @@ ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt)
        if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt)
                        == LDNS_STATUS_OK) {
                /* export and return string, destroy rest */
-               result = ldns_buffer2str(tmp_buffer);
+               result = ldns_buffer_export2str(tmp_buffer);
        }
 
        ldns_buffer_free(tmp_buffer);
@@ -2146,7 +2163,7 @@ ldns_key2str(const ldns_key *k)
        }
        if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) {
                /* export and return string, destroy rest */
-               result = ldns_buffer2str(tmp_buffer);
+               result = ldns_buffer_export2str(tmp_buffer);
        }
        ldns_buffer_free(tmp_buffer);
        return result;
@@ -2176,7 +2193,7 @@ ldns_rr_list2str_fmt(const ldns_output_format *fmt, const ldns_rr_list *list)
        }
 
        /* export and return string, destroy rest */
-       result = ldns_buffer2str(tmp_buffer);
+       result = ldns_buffer_export2str(tmp_buffer);
        ldns_buffer_free(tmp_buffer);
        return result;
 }
index b5b0ba8ff20a32015bfef1a4e40c4fb20f21d305..de1e01e9ba3f074cf571496a6a9834117b4e30d2 100644 (file)
@@ -341,7 +341,6 @@ ldns_status
 ldns_rdf2wire(uint8_t **dest, const ldns_rdf *rdf, size_t *result_size)
 {
        ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
-       uint8_t *result = NULL;
        ldns_status status;
        *result_size = 0;
        *dest = NULL;
@@ -350,21 +349,8 @@ ldns_rdf2wire(uint8_t **dest, const ldns_rdf *rdf, size_t *result_size)
        status = ldns_rdf2buffer_wire(buffer, rdf);
        if (status == LDNS_STATUS_OK) {
                *result_size =  ldns_buffer_position(buffer);
-               result = (uint8_t *) ldns_buffer_export(buffer);
-       } else {
-               ldns_buffer_free(buffer);
-               return status;
-       }
-       
-       if (result) {
-               *dest = LDNS_XMALLOC(uint8_t, ldns_buffer_position(buffer));
-               if(!*dest) {
-                       ldns_buffer_free(buffer);
-                       return LDNS_STATUS_MEM_ERR;
-               }
-               memcpy(*dest, result, ldns_buffer_position(buffer));
+               *dest = (uint8_t *) ldns_buffer_export(buffer);
        }
-       
        ldns_buffer_free(buffer);
        return status;
 }
@@ -373,7 +359,6 @@ ldns_status
 ldns_rr2wire(uint8_t **dest, const ldns_rr *rr, int section, size_t *result_size)
 {
        ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
-       uint8_t *result = NULL;
        ldns_status status;
        *result_size = 0;
        *dest = NULL;
@@ -382,21 +367,8 @@ ldns_rr2wire(uint8_t **dest, const ldns_rr *rr, int section, size_t *result_size
        status = ldns_rr2buffer_wire(buffer, rr, section);
        if (status == LDNS_STATUS_OK) {
                *result_size =  ldns_buffer_position(buffer);
-               result = (uint8_t *) ldns_buffer_export(buffer);
-       } else {
-               ldns_buffer_free(buffer);
-               return status;
+               *dest = (uint8_t *) ldns_buffer_export(buffer);
        }
-       
-       if (result) {
-               *dest = LDNS_XMALLOC(uint8_t, ldns_buffer_position(buffer));
-               if(!*dest) {
-                       ldns_buffer_free(buffer);
-                       return LDNS_STATUS_MEM_ERR;
-               }
-               memcpy(*dest, result, ldns_buffer_position(buffer));
-       }
-       
        ldns_buffer_free(buffer);
        return status;
 }
@@ -405,7 +377,6 @@ ldns_status
 ldns_pkt2wire(uint8_t **dest, const ldns_pkt *packet, size_t *result_size)
 {
        ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
-       uint8_t *result = NULL;
        ldns_status status;
        *result_size = 0;
        *dest = NULL;
@@ -414,21 +385,8 @@ ldns_pkt2wire(uint8_t **dest, const ldns_pkt *packet, size_t *result_size)
        status = ldns_pkt2buffer_wire(buffer, packet);
        if (status == LDNS_STATUS_OK) {
                *result_size =  ldns_buffer_position(buffer);
-               result = (uint8_t *) ldns_buffer_export(buffer);
-       } else {
-               ldns_buffer_free(buffer);
-               return status;
+               *dest = (uint8_t *) ldns_buffer_export(buffer);
        }
-       
-       if (result) {
-               *dest = LDNS_XMALLOC(uint8_t, ldns_buffer_position(buffer));
-               if(!*dest) {
-                       ldns_buffer_free(buffer);
-                       return LDNS_STATUS_MEM_ERR;
-               }
-               memcpy(*dest, result, ldns_buffer_position(buffer));
-       }
-       
        ldns_buffer_free(buffer);
        return status;
 }
diff --git a/keys.c b/keys.c
index 9b82efdfeb0142d0655f94448074aa43dfa3388c..e4e5754b0c1a80ece5dd838cea786ac69f7aa596 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -1654,7 +1654,7 @@ ldns_key_get_file_base_name(ldns_key *key)
                           "+%03u+%05u",
                           ldns_key_algorithm(key),
                           ldns_key_keytag(key));
-       file_base_name = strdup(ldns_buffer_export(buffer));
+       file_base_name = ldns_buffer_export(buffer);
        ldns_buffer_free(buffer);
        return file_base_name;
 }
index 03df14c99158bee12b47c5c05ceeb6a78c977804..3b64198d8d57627196e28282081baa48d722b801 100644 (file)
@@ -630,8 +630,9 @@ void ldns_buffer_free(ldns_buffer *buffer);
 void *ldns_buffer_export(ldns_buffer *buffer);
 
 /**
- * Copy contents of the other buffer to this buffer. Silently truncated
- * if this buffer is too small.
+ * Copy contents of the from buffer to the result buffer and then flips 
+ * the result buffer. Data will be silently truncated if the result buffer is
+ * too small.
  * \param[out] *result resulting buffer which is copied to.
  * \param[in] *from what to copy to result.
  */
index 32cdd605df118cb258ba3eb121b478755879beeb..bbf932767b3ba9be4bf0152ba625573c0f7f06bd 100644 (file)
@@ -603,14 +603,26 @@ char *ldns_rr_list2str_fmt(
                const ldns_output_format *fmt, const ldns_rr_list *rr_list);
 
 /**
- * Returns the data in the buffer as a null terminated char * string
- * Buffer data must be char * type, and must be freed by the caller
+ * Returns a copy of the data in the buffer as a null terminated
+ * char * string. The returned string must be freed by the caller.
+ * The buffer must be in write modus and may thus not have been flipped.
  *
  * \param[in] buffer buffer containing char * data
  * \return null terminated char * data, or NULL on error
  */
 char *ldns_buffer2str(ldns_buffer *buffer);
 
+/**
+ * Exports and returns the data in the buffer as a null terminated
+ * char * string. The returned string must be freed by the caller.
+ * The buffer must be in write modus and may thus not have been flipped.
+ * The buffer is fixed after this function returns.
+ *
+ * \param[in] buffer buffer containing char * data
+ * \return null terminated char * data, or NULL on error
+ */
+char *ldns_buffer_export2str(ldns_buffer *buffer);
+
 /**
  * Prints the data in the rdata field to the given file stream
  * (in presentation format)
index 2c4d73353a5693034f8472765c2b0678771d37a5..e059af6f45e3e946c3cb5f89e5e94b9aef5cfff5 100644 (file)
@@ -26,6 +26,7 @@ ldns_buffer2pkt_wire
 ldns_buffer2str
 ldns_buffer_copy
 ldns_buffer_export
+ldns_buffer_export2str
 ldns_buffer_free
 ldns_buffer_new
 ldns_buffer_new_frm_data
diff --git a/net.c b/net.c
index ea34426121b23241a95f1ecca046a422f2c172e0..a61276c93cfa9d4ae7f9a6bb9b84500d891bf81b 100644 (file)
--- a/net.c
+++ b/net.c
@@ -471,7 +471,7 @@ ldns_tcp_send_query(ldns_buffer *qbin, int sockfd,
        sendbuf = LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin) + 2);
        if(!sendbuf) return 0;
        ldns_write_uint16(sendbuf, ldns_buffer_position(qbin));
-       memcpy(sendbuf + 2, ldns_buffer_export(qbin), ldns_buffer_position(qbin));
+       memcpy(sendbuf + 2, ldns_buffer_begin(qbin), ldns_buffer_position(qbin));
 
        bytes = sendto(sockfd, (void*)sendbuf,
                        ldns_buffer_position(qbin) + 2, 0, (struct sockaddr *)to, tolen);