PostgreSQL Source Code git master
mbuf.c File Reference
#include "postgres.h"
#include "mbuf.h"
#include "px.h"
Include dependency graph for mbuf.c:

Go to the source code of this file.

Data Structures

struct  MBuf
 
struct  PullFilter
 
struct  PushFilter
 

Macros

#define STEP   (16*1024)
 

Functions

int mbuf_avail (MBuf *mbuf)
 
int mbuf_size (MBuf *mbuf)
 
int mbuf_free (MBuf *mbuf)
 
static void prepare_room (MBuf *mbuf, int block_len)
 
int mbuf_append (MBuf *dst, const uint8 *buf, int len)
 
MBufmbuf_create (int len)
 
MBufmbuf_create_from_data (uint8 *data, int len)
 
int mbuf_grab (MBuf *mbuf, int len, uint8 **data_p)
 
int mbuf_steal_data (MBuf *mbuf, uint8 **data_p)
 
int pullf_create (PullFilter **pf_p, const PullFilterOps *op, void *init_arg, PullFilter *src)
 
void pullf_free (PullFilter *pf)
 
int pullf_read (PullFilter *pf, int len, uint8 **data_p)
 
int pullf_read_max (PullFilter *pf, int len, uint8 **data_p, uint8 *tmpbuf)
 
int pullf_read_fixed (PullFilter *src, int len, uint8 *dst)
 
static int pull_from_mbuf (void *arg, PullFilter *src, int len, uint8 **data_p, uint8 *buf, int buflen)
 
int pullf_create_mbuf_reader (PullFilter **mp_p, MBuf *src)
 
int pushf_create (PushFilter **mp_p, const PushFilterOps *op, void *init_arg, PushFilter *next)
 
void pushf_free (PushFilter *mp)
 
void pushf_free_all (PushFilter *mp)
 
static int wrap_process (PushFilter *mp, const uint8 *data, int len)
 
int pushf_write (PushFilter *mp, const uint8 *data, int len)
 
int pushf_flush (PushFilter *mp)
 
static int push_into_mbuf (PushFilter *next, void *arg, const uint8 *data, int len)
 
int pushf_create_mbuf_writer (PushFilter **res, MBuf *dst)
 

Variables

static const struct PullFilterOps mbuf_reader
 
static const struct PushFilterOps mbuf_filter
 

Macro Definition Documentation

◆ STEP

#define STEP   (16*1024)

Definition at line 37 of file mbuf.c.

Function Documentation

◆ mbuf_append()

int mbuf_append ( MBuf dst,
const uint8 buf,
int  len 
)

Definition at line 94 of file mbuf.c.

95{
96 if (dst->no_write)
97 {
98 px_debug("mbuf_append: no_write");
99 return PXE_BUG;
100 }
101
102 prepare_room(dst, len);
103
104 memcpy(dst->data_end, buf, len);
105 dst->data_end += len;
106
107 return 0;
108}
static void prepare_room(MBuf *mbuf, int block_len)
Definition: mbuf.c:74
const void size_t len
static char * buf
Definition: pg_test_fsync.c:72
void px_debug(const char *fmt,...)
Definition: px.c:149
#define PXE_BUG
Definition: px.h:58
bool no_write
Definition: mbuf.c:45
uint8 * data_end
Definition: mbuf.c:42

References buf, MBuf::data_end, len, MBuf::no_write, prepare_room(), px_debug(), and PXE_BUG.

Referenced by copy_crlf(), decrypt_internal(), encrypt_internal(), parse_literal_data(), and push_into_mbuf().

◆ mbuf_avail()

int mbuf_avail ( MBuf mbuf)

Definition at line 50 of file mbuf.c.

51{
52 return mbuf->data_end - mbuf->read_pos;
53}
uint8 * read_pos
Definition: mbuf.c:43

References MBuf::data_end, and MBuf::read_pos.

Referenced by mbuf_grab(), and pgp_encrypt().

◆ mbuf_create()

MBuf * mbuf_create ( int  len)

Definition at line 111 of file mbuf.c.

