Use non-exiting allocators in libsudo_util.
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user