---
name: "libressl-BIO_s_mem"
section: "3"
platform: "linux"
package: "libressl"
version: "4.4.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/libressl-BIO_s_mem"
---

# libressl-BIO\_s\_mem(3)

memory BIO

## NAME

**BIO\_s\_mem**, **BIO\_set\_mem\_eof\_return**, **BIO\_get\_mem\_data**, **BIO\_set\_mem\_buf**, **BIO\_get\_mem\_ptr**, **BIO\_new\_mem\_buf** – memory BIO

## SYNOPSIS

Crypto Library (libcrypto, -lcrypto)

**#include \<openssl/bio.h\>**

*const* *BIO\_METHOD* *\**\

**BIO\_s\_mem**(*void*);

*long*\

**BIO\_set\_mem\_eof\_return**(*BIO \*b*, *int v*);

*long*\

**BIO\_get\_mem\_data**(*BIO \*b*, *char \*\*pp*);

*long*\

**BIO\_set\_mem\_buf**(*BIO \*b*, *BUF\_MEM \*bm*, *int c*);

*long*\

**BIO\_get\_mem\_ptr**(*BIO \*b*, *BUF\_MEM \*\*pp*);

*BIO* *\**\

**BIO\_new\_mem\_buf**(*const void \*buf*, *int len*);

## DESCRIPTION

**BIO\_s\_mem**() returns the memory BIO method function.

A memory BIO is a source/sink BIO which uses memory for its I/O. Data written to a memory BIO is stored in a *BUF\_MEM* structure which is extended as appropriate to accommodate the stored data.

Any data written to a memory BIO can be recalled by reading from it. Unless the memory BIO is read only, any data read from it is deleted from the BIO. To find out whether a memory BIO is read only, BIO\_test\_flags(3) can be called with an argument of BIO\_FLAGS\_MEM\_RDONLY.

Memory BIOs support BIO\_gets(3) and BIO\_puts(3).

If the BIO\_CLOSE flag is set when a memory BIO is freed, the underlying BUF\_MEM structure is also freed.

Calling BIO\_reset(3) on a read/write memory BIO clears any data in it. On a read only BIO it restores the BIO to its original state and the read only data can be read again.

BIO\_eof(3) is true if no data is in the BIO.

BIO\_ctrl\_pending(3) returns the number of bytes currently stored.

**BIO\_set\_mem\_eof\_return**() sets the behaviour of memory BIO *b* when it is empty. If *v* is zero, then an empty memory BIO will return EOF: it will return zero and **BIO\_should\_retry**() will be false. If *v* is non-zero then it will return *v* when it is empty and it will set the read retry flag: **BIO\_read\_retry**() is true. To avoid ambiguity with a normal positive return value *v* should be set to a negative value, typically -1.

**BIO\_get\_mem\_data**() sets \**pp* to a pointer to the start of the memory BIO's data and returns the total amount of data available.

**BIO\_set\_mem\_buf**() sets the internal BUF\_MEM structure to *bm* and sets the close flag to *c*. That is, *c* should be either BIO\_CLOSE or BIO\_NOCLOSE.

**BIO\_get\_mem\_ptr**() places the underlying *BUF\_MEM* structure in \**pp*.

**BIO\_new\_mem\_buf**() creates a memory BIO using *len* bytes of data at *buf*. If *len* is -1, then *buf* is assumed to be NUL terminated and its length is determined by [strlen(3)](/strlen/3.md). The BIO is set to a read only state and as a result cannot be written to. This is useful when some data needs to be made available from a static area of memory in the form of a BIO. The supplied data is read directly from the supplied buffer: it is *not* copied first, so the supplied area of memory must be unchanged until the BIO is freed.

Writes to memory BIOs will always succeed if memory is available: their size can grow indefinitely.

BIO\_ctrl(3) *cmd* arguments correspond to macros as follows:

| | |
| --- | --- |
| *cmd* constant | corresponding macro |
| BIO\_C\_GET\_BUF\_MEM\_PTR | **BIO\_get\_mem\_ptr**() |
| BIO\_C\_SET\_BUF\_MEM | **BIO\_set\_mem\_buf**() |
| BIO\_C\_SET\_BUF\_MEM\_EOF\_RETURN | **BIO\_set\_mem\_eof\_return**() |
| BIO\_CTRL\_EOF | BIO\_eof(3) |
| BIO\_CTRL\_GET\_CLOSE | BIO\_get\_close(3) |
| BIO\_CTRL\_INFO | **BIO\_get\_mem\_data**() |
| BIO\_CTRL\_PENDING | BIO\_pending(3) |
| BIO\_CTRL\_RESET | BIO\_reset(3) |
| BIO\_CTRL\_SET\_CLOSE | BIO\_set\_close(3) |
| BIO\_CTRL\_WPENDING | BIO\_wpending(3) |

## RETURN VALUES

**BIO\_s\_mem**() returns a pointer to a static object.

When called on a memory BIO object, BIO\_method\_type(3) returns the constant BIO\_TYPE\_MEM and BIO\_method\_name(3) returns a pointer to the static string "memory buffer".

**BIO\_set\_mem\_eof\_return**(), **BIO\_set\_mem\_buf**(), and **BIO\_get\_mem\_ptr**() return 1 on success or a value less than or equal to 0 if an error occurred.

**BIO\_get\_mem\_data**() returns the number of bytes available for reading at \**ptr* on success, or a value less than or equal to zero if an error occurs. Error conditions include that *b* is NULL, no data is available, or any error of BIO\_ctrl(3), including error returns of a callback called with a BIO\_CB\_CTRL or BIO\_CB\_CTRL\|BIO\_CB\_RETURN operation.

**BIO\_new\_mem\_buf**() returns a newly allocated *BIO* object on success or NULL on error.

## EXAMPLES

Create a memory BIO and write some data to it:

```
BIO *mem = BIO_new(BIO_s_mem());
BIO_puts(mem, "Hello World\n");
```

Create a read only memory BIO:

```
char data[] = "Hello World";
BIO *mem;
mem = BIO_new_mem_buf(data, -1);
```

Extract the *BUF\_MEM* structure from a memory BIO and then free up the BIO:

```
BUF_MEM *bptr;
BIO_get_mem_ptr(mem, &bptr);
/* Make sure BIO_free() leaves BUF_MEM alone. */
BIO_set_close(mem, BIO_NOCLOSE);
BIO_free(mem);
```

## SEE ALSO

BIO\_new(3), BUF\_MEM\_new(3)

## HISTORY

**BIO\_s\_mem**() first appeared in SSLeay 0.6.0. **BIO\_set\_mem\_buf**() and **BIO\_get\_mem\_ptr**() first appeared in SSLeay 0.6.5. These functions have been available since OpenBSD 2.4.

**BIO\_set\_mem\_eof\_return**() and **BIO\_get\_mem\_data**() first appeared in SSLeay 0.9.1 and have been available since OpenBSD 2.6.

**BIO\_new\_mem\_buf**() first appeared in OpenSSL 0.9.5 and has been available since OpenBSD 2.7.

## CAVEATS

Do not manually switch a writable memory BIO to read-only mode: calling BIO\_set\_flags(3) with an argument of BIO\_FLAGS\_MEM\_RDONLY will ultimately result in a memory leak when the BIO object is finally handed to BIO\_free(3). It might also cause security issues because it prevents BIO\_reset(3) from clearing the data.

## BUGS

There should be an option to set the maximum size of a memory BIO.

There should be a way to "rewind" a read/write BIO without destroying its contents.