112{
113 MBuf *mbuf;
114
115 if (!len)
116 len = 8192;
117
118 mbuf = palloc(sizeof *mbuf);
119 mbuf->data = palloc(len);
120 mbuf->buf_end = mbuf->data + len;
121 mbuf->data_end = mbuf->data;
122 mbuf->read_pos = mbuf->data;
123
124 mbuf->no_write = false;
125 mbuf->own_data = true;
126
127 return mbuf;
128}
void * palloc(Size size)
Definition: mcxt.c:1317
Definition: mbuf.c:40
uint8 * data
Definition: mbuf.c:41
uint8 * buf_end
Definition: mbuf.c:44
bool own_data
Definition: mbuf.c:46

References MBuf::buf_end, MBuf::data, MBuf::data_end, len, MBuf::no_write, MBuf::own_data, palloc(), and MBuf::read_pos.

Referenced by decrypt_internal(), and encrypt_internal().

◆ mbuf_create_from_data()

MBuf * mbuf_create_from_data ( uint8 data,
int  len 
)

Definition at line 131 of file mbuf.c.

132{
133 MBuf *mbuf;
134
135 mbuf = palloc(sizeof *mbuf);
136 mbuf->data = (uint8 *) data;
137 mbuf->buf_end = mbuf->data + len;
138 mbuf->data_end = mbuf->data + len;
139 mbuf->read_pos = mbuf->data;
140
141 mbuf->no_write = true;
142 mbuf->own_data = false;
143
144 return mbuf;
145}
uint8_t uint8
Definition: c.h:500
const void * data

References MBuf::buf_end, MBuf::data, data, MBuf::data_end, len, MBuf::no_write, MBuf::own_data, palloc(), and MBuf::read_pos.

Referenced by create_mbuf_from_vardata(), and decrypt_internal().

◆ mbuf_free()

int mbuf_free ( MBuf mbuf)

Definition at line 62 of file mbuf.c.

63{
64 if (mbuf->own_data)
65 {
66 px_memset(mbuf->data, 0, mbuf->buf_end - mbuf->data);
67 pfree(mbuf->data);
68 }
69 pfree(mbuf);
70 return 0;
71}
void pfree(void *pointer)
Definition: mcxt.c:1524
void px_memset(void *ptr, int c, size_t len)
Definition: px.c:123

References MBuf::buf_end, MBuf::data, MBuf::own_data, pfree(), and px_memset().

Referenced by decrypt_internal(), encrypt_internal(), and pgp_key_id_w().

◆ mbuf_grab()

int mbuf_grab ( MBuf mbuf,
int  len,
uint8 **  data_p 
)

Definition at line 149 of file mbuf.c.

150{
151 if (len > mbuf_avail(mbuf))
152 len = mbuf_avail(mbuf);
153
154 mbuf->no_write = true;
155
156 *data_p = mbuf->read_pos;
157 mbuf->read_pos += len;
158 return len;
159}
int mbuf_avail(MBuf *mbuf)
Definition: mbuf.c:50

References len, mbuf_avail(), MBuf::no_write, and MBuf::read_pos.

Referenced by pgp_encrypt(), and pull_from_mbuf().

◆ mbuf_size()

int mbuf_size ( MBuf mbuf)

Definition at line 56 of file mbuf.c.

57{
58 return mbuf->data_end - mbuf->data;
59}

References MBuf::data, and MBuf::data_end.

Referenced by mbuf_steal_data().

◆ mbuf_steal_data()

int mbuf_steal_data ( MBuf mbuf,
uint8 **  data_p 
)

Definition at line 162 of file mbuf.c.

163{
164 int len = mbuf_size(mbuf);
165
166 mbuf->no_write = true;
167 mbuf->own_data = false;
168
169 *data_p = mbuf->data;
170
171 mbuf->data = mbuf->data_end = mbuf->read_pos = mbuf->buf_end = NULL;
172
173 return len;
174}
int mbuf_size(MBuf *mbuf)
Definition: mbuf.c:56

References MBuf::buf_end, MBuf::data, MBuf::data_end, len, mbuf_size(), MBuf::no_write, MBuf::own_data, and MBuf::read_pos.

Referenced by decrypt_internal(), and encrypt_internal().

◆ prepare_room()

static void prepare_room ( MBuf mbuf,
int  block_len 
)
static

Definition at line 74 of file mbuf.c.

