diff options
author | Volker Lendecke <vl@samba.org> | 2018-01-23 14:39:21 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2018-01-24 00:58:17 +0100 |
commit | 45aec7d3a23645998eb97a86a50345c20a8e14dc (patch) | |
tree | 9ec36b4ce0928a4c693eaaa7d2fb4001bd2e3c23 /source3/libsmb | |
parent | c57cce1b973ec3a6ffd1a230fccaaa02c28c9e04 (diff) | |
download | samba-45aec7d3a23645998eb97a86a50345c20a8e14dc.tar.gz |
libnmb: Add "parse_packet_talloc"
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/libsmb')
-rw-r--r-- | source3/libsmb/nmblib.c | 71 | ||||
-rw-r--r-- | source3/libsmb/nmblib.h | 5 |
2 files changed, 76 insertions, 0 deletions
diff --git a/source3/libsmb/nmblib.c b/source3/libsmb/nmblib.c index 8feb029b05e..c262c2820e2 100644 --- a/source3/libsmb/nmblib.c +++ b/source3/libsmb/nmblib.c @@ -803,6 +803,77 @@ struct packet_struct *parse_packet(char *buf,int length, return p; } +static struct packet_struct *copy_packet_talloc( + TALLOC_CTX *mem_ctx, const struct packet_struct *src) +{ + struct packet_struct *pkt; + + pkt = talloc_memdup(mem_ctx, src, sizeof(struct packet_struct)); + if (pkt == NULL) { + return NULL; + } + pkt->locked = false; + pkt->recv_fd = -1; + pkt->send_fd = -1; + + if (src->packet_type == NMB_PACKET) { + const struct nmb_packet *nsrc = &src->packet.nmb; + struct nmb_packet *ndst = &pkt->packet.nmb; + + if (nsrc->answers != NULL) { + ndst->answers = talloc_memdup( + pkt, nsrc->answers, + sizeof(struct res_rec) * nsrc->header.ancount); + if (ndst->answers == NULL) { + goto fail; + } + } + if (nsrc->nsrecs != NULL) { + ndst->nsrecs = talloc_memdup( + pkt, nsrc->nsrecs, + sizeof(struct res_rec) * nsrc->header.nscount); + if (ndst->nsrecs == NULL) { + goto fail; + } + } + if (nsrc->additional != NULL) { + ndst->additional = talloc_memdup( + pkt, nsrc->additional, + sizeof(struct res_rec) * nsrc->header.arcount); + if (ndst->nsrecs == NULL) { + goto fail; + } + } + } + + return pkt; + + /* + * DGRAM packets have no substructures + */ + +fail: + TALLOC_FREE(pkt); + return NULL; +} + +struct packet_struct *parse_packet_talloc(TALLOC_CTX *mem_ctx, + char *buf,int length, + enum packet_type packet_type, + struct in_addr ip, + int port) +{ + struct packet_struct *pkt, *result; + + pkt = parse_packet(buf, length, packet_type, ip, port); + if (pkt == NULL) { + return NULL; + } + result = copy_packet_talloc(mem_ctx, pkt); + free_packet(pkt); + return result; +} + /******************************************************************* Read a packet from a socket and parse it, returning a packet ready to be used or put on the queue. This assumes a UDP socket. diff --git a/source3/libsmb/nmblib.h b/source3/libsmb/nmblib.h index 7e1e40c13e7..1956ea7efdf 100644 --- a/source3/libsmb/nmblib.h +++ b/source3/libsmb/nmblib.h @@ -39,6 +39,11 @@ struct packet_struct *parse_packet(char *buf,int length, enum packet_type packet_type, struct in_addr ip, int port); +struct packet_struct *parse_packet_talloc(TALLOC_CTX *mem_ctx, + char *buf,int length, + enum packet_type packet_type, + struct in_addr ip, + int port); struct packet_struct *read_packet(int fd,enum packet_type packet_type); void make_nmb_name( struct nmb_name *n, const char *name, int type); bool nmb_name_equal(struct nmb_name *n1, struct nmb_name *n2); |