LCOV - code coverage report
Current view: top level - src - iobuf.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 86 99 86.9 %
Date: 2022-12-03 01:09:05 Functions: 20 23 87.0 %

          Line data    Source code
       1             : #include "burp.h"
       2             : #include "alloc.h"
       3             : #include "cmd.h"
       4             : #include "iobuf.h"
       5             : #include "log.h"
       6             : #include "msg.h"
       7             : #include "pathcmp.h"
       8             : 
       9         259 : struct iobuf *iobuf_alloc(void)
      10             : {
      11             :         struct iobuf *iobuf;
      12         259 :         if(!(iobuf=(struct iobuf *)calloc_w(1, sizeof(struct iobuf), __func__)))
      13             :                 return NULL;
      14         259 :         iobuf_init(iobuf);
      15         259 :         return iobuf;
      16             : }
      17             : 
      18         330 : void iobuf_set(struct iobuf *iobuf, enum cmd cmd, char *buf, size_t len)
      19             : {
      20      609197 :         iobuf->cmd=cmd;
      21      609197 :         iobuf->buf=buf;
      22      609197 :         iobuf->len=len;
      23         330 : }
      24             : 
      25      129628 : void iobuf_init(struct iobuf *iobuf)
      26             : {
      27      530738 :         iobuf_set(iobuf, CMD_ERROR, NULL, 0);
      28      129628 : }
      29             : 
      30      400593 : void iobuf_free_content(struct iobuf *iobuf)
      31             : {
      32      400593 :         if(!iobuf) return;
      33      400851 :         free_w(&iobuf->buf);
      34             :         iobuf_init(iobuf);
      35             : }
      36             : 
      37         262 : void iobuf_free(struct iobuf **iobuf)
      38             : {
      39         262 :         if(!iobuf || !*iobuf) return;
      40         518 :         iobuf_free_content(*iobuf);
      41         259 :         free_v((void **)iobuf);
      42             : }
      43             : 
      44           9 : void iobuf_log_unexpected(struct iobuf *iobuf, const char *func)
      45             : {
      46           9 :         logp("unexpected command in %s(): %s\n",
      47             :                 func, iobuf_to_printable(iobuf));
      48           9 : }
      49             : 
      50         122 : void iobuf_copy(struct iobuf *dst, struct iobuf *src)
      51             : {
      52      117116 :         iobuf_set(dst, src->cmd, src->buf, src->len);
      53         122 : }
      54             : 
      55       58436 : void iobuf_move(struct iobuf *dst, struct iobuf *src)
      56             : {
      57       58436 :         iobuf_copy(dst, src);
      58       58436 :         src->buf=NULL;
      59       58436 : }
      60             : 
      61       19571 : void iobuf_from_str(struct iobuf *iobuf, enum cmd cmd, char *str)
      62             : {
      63       39142 :         iobuf_set(iobuf, cmd, str, strlen(str));
      64       19571 : }
      65             : 
      66       38022 : int iobuf_send_msg_fzp(struct iobuf *iobuf, struct fzp *fzp)
      67             : {
      68       38022 :         return send_msg_fzp(fzp, iobuf->cmd, iobuf->buf, iobuf->len);
      69             : }
      70             : 
      71       99199 : int iobuf_pathcmp(struct iobuf *a, struct iobuf *b)
      72             : {
      73             :         int r;
      74       99199 :         if((r=pathcmp(a->buf, b->buf))) return r;
      75       96232 :         if(a->cmd==CMD_METADATA || a->cmd==CMD_ENC_METADATA)
      76             :         {
      77          36 :                 if(b->cmd==CMD_METADATA || b->cmd==CMD_ENC_METADATA) return 0;
      78          10 :                 else return 1;
      79             :         }
      80       96196 :         else if(a->cmd==CMD_VSS || a->cmd==CMD_ENC_VSS)
      81             :         {
      82          20 :                 if(b->cmd==CMD_VSS || b->cmd==CMD_ENC_VSS) return 0;
      83           0 :                 else return -1;
      84             :         }
      85       96176 :         else if(a->cmd==CMD_VSS_T || a->cmd==CMD_ENC_VSS_T)
      86             :         {
      87          16 :                 if(b->cmd==CMD_VSS_T || b->cmd==CMD_ENC_VSS_T) return 0;
      88           8 :                 else return 1;
      89             :         }
      90             :         else
      91             :         {
      92       96160 :                 if(b->cmd==CMD_METADATA || b->cmd==CMD_ENC_METADATA) return -1;
      93       96156 :                 else if(b->cmd==CMD_VSS || b->cmd==CMD_ENC_VSS) return 1;
      94       96154 :                 else if(b->cmd==CMD_VSS_T || b->cmd==CMD_ENC_VSS_T) return -1;
      95       96154 :                 else return 0;
      96             :         }
      97             : }
      98             : 
      99       32761 : int iobuf_is_filedata(struct iobuf *iobuf)
     100             : {
     101       32761 :         return cmd_is_filedata(iobuf->cmd);
     102             : }
     103             : 
     104        5159 : int iobuf_is_vssdata(struct iobuf *iobuf)
     105             : {
     106        5159 :         return cmd_is_vssdata(iobuf->cmd);
     107             : }
     108             : 
     109          26 : int iobuf_is_link(struct iobuf *iobuf)
     110             : {
     111          26 :         return cmd_is_link(iobuf->cmd);
     112             : }
     113             : 
     114          38 : int iobuf_is_encrypted(struct iobuf *iobuf)
     115             : {
     116          38 :         return cmd_is_encrypted(iobuf->cmd);
     117             : }
     118             : 
     119           0 : int iobuf_is_metadata(struct iobuf *iobuf)
     120             : {
     121           0 :         return cmd_is_metadata(iobuf->cmd);
     122             : }
     123             : 
     124           0 : int iobuf_is_estimatable(struct iobuf *iobuf)
     125             : {
     126           0 :         return cmd_is_estimatable(iobuf->cmd);
     127             : }
     128             : 
     129       45461 : static int do_iobuf_fill_from_fzp(struct iobuf *iobuf, struct fzp *fzp,
     130             :         int extra_bytes)
     131             : {
     132             :         unsigned int s;
     133       45461 :         char lead[6]="";
     134             :         char command;
     135             :         int r;
     136             : 
     137       45461 :         r=fzp_read_ensure(fzp, lead, sizeof(lead)-1, __func__);
     138       45461 :         lead[5]='\0';
     139       45461 :         switch(r)
     140             :         {
     141             :                 case 0: break; // OK.
     142             :                 case 1: return 1; // Finished OK.
     143             :                 default:
     144             :                 {
     145           7 :                         logp("Error reading lead in %s\n", __func__);
     146           7 :                         return -1; // Error.
     147             :                 }
     148             :         }
     149       45361 :         if((sscanf(lead, "%c%04X", &command, &s))!=2)
     150             :         {
     151           0 :                 logp("sscanf failed reading manifest: %s\n", lead);
     152           0 :                 return -1;
     153             :         }
     154       45361 :         iobuf->cmd=(enum cmd)command;
     155       45361 :         iobuf->len=(size_t)s;
     156       45361 :         if(!(iobuf->buf=(char *)malloc_w(
     157       45361 :                 iobuf->len+extra_bytes+1, __func__)))
     158             :                         return -1;
     159       45361 :         switch(fzp_read_ensure(fzp,
     160       45361 :                 iobuf->buf, iobuf->len+extra_bytes, __func__))
     161             :         {
     162             :                 case 0: break; // OK.
     163             :                 case 1: return 1; // Finished OK.
     164             :                 default:
     165          33 :                         logp("Error attempting to read after %s in %s (%c:%u)\n", lead, __func__, iobuf->cmd, s);
     166          33 :                         return -1;
     167             :         }
     168       45328 :         iobuf->buf[iobuf->len]='\0';
     169       45328 :         return 0;
     170             : }
     171             : 
     172       45461 : int iobuf_fill_from_fzp(struct iobuf *iobuf, struct fzp *fzp)
     173             : {
     174       45461 :         return do_iobuf_fill_from_fzp(iobuf, fzp, 1 /*newline*/);
     175             : }
     176             : 
     177           0 : int iobuf_fill_from_fzp_data(struct iobuf *iobuf, struct fzp *fzp)
     178             : {
     179           0 :         return do_iobuf_fill_from_fzp(iobuf, fzp, 0 /*no newline*/);
     180             : }
     181             : 
     182          56 : static int is_printable(struct iobuf *iobuf)
     183             : {
     184             :         size_t l;
     185         436 :         for(l=0; l<iobuf->len; l++)
     186         436 :                 if(!isprint(iobuf->buf[l]) && iobuf->buf[l]!='\n')
     187             :                         return 0;
     188             :         return 1;
     189             : }
     190             : 
     191          56 : const char *iobuf_to_printable(struct iobuf *iobuf)
     192             : {
     193             :         static char str[256]="";
     194          56 :         if(is_printable(iobuf))
     195         112 :                 snprintf(str, sizeof(str),
     196          56 :                         "%c:%04X:%s", iobuf->cmd, (int)iobuf->len, iobuf->buf);
     197             :         else
     198           0 :                 snprintf(str, sizeof(str),
     199           0 :                         "%c:%04X:(binary data)", iobuf->cmd, (int)iobuf->len);
     200          56 :         return str;
     201             : }
     202             : 
     203       21988 : int iobuf_relative_path_attack(struct iobuf *iobuf)
     204             : {
     205       21988 :         if(!has_dot_component(iobuf->buf))
     206             :                 return 0;
     207           0 :         iobuf_log_unexpected(iobuf, __func__);
     208           0 :         return 1;
     209             : }
     210             : 

Generated by: LCOV version 1.13