75{
76 uint8 *newbuf;
77 unsigned newlen;
78
79 if (mbuf->data_end + block_len <= mbuf->buf_end)
80 return;
81
82 newlen = (mbuf->buf_end - mbuf->data)
83 + ((block_len + STEP + STEP - 1) & -STEP);
84
85 newbuf = repalloc(mbuf->data, newlen);
86
87 mbuf->buf_end = newbuf + newlen;
88 mbuf->data_end = newbuf + (mbuf->data_end - mbuf->data);
89 mbuf->read_pos = newbuf + (mbuf->read_pos - mbuf->data);
90 mbuf->data = newbuf;
91}
char * buf_end
#define STEP
Definition: mbuf.c:37
void * repalloc(void *pointer, Size size)
Definition: mcxt.c:1544

References MBuf::buf_end, buf_end, MBuf::data, MBuf::data_end, MBuf::read_pos, repalloc(), and STEP.

Referenced by mbuf_append().

◆ pull_from_mbuf()

static int pull_from_mbuf ( void *  arg,
PullFilter src,
int  len,
uint8 **  data_p,
uint8 buf,
int  buflen 
)
static

Definition at line 323 of file mbuf.c.

325{
326 MBuf *mbuf = arg;
327
328 return mbuf_grab(mbuf, len, data_p);
329}
int mbuf_grab(MBuf *mbuf, int len, uint8 **data_p)
Definition: mbuf.c:149
void * arg

References arg, len, and mbuf_grab().

◆ pullf_create()

int pullf_create ( PullFilter **  pf_p,
const PullFilterOps op,
void *  init_arg,
PullFilter src 
)

Definition at line 191 of file mbuf.c.

192{
193 PullFilter *pf;
194 void *priv;
195 int res;
196
197 if (op->init != NULL)
198 {
199 res = op->init(&priv, init_arg, src);
200 if (res < 0)
201 return res;
202 }
203 else
204 {
205 priv = init_arg;
206 res = 0;
207 }
208
209 pf = palloc0(sizeof(*pf));
210 pf->buflen = res;
211 pf->op = op;
212 pf->priv = priv;
213 pf->src = src;
214 if (pf->buflen > 0)
215 {
216 pf->buf = palloc(pf->buflen);
217 pf->pos = 0;
218 }
219 else
220 {
221 pf->buf = NULL;
222 pf->pos = 0;
223 }
224 *pf_p = pf;
225 return 0;
226}
void * palloc0(Size size)
Definition: mcxt.c:1347
int(* init)(void **priv_p, void *init_arg, PullFilter *src)
Definition: mbuf.h:65
PullFilter * src
Definition: mbuf.c:182
int buflen
Definition: mbuf.c:184
uint8 * buf
Definition: mbuf.c:185
int pos
Definition: mbuf.c:186
void * priv
Definition: mbuf.c:187
const PullFilterOps * op
Definition: mbuf.c:183

References PullFilter::buf, PullFilter::buflen, PullFilterOps::init, PullFilter::op, palloc(), palloc0(), PullFilter::pos, PullFilter::priv, and PullFilter::src.

Referenced by parse_symenc_data(), parse_symenc_mdc_data(), pgp_create_pkt_reader(), process_data_packets(), process_secret_key(), and pullf_create_mbuf_reader().

◆ pullf_create_mbuf_reader()

int pullf_create_mbuf_reader ( PullFilter **  mp_p,
MBuf src 
)

Definition at line 336 of file mbuf.c.

337{
338 return pullf_create(mp_p, &mbuf_reader, src, NULL);
339}
int pullf_create(PullFilter **pf_p, const PullFilterOps *op, void *init_arg, PullFilter *src)
Definition: mbuf.c:191
static const struct PullFilterOps mbuf_reader
Definition: mbuf.c:331

References mbuf_reader, and pullf_create().

Referenced by pgp_decrypt(), pgp_get_keyid(), and pgp_set_pubkey().

◆ pullf_free()

void pullf_free ( PullFilter pf)

Definition at line 229 of file mbuf.c.

230{
231 if (pf->op->free)
232 pf->op->free(pf->priv);
233
234 if (pf->buf)
235 {
236 px_memset(pf->buf, 0, pf->buflen);
237 pfree(pf->buf);
238 }
239
240 px_memset(pf, 0, sizeof(*pf));
241 pfree(pf);
242}
void(* free)(void *priv)
Definition: mbuf.h:73

