aboutsummaryrefslogtreecommitdiffstats
path: root/src/b64dec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/b64dec.c')
-rw-r--r--src/b64dec.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/src/b64dec.c b/src/b64dec.c
index a8a8351..1235406 100644
--- a/src/b64dec.c
+++ b/src/b64dec.c
@@ -2,7 +2,7 @@
* Copyright (C) 2008, 2011 Free Software Foundation, Inc.
* Copyright (C) 2008, 2011, 2016 g10 Code GmbH
*
- * This file is part of GnuPG.
+ * This file is part of Libgpg-error.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
@@ -16,26 +16,18 @@
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, see <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * This file was originally a part of GnuPG.
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <assert.h>
#include "gpgrt-int.h"
-struct _gpgrt_b64state
-{
- int idx;
- int quad_count;
- char *title;
- unsigned char radbuf[4];
- int stop_seen:1;
- int invalid_encoding:1;
- gpg_error_t lasterr;
-};
/* The reverse base-64 list used for base-64 decoding. */
static unsigned char const asctobin[128] =
@@ -79,15 +71,15 @@ _gpgrt_b64dec_start (const char *title)
if (title)
{
- t = strdup (title);
+ t = xtrystrdup (title);
if (!t)
return NULL;
}
- state = calloc (1, sizeof (struct _gpgrt_b64state));
+ state = xtrycalloc (1, sizeof (struct _gpgrt_b64state));
if (!state)
{
- free (t);
+ xfree (t);
return NULL;
}
@@ -99,13 +91,15 @@ _gpgrt_b64dec_start (const char *title)
else
state->idx = s_b64_0;
+ state->using_decoder = 1;
+
return state;
}
/* Do in-place decoding of base-64 data of LENGTH in BUFFER. Stores the
new length of the buffer at R_NBYTES. */
-gpg_error_t
+gpg_err_code_t
_gpgrt_b64dec_proc (gpgrt_b64state_t state, void *buffer, size_t length,
size_t *r_nbytes)
{
@@ -120,8 +114,8 @@ _gpgrt_b64dec_proc (gpgrt_b64state_t state, void *buffer, size_t length,
if (state->stop_seen)
{
*r_nbytes = 0;
- state->lasterr = gpg_error (GPG_ERR_EOF);
- free (state->title);
+ state->lasterr = GPG_ERR_EOF;
+ xfree (state->title);
state->title = NULL;
return state->lasterr;
}
@@ -247,7 +241,7 @@ _gpgrt_b64dec_proc (gpgrt_b64state_t state, void *buffer, size_t length,
state->stop_seen = 1;
break;
default:
- assert (!"invalid state");
+ gpgrt_assert (!"invalid state");
}
}
@@ -262,17 +256,22 @@ _gpgrt_b64dec_proc (gpgrt_b64state_t state, void *buffer, size_t length,
/* Return an error code in case an encoding error has been found
during decoding. */
-gpg_error_t
+gpg_err_code_t
_gpgrt_b64dec_finish (gpgrt_b64state_t state)
{
gpg_error_t err;
- if (state->lasterr)
+ if (!state)
+ return 0; /* Already released. */
+
+ if (!state->using_decoder)
+ err = GPG_ERR_CONFLICT; /* State was allocated for the encoder. */
+ else if (state->lasterr)
err = state->lasterr;
else
{
free (state->title);
- err = state->invalid_encoding? gpg_error(GPG_ERR_BAD_DATA): 0;
+ err = state->invalid_encoding? GPG_ERR_BAD_DATA : 0;
}
free (state);