LCOV - code coverage report
Current view: top level - evp - bio_enc.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 121 169 71.6 %
Date: 2014-08-02 Functions: 6 8 75.0 %
Branches: 42 92 45.7 %

           Branch data     Line data    Source code
       1                 :            : /* crypto/evp/bio_enc.c */
       2                 :            : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
       3                 :            :  * All rights reserved.
       4                 :            :  *
       5                 :            :  * This package is an SSL implementation written
       6                 :            :  * by Eric Young (eay@cryptsoft.com).
       7                 :            :  * The implementation was written so as to conform with Netscapes SSL.
       8                 :            :  * 
       9                 :            :  * This library is free for commercial and non-commercial use as long as
      10                 :            :  * the following conditions are aheared to.  The following conditions
      11                 :            :  * apply to all code found in this distribution, be it the RC4, RSA,
      12                 :            :  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
      13                 :            :  * included with this distribution is covered by the same copyright terms
      14                 :            :  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
      15                 :            :  * 
      16                 :            :  * Copyright remains Eric Young's, and as such any Copyright notices in
      17                 :            :  * the code are not to be removed.
      18                 :            :  * If this package is used in a product, Eric Young should be given attribution
      19                 :            :  * as the author of the parts of the library used.
      20                 :            :  * This can be in the form of a textual message at program startup or
      21                 :            :  * in documentation (online or textual) provided with the package.
      22                 :            :  * 
      23                 :            :  * Redistribution and use in source and binary forms, with or without
      24                 :            :  * modification, are permitted provided that the following conditions
      25                 :            :  * are met:
      26                 :            :  * 1. Redistributions of source code must retain the copyright
      27                 :            :  *    notice, this list of conditions and the following disclaimer.
      28                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      29                 :            :  *    notice, this list of conditions and the following disclaimer in the
      30                 :            :  *    documentation and/or other materials provided with the distribution.
      31                 :            :  * 3. All advertising materials mentioning features or use of this software
      32                 :            :  *    must display the following acknowledgement:
      33                 :            :  *    "This product includes cryptographic software written by
      34                 :            :  *     Eric Young (eay@cryptsoft.com)"
      35                 :            :  *    The word 'cryptographic' can be left out if the rouines from the library
      36                 :            :  *    being used are not cryptographic related :-).
      37                 :            :  * 4. If you include any Windows specific code (or a derivative thereof) from 
      38                 :            :  *    the apps directory (application code) you must include an acknowledgement:
      39                 :            :  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
      40                 :            :  * 
      41                 :            :  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
      42                 :            :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      43                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      44                 :            :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
      45                 :            :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      46                 :            :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      47                 :            :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      48                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      49                 :            :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      50                 :            :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      51                 :            :  * SUCH DAMAGE.
      52                 :            :  * 
      53                 :            :  * The licence and distribution terms for any publically available version or
      54                 :            :  * derivative of this code cannot be changed.  i.e. this code cannot simply be
      55                 :            :  * copied and put under another distribution licence
      56                 :            :  * [including the GNU Public Licence.]
      57                 :            :  */
      58                 :            : 
      59                 :            : #include <stdio.h>
      60                 :            : #include <errno.h>
      61                 :            : #include "cryptlib.h"
      62                 :            : #include <openssl/buffer.h>
      63                 :            : #include <openssl/evp.h>
      64                 :            : 
      65                 :            : static int enc_write(BIO *h, const char *buf, int num);
      66                 :            : static int enc_read(BIO *h, char *buf, int size);
      67                 :            : /*static int enc_puts(BIO *h, const char *str); */
      68                 :            : /*static int enc_gets(BIO *h, char *str, int size); */
      69                 :            : static long enc_ctrl(BIO *h, int cmd, long arg1, void *arg2);
      70                 :            : static int enc_new(BIO *h);
      71                 :            : static int enc_free(BIO *data);
      72                 :            : static long enc_callback_ctrl(BIO *h, int cmd, bio_info_cb *fps);
      73                 :            : #define ENC_BLOCK_SIZE  (1024*4)
      74                 :            : #define BUF_OFFSET      (EVP_MAX_BLOCK_LENGTH*2)
      75                 :            : 
      76                 :            : typedef struct enc_struct
      77                 :            :         {
      78                 :            :         int buf_len;
      79                 :            :         int buf_off;
      80                 :            :         int cont;               /* <= 0 when finished */
      81                 :            :         int finished;
      82                 :            :         int ok;                 /* bad decrypt */
      83                 :            :         EVP_CIPHER_CTX cipher;
      84                 :            :         /* buf is larger than ENC_BLOCK_SIZE because EVP_DecryptUpdate
      85                 :            :          * can return up to a block more data than is presented to it
      86                 :            :          */
      87                 :            :         char buf[ENC_BLOCK_SIZE+BUF_OFFSET+2];
      88                 :            :         } BIO_ENC_CTX;
      89                 :            : 
      90                 :            : static BIO_METHOD methods_enc=
      91                 :            :         {
      92                 :            :         BIO_TYPE_CIPHER,"cipher",
      93                 :            :         enc_write,
      94                 :            :         enc_read,
      95                 :            :         NULL, /* enc_puts, */
      96                 :            :         NULL, /* enc_gets, */
      97                 :            :         enc_ctrl,
      98                 :            :         enc_new,
      99                 :            :         enc_free,
     100                 :            :         enc_callback_ctrl,
     101                 :            :         };
     102                 :            : 
     103                 :        278 : BIO_METHOD *BIO_f_cipher(void)
     104                 :            :         {
     105                 :        278 :         return(&methods_enc);
     106                 :            :         }
     107                 :            : 
     108                 :        278 : static int enc_new(BIO *bi)
     109                 :            :         {
     110                 :            :         BIO_ENC_CTX *ctx;
     111                 :            : 
     112                 :        278 :         ctx=(BIO_ENC_CTX *)OPENSSL_malloc(sizeof(BIO_ENC_CTX));
     113         [ +  - ]:        278 :         if (ctx == NULL) return(0);
     114                 :        278 :         EVP_CIPHER_CTX_init(&ctx->cipher);
     115                 :            : 
     116                 :        278 :         ctx->buf_len=0;
     117                 :        278 :         ctx->buf_off=0;
     118                 :        278 :         ctx->cont=1;
     119                 :        278 :         ctx->finished=0;
     120                 :        278 :         ctx->ok=1;
     121                 :            : 
     122                 :        278 :         bi->init=0;
     123                 :        278 :         bi->ptr=(char *)ctx;
     124                 :        278 :         bi->flags=0;
     125                 :        278 :         return(1);
     126                 :            :         }
     127                 :            : 
     128                 :        278 : static int enc_free(BIO *a)
     129                 :            :         {
     130                 :            :         BIO_ENC_CTX *b;
     131                 :            : 
     132         [ +  - ]:        278 :         if (a == NULL) return(0);
     133                 :        278 :         b=(BIO_ENC_CTX *)a->ptr;
     134                 :        278 :         EVP_CIPHER_CTX_cleanup(&(b->cipher));
     135                 :        278 :         OPENSSL_cleanse(a->ptr,sizeof(BIO_ENC_CTX));
     136                 :        278 :         OPENSSL_free(a->ptr);
     137                 :        278 :         a->ptr=NULL;
     138                 :        278 :         a->init=0;
     139                 :        278 :         a->flags=0;
     140                 :        278 :         return(1);
     141                 :            :         }
     142                 :            :         
     143                 :         50 : static int enc_read(BIO *b, char *out, int outl)
     144                 :            :         {
     145                 :         50 :         int ret=0,i;
     146                 :            :         BIO_ENC_CTX *ctx;
     147                 :            : 
     148         [ +  - ]:         50 :         if (out == NULL) return(0);
     149                 :         50 :         ctx=(BIO_ENC_CTX *)b->ptr;
     150                 :            : 
     151 [ +  - ][ +  - ]:         50 :         if ((ctx == NULL) || (b->next_bio == NULL)) return(0);
     152                 :            : 
     153                 :            :         /* First check if there are bytes decoded/encoded */
     154         [ +  + ]:         50 :         if (ctx->buf_len > 0)
     155                 :            :                 {
     156                 :         25 :                 i=ctx->buf_len-ctx->buf_off;
     157         [ -  + ]:         25 :                 if (i > outl) i=outl;
     158                 :         25 :                 memcpy(out,&(ctx->buf[ctx->buf_off]),i);
     159                 :         25 :                 ret=i;
     160                 :         25 :                 out+=i;
     161                 :         25 :                 outl-=i;
     162                 :         25 :                 ctx->buf_off+=i;
     163         [ +  - ]:         25 :                 if (ctx->buf_len == ctx->buf_off)
     164                 :            :                         {
     165                 :         25 :                         ctx->buf_len=0;
     166                 :         50 :                         ctx->buf_off=0;
     167                 :            :                         }
     168                 :            :                 }
     169                 :            : 
     170                 :            :         /* At this point, we have room of outl bytes and an empty
     171                 :            :          * buffer, so we should read in some more. */
     172                 :            : 
     173         [ +  - ]:        100 :         while (outl > 0)
     174                 :            :                 {
     175         [ +  + ]:        100 :                 if (ctx->cont <= 0) break;
     176                 :            : 
     177                 :            :                 /* read in at IV offset, read the EVP_Cipher
     178                 :            :                  * documentation about why */
     179                 :         50 :                 i=BIO_read(b->next_bio,&(ctx->buf[BUF_OFFSET]),ENC_BLOCK_SIZE);
     180                 :            : 
     181         [ +  + ]:         50 :                 if (i <= 0)
     182                 :            :                         {
     183                 :            :                         /* Should be continue next time we are called? */
     184         [ +  - ]:         25 :                         if (!BIO_should_retry(b->next_bio))
     185                 :            :                                 {
     186                 :         25 :                                 ctx->cont=i;
     187                 :         25 :                                 i=EVP_CipherFinal_ex(&(ctx->cipher),
     188                 :         25 :                                         (unsigned char *)ctx->buf,
     189                 :            :                                         &(ctx->buf_len));
     190                 :         25 :                                 ctx->ok=i;
     191                 :         25 :                                 ctx->buf_off=0;
     192                 :            :                                 }
     193                 :            :                         else 
     194                 :            :                                 {
     195         [ #  # ]:          0 :                                 ret=(ret == 0)?i:ret;
     196                 :          0 :                                 break;
     197                 :            :                                 }
     198                 :            :                         }
     199                 :            :                 else
     200                 :            :                         {
     201         [ -  + ]:         25 :                         if (!EVP_CipherUpdate(&(ctx->cipher),
     202                 :         25 :                                 (unsigned char *)ctx->buf,&ctx->buf_len,
     203                 :            :                                 (unsigned char *)&(ctx->buf[BUF_OFFSET]),i))
     204                 :            :                                 {
     205                 :          0 :                                 BIO_clear_retry_flags(b);
     206                 :          0 :                                 return 0;
     207                 :            :                                 }       
     208                 :         25 :                         ctx->cont=1;
     209                 :            :                         /* Note: it is possible for EVP_CipherUpdate to
     210                 :            :                          * decrypt zero bytes because this is or looks like
     211                 :            :                          * the final block: if this happens we should retry
     212                 :            :                          * and either read more data or decrypt the final
     213                 :            :                          * block
     214                 :            :                          */
     215         [ -  + ]:         25 :                         if(ctx->buf_len == 0) continue;
     216                 :            :                         }
     217                 :            : 
     218         [ -  + ]:         50 :                 if (ctx->buf_len <= outl)
     219                 :            :                         i=ctx->buf_len;
     220                 :            :                 else
     221                 :          0 :                         i=outl;
     222         [ +  - ]:         50 :                 if (i <= 0) break;
     223                 :         50 :                 memcpy(out,ctx->buf,i);
     224                 :         50 :                 ret+=i;
     225                 :         50 :                 ctx->buf_off=i;
     226                 :         50 :                 outl-=i;
     227                 :         50 :                 out+=i;
     228                 :            :                 }
     229                 :            : 
     230                 :         50 :         BIO_clear_retry_flags(b);
     231                 :         50 :         BIO_copy_next_retry(b);
     232         [ +  + ]:         50 :         return((ret == 0)?ctx->cont:ret);
     233                 :            :         }
     234                 :            : 
     235                 :       1982 : static int enc_write(BIO *b, const char *in, int inl)
     236                 :            :         {
     237                 :       1982 :         int ret=0,n,i;
     238                 :            :         BIO_ENC_CTX *ctx;
     239                 :            : 
     240                 :       1982 :         ctx=(BIO_ENC_CTX *)b->ptr;
     241                 :       1982 :         ret=inl;
     242                 :            : 
     243                 :       1982 :         BIO_clear_retry_flags(b);
     244                 :       1982 :         n=ctx->buf_len-ctx->buf_off;
     245         [ +  + ]:       2115 :         while (n > 0)
     246                 :            :                 {
     247                 :        133 :                 i=BIO_write(b->next_bio,&(ctx->buf[ctx->buf_off]),n);
     248         [ -  + ]:        133 :                 if (i <= 0)
     249                 :            :                         {
     250                 :          0 :                         BIO_copy_next_retry(b);
     251                 :          0 :                         return(i);
     252                 :            :                         }
     253                 :        133 :                 ctx->buf_off+=i;
     254                 :        133 :                 n-=i;
     255                 :            :                 }
     256                 :            :         /* at this point all pending data has been written */
     257                 :            : 
     258         [ +  + ]:       1982 :         if ((in == NULL) || (inl <= 0)) return(0);
     259                 :            : 
     260                 :       1849 :         ctx->buf_off=0;
     261         [ +  + ]:       3698 :         while (inl > 0)
     262                 :            :                 {
     263                 :       1849 :                 n=(inl > ENC_BLOCK_SIZE)?ENC_BLOCK_SIZE:inl;
     264         [ -  + ]:       1849 :                 if (!EVP_CipherUpdate(&(ctx->cipher),
     265                 :       1849 :                         (unsigned char *)ctx->buf,&ctx->buf_len,
     266                 :            :                         (unsigned char *)in,n))
     267                 :            :                         {
     268                 :          0 :                         BIO_clear_retry_flags(b);
     269                 :          0 :                         return 0;
     270                 :            :                         }
     271                 :       1849 :                 inl-=n;
     272                 :       1849 :                 in+=n;
     273                 :            : 
     274                 :       1849 :                 ctx->buf_off=0;
     275                 :       1849 :                 n=ctx->buf_len;
     276         [ +  + ]:       3698 :                 while (n > 0)
     277                 :            :                         {
     278                 :       1849 :                         i=BIO_write(b->next_bio,&(ctx->buf[ctx->buf_off]),n);
     279         [ -  + ]:       1849 :                         if (i <= 0)
     280                 :            :                                 {
     281                 :          0 :                                 BIO_copy_next_retry(b);
     282         [ #  # ]:          0 :                                 return (ret == inl) ? i : ret - inl;
     283                 :            :                                 }
     284                 :       1849 :                         n-=i;
     285                 :       1849 :                         ctx->buf_off+=i;
     286                 :            :                         }
     287                 :       1849 :                 ctx->buf_len=0;
     288                 :       1849 :                 ctx->buf_off=0;
     289                 :            :                 }
     290                 :       1849 :         BIO_copy_next_retry(b);
     291                 :       1849 :         return(ret);
     292                 :            :         }
     293                 :            : 
     294                 :        934 : static long enc_ctrl(BIO *b, int cmd, long num, void *ptr)
     295                 :            :         {
     296                 :            :         BIO *dbio;
     297                 :            :         BIO_ENC_CTX *ctx,*dctx;
     298                 :        934 :         long ret=1;
     299                 :            :         int i;
     300                 :            :         EVP_CIPHER_CTX **c_ctx;
     301                 :            : 
     302                 :        934 :         ctx=(BIO_ENC_CTX *)b->ptr;
     303                 :            : 
     304   [ +  -  -  -  :        934 :         switch (cmd)
          -  +  -  +  -  
                      + ]
     305                 :            :                 {
     306                 :            :         case BIO_CTRL_RESET:
     307                 :          0 :                 ctx->ok=1;
     308                 :          0 :                 ctx->finished=0;
     309         [ #  # ]:          0 :                 if (!EVP_CipherInit_ex(&(ctx->cipher),NULL,NULL,NULL,NULL,
     310                 :            :                         ctx->cipher.encrypt))
     311                 :            :                         return 0;
     312                 :          0 :                 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
     313                 :          0 :                 break;
     314                 :            :         case BIO_CTRL_EOF:      /* More to read */
     315         [ #  # ]:          0 :                 if (ctx->cont <= 0)
     316                 :            :                         ret=1;
     317                 :            :                 else
     318                 :          0 :                         ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
     319                 :            :                 break;
     320                 :            :         case BIO_CTRL_WPENDING:
     321                 :          0 :                 ret=ctx->buf_len-ctx->buf_off;
     322         [ #  # ]:          0 :                 if (ret <= 0)
     323                 :          0 :                         ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
     324                 :            :                 break;
     325                 :            :         case BIO_CTRL_PENDING: /* More to read in buffer */
     326                 :          0 :                 ret=ctx->buf_len-ctx->buf_off;
     327         [ #  # ]:          0 :                 if (ret <= 0)
     328                 :          0 :                         ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
     329                 :            :                 break;
     330                 :            :         case BIO_CTRL_FLUSH:
     331                 :            :                 /* do a final write */
     332                 :            : again:
     333         [ +  + ]:        664 :                 while (ctx->buf_len != ctx->buf_off)
     334                 :            :                         {
     335                 :        133 :                         i=enc_write(b,NULL,0);
     336         [ -  + ]:        133 :                         if (i < 0)
     337                 :        386 :                                 return i;
     338                 :            :                         }
     339                 :            : 
     340         [ +  + ]:        531 :                 if (!ctx->finished)
     341                 :            :                         {
     342                 :        253 :                         ctx->finished=1;
     343                 :        253 :                         ctx->buf_off=0;
     344                 :        253 :                         ret=EVP_CipherFinal_ex(&(ctx->cipher),
     345                 :        253 :                                 (unsigned char *)ctx->buf,
     346                 :            :                                 &(ctx->buf_len));
     347                 :        253 :                         ctx->ok=(int)ret;
     348         [ +  - ]:        253 :                         if (ret <= 0) break;
     349                 :            : 
     350                 :            :                         /* push out the bytes */
     351                 :            :                         goto again;
     352                 :            :                         }
     353                 :            :                 
     354                 :            :                 /* Finally flush the underlying BIO */
     355                 :        278 :                 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
     356                 :        278 :                 break;
     357                 :            :         case BIO_C_GET_CIPHER_STATUS:
     358                 :         25 :                 ret=(long)ctx->ok;
     359                 :         25 :                 break;
     360                 :            :         case BIO_C_DO_STATE_MACHINE:
     361                 :          0 :                 BIO_clear_retry_flags(b);
     362                 :          0 :                 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
     363                 :          0 :                 BIO_copy_next_retry(b);
     364                 :          0 :                 break;
     365                 :            :         case BIO_C_GET_CIPHER_CTX:
     366                 :        278 :                 c_ctx=(EVP_CIPHER_CTX **)ptr;
     367                 :        278 :                 (*c_ctx)= &(ctx->cipher);
     368                 :        278 :                 b->init=1;
     369                 :        278 :                 break;
     370                 :            :         case BIO_CTRL_DUP:
     371                 :          0 :                 dbio=(BIO *)ptr;
     372                 :          0 :                 dctx=(BIO_ENC_CTX *)dbio->ptr;
     373                 :          0 :                 EVP_CIPHER_CTX_init(&dctx->cipher);
     374                 :          0 :                 ret = EVP_CIPHER_CTX_copy(&dctx->cipher,&ctx->cipher);
     375         [ #  # ]:          0 :                 if (ret)
     376                 :          0 :                         dbio->init=1;
     377                 :            :                 break;
     378                 :            :         default:
     379                 :        353 :                 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
     380                 :        353 :                 break;
     381                 :            :                 }
     382                 :        934 :         return(ret);
     383                 :            :         }
     384                 :            : 
     385                 :          0 : static long enc_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp)
     386                 :            :         {
     387                 :          0 :         long ret=1;
     388                 :            : 
     389         [ #  # ]:          0 :         if (b->next_bio == NULL) return(0);
     390                 :            :         switch (cmd)
     391                 :            :                 {
     392                 :            :         default:
     393                 :          0 :                 ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
     394                 :            :                 break;
     395                 :            :                 }
     396                 :          0 :         return(ret);
     397                 :            :         }
     398                 :            : 
     399                 :            : /*
     400                 :            : void BIO_set_cipher_ctx(b,c)
     401                 :            : BIO *b;
     402                 :            : EVP_CIPHER_ctx *c;
     403                 :            :         {
     404                 :            :         if (b == NULL) return;
     405                 :            : 
     406                 :            :         if ((b->callback != NULL) &&
     407                 :            :                 (b->callback(b,BIO_CB_CTRL,(char *)c,BIO_CTRL_SET,e,0L) <= 0))
     408                 :            :                 return;
     409                 :            : 
     410                 :            :         b->init=1;
     411                 :            :         ctx=(BIO_ENC_CTX *)b->ptr;
     412                 :            :         memcpy(ctx->cipher,c,sizeof(EVP_CIPHER_CTX));
     413                 :            :         
     414                 :            :         if (b->callback != NULL)
     415                 :            :                 b->callback(b,BIO_CB_CTRL,(char *)c,BIO_CTRL_SET,e,1L);
     416                 :            :         }
     417                 :            : */
     418                 :            : 
     419                 :          0 : int BIO_set_cipher(BIO *b, const EVP_CIPHER *c, const unsigned char *k,
     420                 :            :              const unsigned char *i, int e)
     421                 :            :         {
     422                 :            :         BIO_ENC_CTX *ctx;
     423                 :            : 
     424         [ #  # ]:          0 :         if (b == NULL) return 0;
     425                 :            : 
     426   [ #  #  #  # ]:          0 :         if ((b->callback != NULL) &&
     427                 :          0 :                 (b->callback(b,BIO_CB_CTRL,(const char *)c,BIO_CTRL_SET,e,0L) <= 0))
     428                 :            :                 return 0;
     429                 :            : 
     430                 :          0 :         b->init=1;
     431                 :          0 :         ctx=(BIO_ENC_CTX *)b->ptr;
     432         [ #  # ]:          0 :         if (!EVP_CipherInit_ex(&(ctx->cipher),c,NULL, k,i,e))
     433                 :            :                 return 0;
     434                 :            :         
     435         [ #  # ]:          0 :         if (b->callback != NULL)
     436                 :          0 :                 return b->callback(b,BIO_CB_CTRL,(const char *)c,BIO_CTRL_SET,e,1L);
     437                 :            :         return 1;
     438                 :            :         }
     439                 :            : 

Generated by: LCOV version 1.9