1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/*
2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Dynamic data buffer
3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2007-2009, Jouni Malinen <j@w1.fi>
4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify
6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as
7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation.
8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD
10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license.
11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details.
13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h"
16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h"
18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wpabuf.h"
19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpabuf_overflow(const struct wpabuf *buf, size_t len)
21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_printf(MSG_ERROR, "wpabuf %p (size=%lu used=%lu) overflow len=%lu",
23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		   buf, (unsigned long) buf->size, (unsigned long) buf->used,
24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		   (unsigned long) len);
25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	abort();
26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpabuf_resize(struct wpabuf **_buf, size_t add_len)
30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpabuf *buf = *_buf;
32dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	if (buf == NULL) {
33dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt		*_buf = wpabuf_alloc(add_len);
34dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt		return *_buf == NULL ? -1 : 0;
35dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	}
36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf->used + add_len > buf->size) {
37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		unsigned char *nbuf;
38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (buf->ext_data) {
39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			nbuf = os_realloc(buf->ext_data, buf->used + add_len);
40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (nbuf == NULL)
41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				return -1;
42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			os_memset(nbuf + buf->used, 0, add_len);
43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			buf->ext_data = nbuf;
44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else {
45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			nbuf = os_realloc(buf, sizeof(struct wpabuf) +
46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					  buf->used + add_len);
47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (nbuf == NULL)
48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				return -1;
49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			buf = (struct wpabuf *) nbuf;
50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			os_memset(nbuf + sizeof(struct wpabuf) + buf->used, 0,
51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				  add_len);
52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			*_buf = buf;
53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		buf->size = buf->used + add_len;
55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpabuf_alloc - Allocate a wpabuf of the given size
63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @len: Length for the allocated buffer
64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Buffer to the allocated wpabuf or %NULL on failure
65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpabuf * wpabuf_alloc(size_t len)
67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpabuf *buf = os_zalloc(sizeof(struct wpabuf) + len);
69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL)
70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf->size = len;
72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return buf;
73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpabuf * wpabuf_alloc_ext_data(u8 *data, size_t len)
77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpabuf *buf = os_zalloc(sizeof(struct wpabuf));
79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL)
80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf->size = len;
83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf->used = len;
84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf->ext_data = data;
85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return buf;
87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpabuf * wpabuf_alloc_copy(const void *data, size_t len)
91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpabuf *buf = wpabuf_alloc(len);
93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf)
94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpabuf_put_data(buf, data, len);
95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return buf;
96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpabuf * wpabuf_dup(const struct wpabuf *src)
100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpabuf *buf = wpabuf_alloc(wpabuf_len(src));
102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf)
103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpabuf_put_data(buf, wpabuf_head(src), wpabuf_len(src));
104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return buf;
105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpabuf_free - Free a wpabuf
110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @buf: wpabuf buffer
111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpabuf_free(struct wpabuf *buf)
113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL)
115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(buf->ext_data);
117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(buf);
118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid * wpabuf_put(struct wpabuf *buf, size_t len)
122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	void *tmp = wpabuf_mhead_u8(buf) + wpabuf_len(buf);
124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf->used += len;
125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf->used > buf->size) {
126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpabuf_overflow(buf, len);
127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return tmp;
129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpabuf_concat - Concatenate two buffers into a newly allocated one
134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: First buffer
135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Second buffer
136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: wpabuf with concatenated a + b data or %NULL on failure
137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Both buffers a and b will be freed regardless of the return value. Input
139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * buffers can be %NULL which is interpreted as an empty buffer.
140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpabuf * wpabuf_concat(struct wpabuf *a, struct wpabuf *b)
142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpabuf *n = NULL;
144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t len = 0;
145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (b == NULL)
147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return a;
148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (a)
150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		len += wpabuf_len(a);
151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (b)
152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		len += wpabuf_len(b);
153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	n = wpabuf_alloc(len);
155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (n) {
156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (a)
157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpabuf_put_buf(n, a);
158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (b)
159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			wpabuf_put_buf(n, b);
160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpabuf_free(a);
163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpabuf_free(b);
164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return n;
166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpabuf_zeropad - Pad buffer with 0x00 octets (prefix) to specified length
171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @buf: Buffer to be padded
172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @len: Length for the padded buffer
173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: wpabuf padded to len octets or %NULL on failure
174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * If buf is longer than len octets or of same size, it will be returned as-is.
176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Otherwise a new buffer is allocated and prefixed with 0x00 octets followed
177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * by the source data. The source buffer will be freed on error, i.e., caller
178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * will only be responsible on freeing the returned buffer. If buf is %NULL,
179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * %NULL will be returned.
180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpabuf * wpabuf_zeropad(struct wpabuf *buf, size_t len)
182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct wpabuf *ret;
184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t blen;
185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL)
187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return NULL;
188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	blen = wpabuf_len(buf);
190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (blen >= len)
191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return buf;
192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ret = wpabuf_alloc(len);
194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (ret) {
195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		os_memset(wpabuf_put(ret, len - blen), 0, len - blen);
196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpabuf_put_buf(ret, buf);
197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpabuf_free(buf);
199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return ret;
201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpabuf_printf(struct wpabuf *buf, char *fmt, ...)
205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_list ap;
207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	void *tmp = wpabuf_mhead_u8(buf) + wpabuf_len(buf);
208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int res;
209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_start(ap, fmt);
211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = vsnprintf(tmp, buf->size - buf->used, fmt, ap);
212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_end(ap);
213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res < 0 || (size_t) res >= buf->size - buf->used)
214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpabuf_overflow(buf, res);
215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf->used += res;
216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
217