Use non-exiting allocators in libsudo_util.

This commit is contained in:
Todd C. Miller
2015-06-17 17:00:53 -06:00
parent ec7e467c58
commit 5ce50a885c
8 changed files with 240 additions and 137 deletions

View File

@@ -43,7 +43,6 @@
#include <ctype.h>
#include "sudo_compat.h"
#include "sudo_alloc.h"
#include "sudo_debug.h"
#include "sudo_lbuf.h"
@@ -69,43 +68,52 @@ sudo_lbuf_destroy_v1(struct sudo_lbuf *lbuf)
{
debug_decl(sudo_lbuf_destroy, SUDO_DEBUG_UTIL)
sudo_efree(lbuf->buf);
free(lbuf->buf);
lbuf->buf = NULL;
debug_return;
}
static void
static bool
sudo_lbuf_expand(struct sudo_lbuf *lbuf, int extra)
{
if (lbuf->len + extra + 1 >= lbuf->size) {
char *new_buf;
int new_size = lbuf->size;
do {
lbuf->size += 256;
} while (lbuf->len + extra + 1 >= lbuf->size);
lbuf->buf = sudo_erealloc(lbuf->buf, lbuf->size);
new_size += 256;
} while (lbuf->len + extra + 1 >= new_size);
if ((new_buf = realloc(lbuf->buf, new_size)) == NULL)
return false;
lbuf->buf = new_buf;
lbuf->size = new_size;
}
return true;
}
/*
* Parse the format and append strings, only %s and %% escapes are supported.
* Any characters in set are quoted with a backslash.
*/
void
bool
sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...)
{
va_list ap;
int len;
int len, saved_len = lbuf->len;
bool ret = false;
char *cp, *s;
va_list ap;
debug_decl(sudo_lbuf_append_quoted, SUDO_DEBUG_UTIL)
va_start(ap, fmt);
while (*fmt != '\0') {
if (fmt[0] == '%' && fmt[1] == 's') {
if ((s = va_arg(ap, char *)) == NULL)
goto done;
s = "(NULL)";
while ((cp = strpbrk(s, set)) != NULL) {
len = (int)(cp - s);
sudo_lbuf_expand(lbuf, len + 2);
if (!sudo_lbuf_expand(lbuf, len + 2))
goto done;
memcpy(lbuf->buf + lbuf->len, s, len);
lbuf->len += len;
lbuf->buf[lbuf->len++] = '\\';
@@ -114,34 +122,41 @@ sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *
}
if (*s != '\0') {
len = strlen(s);
sudo_lbuf_expand(lbuf, len);
if (!sudo_lbuf_expand(lbuf, len))
goto done;
memcpy(lbuf->buf + lbuf->len, s, len);
lbuf->len += len;
}
fmt += 2;
continue;
}
sudo_lbuf_expand(lbuf, 2);
if (!sudo_lbuf_expand(lbuf, 2))
goto done;
if (strchr(set, *fmt) != NULL)
lbuf->buf[lbuf->len++] = '\\';
lbuf->buf[lbuf->len++] = *fmt++;
}
ret = true;
done:
if (!ret)
lbuf->len = saved_len;
if (lbuf->size != 0)
lbuf->buf[lbuf->len] = '\0';
va_end(ap);
debug_return;
debug_return_bool(ret);
}
/*
* Parse the format and append strings, only %s and %% escapes are supported.
*/
void
bool
sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...)
{
int len, saved_len = lbuf->len;
bool ret = false;
va_list ap;
int len;
char *s;
debug_decl(sudo_lbuf_append, SUDO_DEBUG_UTIL)
@@ -149,23 +164,29 @@ sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...)
while (*fmt != '\0') {
if (fmt[0] == '%' && fmt[1] == 's') {
if ((s = va_arg(ap, char *)) == NULL)
goto done;
s = "(NULL)";
len = strlen(s);
sudo_lbuf_expand(lbuf, len);
if (!sudo_lbuf_expand(lbuf, len))
goto done;
memcpy(lbuf->buf + lbuf->len, s, len);
lbuf->len += len;
fmt += 2;
continue;
}
sudo_lbuf_expand(lbuf, 1);
if (!sudo_lbuf_expand(lbuf, 1))
goto done;
lbuf->buf[lbuf->len++] = *fmt++;
}
ret = true;
done:
if (!ret)
lbuf->len = saved_len;
if (lbuf->size != 0)
lbuf->buf[lbuf->len] = '\0';
va_end(ap);
debug_return;
debug_return_bool(ret);
}
static void