References PullFilter::buf, PullFilter::buflen, PullFilterOps::free, PullFilter::op, pfree(), PullFilter::priv, and px_memset().

Referenced by internal_read_key(), parse_compressed_data(), parse_symenc_data(), parse_symenc_mdc_data(), pgp_decrypt(), pgp_get_keyid(), pgp_set_pubkey(), process_data_packets(), and process_secret_key().

◆ pullf_read()

int pullf_read ( PullFilter pf,
int  len,
uint8 **  data_p 
)

Definition at line 246 of file mbuf.c.

247{
248 int res;
249
250 if (pf->op->pull)
251 {
252 if (pf->buflen && len > pf->buflen)
253 len = pf->buflen;
254 res = pf->op->pull(pf->priv, pf->src, len, data_p,
255 pf->buf, pf->buflen);
256 }
257 else
258 res = pullf_read(pf->src, len, data_p);
259 return res;
260}
int pullf_read(PullFilter *pf, int len, uint8 **data_p)
Definition: mbuf.c:246
int(* pull)(void *priv, PullFilter *src, int len, uint8 **data_p, uint8 *buf, int buflen)
Definition: mbuf.h:71

References PullFilter::buf, PullFilter::buflen, len, PullFilter::op, PullFilter::priv, PullFilterOps::pull, pullf_read(), and PullFilter::src.

Referenced by decrypt_read(), mdc_read(), mdcbuf_refill(), parse_compressed_data(), parse_literal_data(), pgp_expect_packet_end(), pgp_parse_pkt_hdr(), pgp_skip_packet(), pktreader_pull(), pullf_read(), and pullf_read_max().

◆ pullf_read_fixed()

int pullf_read_fixed ( PullFilter src,
int  len,
uint8 dst 
)

Definition at line 301 of file mbuf.c.

302{
303 int res;
304 uint8 *p;
305
306 res = pullf_read_max(src, len, &p, dst);
307 if (res < 0)
308 return res;
309 if (res != len)
310 {
311 px_debug("pullf_read_fixed: need=%d got=%d", len, res);
313 }
314 if (p != dst)
315 memcpy(dst, p, len);
316 return 0;
317}
int pullf_read_max(PullFilter *pf, int len, uint8 **data_p, uint8 *tmpbuf)
Definition: mbuf.c:263
#define PXE_PGP_CORRUPT_DATA
Definition: px.h:67

References len, pullf_read_max(), px_debug(), and PXE_PGP_CORRUPT_DATA.

Referenced by _pgp_read_public_key(), check_key_cksum(), check_key_sha1(), pgp_mpi_read(), pgp_parse_pubenc_sesskey(), pgp_s2k_read(), process_secret_key(), and read_pubenc_keyid().

◆ pullf_read_max()

int pullf_read_max ( PullFilter pf,
int  len,
uint8 **  data_p,
uint8 tmpbuf 
)

Definition at line 263 of file mbuf.c.

264{
265 int res,
266 total;
267 uint8 *tmp;
268
269 res = pullf_read(pf, len, data_p);
270 if (res <= 0 || res == len)
271 return res;
272
273 /* read was shorter, use tmpbuf */
274 memcpy(tmpbuf, *data_p, res);
275 *data_p = tmpbuf;
276 len -= res;
277 total = res;
278
279 while (len > 0)
280 {
281 res = pullf_read(pf, len, &tmp);
282 if (res < 0)
283 {
284 /* so the caller must clear only on success */
285 px_memset(tmpbuf, 0, total);
286 return res;
287 }
288 if (res == 0)
289 break;
290 memcpy(tmpbuf + total, tmp, res);
291 total += res;
292 len -= res;
293 }
294 return total;
295}
static StringInfoData tmpbuf
Definition: walsender.c:171

References len, pullf_read(), px_memset(), and tmpbuf.

Referenced by mdc_finish(), parse_literal_data(), parse_symenc_sesskey(), prefix_init(), and pullf_read_fixed().

◆ push_into_mbuf()

static int push_into_mbuf ( PushFilter next,
void *  arg,
const uint8 data,
int  len 
)
static

Definition at line 529 of file mbuf.c.

