LCOV - code coverage report
Current view: top level - strace_git - dirent.c (source / functions) Hit Total Coverage
Test: strace-4.16.0.69.f1ea-dirty Code Coverage Lines: 64 77 83.1 %
Date: 2017-03-18 00:38:52 Functions: 4 7 57.1 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 36 52 69.2 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
       3                 :            :  * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
       4                 :            :  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
       5                 :            :  * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
       6                 :            :  * Copyright (c) 2005-2015 Dmitry V. Levin <ldv@altlinux.org>
       7                 :            :  * All rights reserved.
       8                 :            :  *
       9                 :            :  * Redistribution and use in source and binary forms, with or without
      10                 :            :  * modification, are permitted provided that the following conditions
      11                 :            :  * are met:
      12                 :            :  * 1. Redistributions of source code must retain the above copyright
      13                 :            :  *    notice, this list of conditions and the following disclaimer.
      14                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      15                 :            :  *    notice, this list of conditions and the following disclaimer in the
      16                 :            :  *    documentation and/or other materials provided with the distribution.
      17                 :            :  * 3. The name of the author may not be used to endorse or promote products
      18                 :            :  *    derived from this software without specific prior written permission.
      19                 :            :  *
      20                 :            :  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
      21                 :            :  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
      22                 :            :  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
      23                 :            :  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
      24                 :            :  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      25                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      26                 :            :  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      27                 :            :  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      28                 :            :  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
      29                 :            :  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      30                 :            :  */
      31                 :            : 
      32                 :            : #include "defs.h"
      33                 :            : 
      34                 :            : #include DEF_MPERS_TYPE(kernel_dirent)
      35                 :            : 
      36                 :            : #include MPERS_DEFS
      37                 :            : 
      38                 :            : #define D_NAME_LEN_MAX 256
      39                 :            : 
      40                 :            : static void
      41                 :          3 : print_old_dirent(struct tcb *const tcp, const kernel_ulong_t addr)
      42                 :            : {
      43                 :            :         kernel_dirent d;
      44                 :            : 
      45         [ -  + ]:          3 :         if (umove_or_printaddr(tcp, addr, &d))
      46                 :          0 :                 return;
      47                 :            : 
      48                 :          3 :         tprintf("{d_ino=%llu, d_off=%llu, d_reclen=%u, d_name=",
      49                 :          3 :                 zero_extend_signed_to_ull(d.d_ino),
      50                 :          6 :                 zero_extend_signed_to_ull(d.d_off), d.d_reclen);
      51         [ -  + ]:          3 :         if (d.d_reclen > D_NAME_LEN_MAX)
      52                 :          0 :                 d.d_reclen = D_NAME_LEN_MAX;
      53                 :          3 :         printpathn(tcp, addr + offsetof(kernel_dirent, d_name), d.d_reclen);
      54                 :          3 :         tprints("}");
      55                 :            : }
      56                 :            : 
      57                 :          8 : SYS_FUNC(readdir)
      58                 :            : {
      59         [ +  + ]:          8 :         if (entering(tcp)) {
      60                 :          4 :                 printfd(tcp, tcp->u_arg[0]);
      61                 :          4 :                 tprints(", ");
      62                 :            :         } else {
      63         [ +  + ]:          4 :                 if (tcp->u_rval == 0)
      64                 :          1 :                         printaddr(tcp->u_arg[1]);
      65                 :            :                 else
      66                 :          3 :                         print_old_dirent(tcp, tcp->u_arg[1]);
      67                 :            :                 /* Not much point in printing this out, it is always 1. */
      68         [ -  + ]:          4 :                 if (tcp->u_arg[2] != 1)
      69                 :          0 :                         tprintf(", %" PRI_klu, tcp->u_arg[2]);
      70                 :            :         }
      71                 :          8 :         return 0;
      72                 :            : }
      73                 :            : 
      74                 :         36 : SYS_FUNC(getdents)
      75                 :            : {
      76                 :         36 :         unsigned int i, len, dents = 0;
      77                 :            :         unsigned char *buf;
      78                 :            : 
      79         [ +  + ]:         36 :         if (entering(tcp)) {
      80                 :         18 :                 printfd(tcp, tcp->u_arg[0]);
      81                 :         18 :                 tprints(", ");
      82                 :         18 :                 return 0;
      83                 :            :         }
      84                 :            : 
      85                 :         18 :         const unsigned int count = tcp->u_arg[2];
      86                 :            : 
      87 [ +  + ][ -  + ]:         18 :         if (syserror(tcp) || !verbose(tcp)) {
      88                 :          6 :                 printaddr(tcp->u_arg[1]);
      89                 :          6 :                 tprintf(", %u", count);
      90                 :          6 :                 return 0;
      91                 :            :         }
      92                 :            : 
      93                 :            :         /* Beware of insanely large or too small values in tcp->u_rval */
      94         [ -  + ]:         12 :         if (tcp->u_rval > 1024*1024)
      95                 :          0 :                 len = 1024*1024;
      96         [ +  + ]:         12 :         else if (tcp->u_rval < (int) sizeof(kernel_dirent))
      97                 :          6 :                 len = 0;
      98                 :            :         else
      99                 :          6 :                 len = tcp->u_rval;
     100                 :            : 
     101         [ +  + ]:         12 :         if (len) {
     102                 :          6 :                 buf = malloc(len);
     103 [ +  - ][ -  + ]:          6 :                 if (!buf || umoven(tcp, tcp->u_arg[1], len, buf) < 0) {
     104                 :          0 :                         printaddr(tcp->u_arg[1]);
     105                 :          0 :                         tprintf(", %u", count);
     106                 :          0 :                         free(buf);
     107                 :          0 :                         return 0;
     108                 :            :                 }
     109                 :            :         } else {
     110                 :          6 :                 buf = NULL;
     111                 :            :         }
     112                 :            : 
     113         [ +  - ]:         12 :         if (!abbrev(tcp))
     114                 :         12 :                 tprints("[");
     115 [ +  + ][ +  + ]:         30 :         for (i = 0; len && i <= len - sizeof(kernel_dirent); ) {
     116                 :         18 :                 kernel_dirent *d = (kernel_dirent *) &buf[i];
     117                 :            : 
     118         [ +  - ]:         18 :                 if (!abbrev(tcp)) {
     119 [ +  - ][ -  + ]:         18 :                         int oob = d->d_reclen < sizeof(kernel_dirent) ||
     120                 :         18 :                                   i + d->d_reclen - 1 >= len;
     121         [ -  + ]:         18 :                         int d_name_len = oob ? len - i : d->d_reclen;
     122                 :         18 :                         d_name_len -= offsetof(kernel_dirent, d_name) + 1;
     123         [ +  + ]:         18 :                         if (d_name_len > D_NAME_LEN_MAX)
     124                 :          6 :                                 d_name_len = D_NAME_LEN_MAX;
     125                 :            : 
     126         [ +  + ]:         18 :                         tprintf("%s{d_ino=%llu, d_off=%llu, d_reclen=%u"
     127                 :            :                                 ", d_name=", i ? ", " : "",
     128                 :         18 :                                 zero_extend_signed_to_ull(d->d_ino),
     129                 :         18 :                                 zero_extend_signed_to_ull(d->d_off),
     130                 :         18 :                                 d->d_reclen);
     131                 :            : 
     132         [ -  + ]:         18 :                         if (print_quoted_string(d->d_name, d_name_len,
     133                 :            :                                                 QUOTE_0_TERMINATED) > 0) {
     134                 :          0 :                                 tprints("...");
     135                 :            :                         }
     136                 :            : 
     137                 :         18 :                         tprints(", d_type=");
     138         [ -  + ]:         18 :                         if (oob)
     139                 :          0 :                                 tprints("?");
     140                 :            :                         else
     141                 :         18 :                                 printxval(dirent_types, buf[i + d->d_reclen - 1], "DT_???");
     142                 :         18 :                         tprints("}");
     143                 :            :                 }
     144                 :         18 :                 dents++;
     145         [ -  + ]:         18 :                 if (d->d_reclen < sizeof(kernel_dirent)) {
     146                 :          0 :                         tprints("/* d_reclen < sizeof(struct dirent) */");
     147                 :          0 :                         break;
     148                 :            :                 }
     149                 :         18 :                 i += d->d_reclen;
     150                 :            :         }
     151         [ +  - ]:         12 :         if (!abbrev(tcp))
     152                 :         12 :                 tprints("]");
     153                 :            :         else
     154                 :          0 :                 tprintf("/* %u entries */", dents);
     155                 :         12 :         tprintf(", %u", count);
     156                 :         12 :         free(buf);
     157                 :         12 :         return 0;
     158                 :            : }

Generated by: LCOV version 1.12