diff options
Diffstat (limited to 'copy_error.c')
-rw-r--r-- | copy_error.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/copy_error.c b/copy_error.c new file mode 100644 index 0000000..8d93131 --- /dev/null +++ b/copy_error.c @@ -0,0 +1,31 @@ +/* See LICENSE file for copyright and license details. */ +#include "internal.h" + + +struct liberror_error * +liberror_copy_error(struct liberror_error *src) +{ + struct liberror_error *dest; + int saved_errno; + if (!src) + return NULL; + saved_errno = errno; + dest = malloc(sizeof(*dest)); + if (dest) { + memcpy(dest, src, sizeof(*src)); + if (dest->backtrace) + dest->backtrace->refcount += 1; + dest->dynamically_allocated = 1; + if (src->cause) { + dest->cause = liberror_copy_error(src->cause); + if (!dest->cause) { + if (dest->backtrace) + dest->backtrace->refcount -= 1; + free(dest); + dest = NULL; + } + } + } + errno = saved_errno; + return dest; +} |