530{
531 int res = 0;
532 MBuf *mbuf = arg;
533
534 if (len > 0)
535 res = mbuf_append(mbuf, data, len);
536 return res < 0 ? res : 0;
537}
int mbuf_append(MBuf *dst, const uint8 *buf, int len)
Definition: mbuf.c:94

References arg, data, len, and mbuf_append().

◆ pushf_create()

int pushf_create ( PushFilter **  mp_p,
const PushFilterOps op,
void *  init_arg,
PushFilter next 
)

Definition at line 357 of file mbuf.c.

358{
359 PushFilter *mp;
360 void *priv;
361 int res;
362
363 if (op->init != NULL)
364 {
365 res = op->init(next, init_arg, &priv);
366 if (res < 0)
367 return res;
368 }
369 else
370 {
371 priv = init_arg;
372 res = 0;
373 }
374
375 mp = palloc0(sizeof(*mp));
376 mp->block_size = res;
377 mp->op = op;
378 mp->priv = priv;
379 mp->next = next;
380 if (mp->block_size > 0)
381 {
382 mp->buf = palloc(mp->block_size);
383 mp->pos = 0;
384 }
385 else
386 {
387 mp->buf = NULL;
388 mp->pos = 0;
389 }
390 *mp_p = mp;
391 return 0;
392}
static int32 next
Definition: blutils.c:224
int(* init)(PushFilter *next, void *init_arg, void **priv_p)
Definition: mbuf.h:47
void * priv
Definition: mbuf.c:353
int pos
Definition: mbuf.c:352
PushFilter * next
Definition: mbuf.c:348
int block_size
Definition: mbuf.c:350
const PushFilterOps * op
Definition: mbuf.c:349
uint8 * buf
Definition: mbuf.c:351

References PushFilter::block_size, PushFilter::buf, PushFilterOps::init, next, PushFilter::next, PushFilter::op, palloc(), palloc0(), PushFilter::pos, and PushFilter::priv.

Referenced by init_compress(), init_encdata_packet(), init_litdata_packet(), pgp_create_pkt_writer(), pgp_encrypt(), and pushf_create_mbuf_writer().

◆ pushf_create_mbuf_writer()

int pushf_create_mbuf_writer ( PushFilter **  res,
MBuf dst 
)

Definition at line 544 of file mbuf.c.

545{
546 return pushf_create(res, &mbuf_filter, dst, NULL);
547}
int pushf_create(PushFilter **mp_p, const PushFilterOps *op, void *init_arg, PushFilter *next)
Definition: mbuf.c:357
static const struct PushFilterOps mbuf_filter
Definition: mbuf.c:539

References mbuf_filter, and pushf_create().

Referenced by pgp_encrypt().

◆ pushf_flush()

int pushf_flush ( PushFilter mp)

Definition at line 499 of file mbuf.c.

500{
501 int res;
502
503 while (mp)
504 {
505 if (mp->block_size > 0)
506 {
507 res = wrap_process(mp, mp->buf, mp->pos);
508 if (res < 0)
509 return res;
510 }
511
512 if (mp->op->flush)
513 {
514 res = mp->op->flush(mp->next, mp->priv);
515 if (res < 0)
516 return res;
517 }
518
519 mp = mp->next;
520 }
521 return 0;
522}
static int wrap_process(PushFilter *mp, const uint8 *data, int len)
Definition: mbuf.c:424
int(* flush)(PushFilter *next, void *priv)
Definition: mbuf.h:55

References PushFilter::block_size, PushFilter::buf, PushFilterOps::flush, PushFilter::next, PushFilter::op, PushFilter::pos, PushFilter::priv, and wrap_process().

Referenced by pgp_encrypt(), and pgp_write_pubenc_sesskey().

◆ pushf_free()

void pushf_free ( PushFilter mp)

Definition at line 395 of file mbuf.c.

396{
397 if (mp->op->free)
398 mp->op->free(mp->priv);
399
400 if (mp->buf)
401 {
402 px_memset(mp->buf, 0, mp->block_size);
403 pfree(mp->buf);
404 }
405
406 px_memset(mp, 0, sizeof(*mp));
407 pfree(mp);
408}
void(* free)(void *priv)
Definition: mbuf.h:56

