Error reporting for bencrypt.c - dedup - deduplicating backup program
 (HTM) git clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 9be48e61285e87fff2638f5b2acee3e15a00046c
 (DIR) parent 873ae0109133cf38b38ad3a0466bfed825462b19
 (HTM) Author: sin <sin@2f30.org>
       Date:   Fri,  3 May 2019 15:11:01 +0100
       
       Error reporting for bencrypt.c
       
       Diffstat:
         M bencrypt.c                          |      48 +++++++++++++++++++++++--------
       
       1 file changed, 36 insertions(+), 12 deletions(-)
       ---
 (DIR) diff --git a/bencrypt.c b/bencrypt.c
       @@ -99,24 +99,32 @@ becreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar)
                int type;
        
                /* Determine algorithm type */
       -        if (strcasecmp(bpar->ealgo, "none") == 0)
       +        if (strcasecmp(bpar->ealgo, "none") == 0) {
                        type = EDNONETYPE;
       -        else if (strcasecmp(bpar->ealgo, "XChaCha20-Poly1305") == 0)
       +        } else if (strcasecmp(bpar->ealgo, "XChaCha20-Poly1305") == 0) {
                        type = EDCHACHATYPE;
       -        else
       +        } else {
       +                bseterr("invalid encryption type: %s", bpar->ealgo);
                        return -1;
       +        }
        
                /* Ensure that if caller requested encryption, a key was provided */
       -        if (type != EDNONETYPE && bpar->key == NULL)
       +        if (type != EDNONETYPE && bpar->key == NULL) {
       +                bseterr("expected encryption key");
                        return -1;
       +        }
        
       -        if (sodium_init() < 0)
       +        if (sodium_init() < 0) {
       +                bseterr("crypto library failed to initialize");
                        return -1;
       +        }
        
                /* Allocate and initialize encryption context */
                bctx->ectx = calloc(1, sizeof(struct ectx));
       -        if (bctx->ectx == NULL)
       +        if (bctx->ectx == NULL) {
       +                bseterr("out of memory");
                        return -1;
       +        }
                ectx = bctx->ectx;
                ectx->type = type;
                if (bpar->key != NULL)
       @@ -138,8 +146,10 @@ beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)
        
                /* Allocate and initialize encryption context */
                bctx->ectx = calloc(1, sizeof(struct ectx));
       -        if (bctx->ectx == NULL)
       +        if (bctx->ectx == NULL) {
       +                bseterr("out of memory");
                        return -1;
       +        }
                ectx = bctx->ectx;
                if (bpar->key != NULL)
                        memcpy(ectx->key, bpar->key, KEYSIZE);
       @@ -158,6 +168,7 @@ beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)
                else {
                        bops->close(bctx);
                        free(ectx);
       +                bseterr("invalid encryption type: %s", bpar->ealgo);
                        return -1;
                }
        
       @@ -165,6 +176,7 @@ beopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar)
                if (ectx->type != EDNONETYPE && bpar->key == NULL) {
                        bops->close(bctx);
                        free(ectx);
       +                bseterr("expected encryption key");
                        return -1;
                }
        
       @@ -182,17 +194,21 @@ beput(struct bctx *bctx, void *buf, size_t n, unsigned char *md)
        
                /* Calculate size of encrypted block */
                ectx = bctx->ectx;
       -        if (ectx->type == EDNONETYPE)
       +        if (ectx->type == EDNONETYPE) {
                        en = n;
       -        else if (ectx->type == EDCHACHATYPE)
       +        } else if (ectx->type == EDCHACHATYPE) {
                        en = n + crypto_aead_xchacha20poly1305_ietf_ABYTES;
       -        else
       +        } else {
       +                bseterr("invalid encryption type: %d", ectx->type);
                        return -1;
       +        }
        
                /* Allocate encrypted block */
                ebuf = malloc(EDSIZE + en);
       -        if (ebuf == NULL)
       +        if (ebuf == NULL) {
       +                bseterr("out of memory");
                        return -1;
       +        }
        
                /* Prepend the encryption descriptor */
                ed.type = ectx->type;
       @@ -204,6 +220,7 @@ beput(struct bctx *bctx, void *buf, size_t n, unsigned char *md)
                        randombytes_buf(ed.nonce, sizeof(ed.nonce));
                } else {
                        free(ebuf);
       +                bseterr("invalid encryption type: %d", ectx->type);
                        return -1;
                }
                packed(ebuf, &ed);
       @@ -220,6 +237,7 @@ beput(struct bctx *bctx, void *buf, size_t n, unsigned char *md)
                        assert(elen == en);
                } else {
                        free(ebuf);
       +                bseterr("invalid encryption type: %d", ectx->type);
                        return -1;
                }
        
       @@ -244,8 +262,10 @@ beget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n)
                /* Calculate maximum size of encrypted block */
                size = EDSIZE + *n + crypto_aead_xchacha20poly1305_ietf_ABYTES;
                ebuf = malloc(size);
       -        if (ebuf == NULL)
       +        if (ebuf == NULL) {
       +                bseterr("out of memory");
                        return -1;
       +        }
        
                /* Read encrypted block */
                bops = bstorageops();
       @@ -261,6 +281,7 @@ beget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n)
                        dn = ed.size;
                        if (*n < dn) {
                                free(ebuf);
       +                        bseterr("buffer too small");
                                return -1;
                        }
                        memcpy(buf, &ebuf[EDSIZE], dn);
       @@ -271,6 +292,7 @@ beget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n)
                        dn = ed.size - crypto_aead_xchacha20poly1305_ietf_ABYTES;
                        if (*n < dn) {
                                free(ebuf);
       +                        bseterr("buffer too small");
                                return -1;
                        }
        
       @@ -281,12 +303,14 @@ beget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n)
                                                                       ebuf, EDSIZE,
                                                                       ed.nonce, ectx->key) < 0) {
                                free(ebuf);
       +                        bseterr("authentication or decryption failed");
                                return -1;
                        }
        
                        assert(dn == dlen);
                } else {
                        free(ebuf);
       +                bseterr("invalid encryption type: %d", ed.type);
                        return -1;
                }