References PushFilter::block_size, PushFilter::buf, PushFilterOps::free, PushFilter::op, pfree(), PushFilter::priv, and px_memset().

Referenced by init_compress(), init_litdata_packet(), pgp_write_pubenc_sesskey(), and pushf_free_all().

◆ pushf_free_all()

void pushf_free_all ( PushFilter mp)

Definition at line 411 of file mbuf.c.

412{
413 PushFilter *tmp;
414
415 while (mp)
416 {
417 tmp = mp->next;
418 pushf_free(mp);
419 mp = tmp;
420 }
421}
void pushf_free(PushFilter *mp)
Definition: mbuf.c:395

References PushFilter::next, and pushf_free().

Referenced by pgp_encrypt().

◆ pushf_write()

int pushf_write ( PushFilter mp,
const uint8 data,
int  len 
)

Definition at line 439 of file mbuf.c.

440{
441 int need,
442 res;
443
444 /*
445 * no buffering
446 */
447 if (mp->block_size <= 0)
448 return wrap_process(mp, data, len);
449
450 /*
451 * try to empty buffer
452 */
453 need = mp->block_size - mp->pos;
454 if (need > 0)
455 {
456 if (len < need)
457 {
458 memcpy(mp->buf + mp->pos, data, len);
459 mp->pos += len;
460 return 0;
461 }
462 memcpy(mp->buf + mp->pos, data, need);
463 len -= need;
464 data += need;
465 }
466
467 /*
468 * buffer full, process
469 */
470 res = wrap_process(mp, mp->buf, mp->block_size);
471 if (res < 0)
472 return res;
473 mp->pos = 0;
474
475 /*
476 * now process directly from data
477 */
478 while (len > 0)
479 {
480 if (len > mp->block_size)
481 {
482 res = wrap_process(mp, data, mp->block_size);
483 if (res < 0)
484 return res;
485 data += mp->block_size;
486 len -= mp->block_size;
487 }
488 else
489 {
490 memcpy(mp->buf, data, len);
491 mp->pos += len;
492 break;
493 }
494 }
495 return 0;
496}

References PushFilter::block_size, PushFilter::buf, data, len, PushFilter::pos, and wrap_process().

Referenced by crlf_process(), encrypt_init(), encrypt_process(), init_compress(), init_litdata_packet(), mdc_flush(), mdc_write(), pgp_encrypt(), pgp_mpi_write(), pgp_write_pubenc_sesskey(), pkt_stream_flush(), pkt_stream_process(), wrap_process(), write_normal_header(), write_prefix(), write_symenc_sesskey(), and write_tag_only().

◆ wrap_process()

static int wrap_process ( PushFilter mp,
const uint8 data,
int  len 
)
static

Definition at line 424 of file mbuf.c.

425{
426 int res;
427
428 if (mp->op->push != NULL)
429 res = mp->op->push(mp->next, mp->priv, data, len);
430 else
431 res = pushf_write(mp->next, data, len);
432 if (res > 0)
433 return PXE_BUG;
434 return res;
435}
int pushf_write(PushFilter *mp, const uint8 *data, int len)
Definition: mbuf.c:439
int(* push)(PushFilter *next, void *priv, const uint8 *src, int len)
Definition: mbuf.h:53

References data, len, PushFilter::next, PushFilter::op, PushFilter::priv, PushFilterOps::push, pushf_write(), and PXE_BUG.

Referenced by pushf_flush(), and pushf_write().

Variable Documentation

◆ mbuf_filter

const struct PushFilterOps mbuf_filter
static
Initial value:
= {
NULL, push_into_mbuf, NULL, NULL
}
static int push_into_mbuf(PushFilter *next, void *arg, const uint8 *data, int len)
Definition: mbuf.c:529

Definition at line 539 of file mbuf.c.

Referenced by pushf_create_mbuf_writer().

◆ mbuf_reader

const struct PullFilterOps mbuf_reader
static
Initial value:
= {
NULL, pull_from_mbuf, NULL
}
static int pull_from_mbuf(void *arg, PullFilter *src, int len, uint8 **data_p, uint8 *buf, int buflen)
Definition: mbuf.c:323

Definition at line 331 of file mbuf.c.

Referenced by pullf_create_mbuf_reader().