LCOV - code coverage report
Current view: top level - libebl - eblobjnote.c (source / functions) Hit Total Coverage
Test: elfutils-0.175 Lines: 117 215 54.4 %
Date: 2018-11-16 13:02:39 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* Print contents of object file note.
       2             :    Copyright (C) 2002, 2007, 2009, 2011, 2015, 2016, 2018 Red Hat, Inc.
       3             :    This file is part of elfutils.
       4             :    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
       5             : 
       6             :    This file is free software; you can redistribute it and/or modify
       7             :    it under the terms of either
       8             : 
       9             :      * the GNU Lesser General Public License as published by the Free
      10             :        Software Foundation; either version 3 of the License, or (at
      11             :        your option) any later version
      12             : 
      13             :    or
      14             : 
      15             :      * the GNU General Public License as published by the Free
      16             :        Software Foundation; either version 2 of the License, or (at
      17             :        your option) any later version
      18             : 
      19             :    or both in parallel, as here.
      20             : 
      21             :    elfutils is distributed in the hope that it will be useful, but
      22             :    WITHOUT ANY WARRANTY; without even the implied warranty of
      23             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      24             :    General Public License for more details.
      25             : 
      26             :    You should have received copies of the GNU General Public License and
      27             :    the GNU Lesser General Public License along with this program.  If
      28             :    not, see <http://www.gnu.org/licenses/>.  */
      29             : 
      30             : #ifdef HAVE_CONFIG_H
      31             : # include <config.h>
      32             : #endif
      33             : 
      34             : #include <inttypes.h>
      35             : #include <stdio.h>
      36             : #include <stdlib.h>
      37             : #include <string.h>
      38             : #include <libeblP.h>
      39             : 
      40             : #include "common.h"
      41             : #include "libelfP.h"
      42             : #include "libdwP.h"
      43             : #include "memory-access.h"
      44             : 
      45             : 
      46             : void
      47          61 : ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type,
      48             :                  uint32_t descsz, const char *desc)
      49             : {
      50          61 :   if (! ebl->object_note (name, type, descsz, desc))
      51             :     {
      52             :       /* The machine specific function did not know this type.  */
      53             : 
      54          61 :       if (strcmp ("stapsdt", name) == 0)
      55             :         {
      56           0 :           if (type != 3)
      57             :             {
      58           0 :               printf (gettext ("unknown SDT version %u\n"), type);
      59             :               return;
      60             :             }
      61             : 
      62             :           /* Descriptor starts with three addresses, pc, base ref and
      63             :              semaphore.  Then three zero terminated strings provider,
      64             :              name and arguments.  */
      65             : 
      66             :           union
      67             :           {
      68             :             Elf64_Addr a64[3];
      69             :             Elf32_Addr a32[3];
      70             :           } addrs;
      71             : 
      72           0 :           size_t addrs_size = gelf_fsize (ebl->elf, ELF_T_ADDR, 3, EV_CURRENT);
      73           0 :           if (descsz < addrs_size + 3)
      74             :             {
      75           0 :             invalid_sdt:
      76           0 :               printf (gettext ("invalid SDT probe descriptor\n"));
      77             :               return;
      78             :             }
      79             : 
      80           0 :           Elf_Data src =
      81             :             {
      82             :               .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
      83             :               .d_buf = (void *) desc, .d_size = addrs_size
      84             :             };
      85             : 
      86           0 :           Elf_Data dst =
      87             :             {
      88             :               .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
      89             :               .d_buf = &addrs, .d_size = addrs_size
      90             :             };
      91             : 
      92           0 :           if (gelf_xlatetom (ebl->elf, &dst, &src,
      93           0 :                              elf_getident (ebl->elf, NULL)[EI_DATA]) == NULL)
      94             :             {
      95           0 :               printf ("%s\n", elf_errmsg (-1));
      96             :               return;
      97             :             }
      98             : 
      99           0 :           const char *provider = desc + addrs_size;
     100           0 :           const char *pname = memchr (provider, '\0', desc + descsz - provider);
     101           0 :           if (pname == NULL)
     102             :             goto invalid_sdt;
     103             : 
     104           0 :           ++pname;
     105           0 :           const char *args = memchr (pname, '\0', desc + descsz - pname);
     106           0 :           if (args == NULL ||
     107           0 :               memchr (++args, '\0', desc + descsz - pname) != desc + descsz - 1)
     108             :             goto invalid_sdt;
     109             : 
     110             :           GElf_Addr pc;
     111             :           GElf_Addr base;
     112             :           GElf_Addr sem;
     113           0 :           if (gelf_getclass (ebl->elf) == ELFCLASS32)
     114             :             {
     115           0 :               pc = addrs.a32[0];
     116           0 :               base = addrs.a32[1];
     117           0 :               sem = addrs.a32[2];
     118             :             }
     119             :           else
     120             :             {
     121           0 :               pc = addrs.a64[0];
     122           0 :               base = addrs.a64[1];
     123           0 :               sem = addrs.a64[2];
     124             :             }
     125             : 
     126           0 :           printf (gettext ("    PC: "));
     127           0 :           printf ("%#" PRIx64 ",", pc);
     128           0 :           printf (gettext (" Base: "));
     129           0 :           printf ("%#" PRIx64 ",", base);
     130           0 :           printf (gettext (" Semaphore: "));
     131           0 :           printf ("%#" PRIx64 "\n", sem);
     132           0 :           printf (gettext ("    Provider: "));
     133           0 :           printf ("%s,", provider);
     134           0 :           printf (gettext (" Name: "));
     135           0 :           printf ("%s,", pname);
     136           0 :           printf (gettext (" Args: "));
     137             :           printf ("'%s'\n", args);
     138             :           return;
     139             :         }
     140             : 
     141          61 :       if (strncmp (name, ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX,
     142             :                    strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX)) == 0
     143          18 :           && (type == NT_GNU_BUILD_ATTRIBUTE_OPEN
     144          18 :               || type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
     145             :         {
     146             :           /* There might or might not be a pair of addresses in the desc.  */
     147          18 :           if (descsz > 0)
     148             :             {
     149           2 :               printf ("    Address Range: ");
     150             : 
     151             :               union
     152             :               {
     153             :                 Elf64_Addr a64[2];
     154             :                 Elf32_Addr a32[2];
     155             :               } addrs;
     156             : 
     157           2 :               size_t addr_size = gelf_fsize (ebl->elf, ELF_T_ADDR,
     158             :                                              2, EV_CURRENT);
     159           2 :               if (descsz != addr_size)
     160             :                 printf ("<unknown data>\n");
     161             :               else
     162             :                 {
     163           2 :                   Elf_Data src =
     164             :                     {
     165             :                      .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
     166             :                      .d_buf = (void *) desc, .d_size = descsz
     167             :                     };
     168             : 
     169           2 :                   Elf_Data dst =
     170             :                     {
     171             :                      .d_type = ELF_T_ADDR, .d_version = EV_CURRENT,
     172             :                      .d_buf = &addrs, .d_size = descsz
     173             :                     };
     174             : 
     175           2 :                   if (gelf_xlatetom (ebl->elf, &dst, &src,
     176           2 :                                      elf_getident (ebl->elf,
     177           2 :                                                    NULL)[EI_DATA]) == NULL)
     178           0 :                     printf ("%s\n", elf_errmsg (-1));
     179             :                   else
     180             :                     {
     181           2 :                       if (addr_size == 4)
     182           0 :                         printf ("%#" PRIx32 " - %#" PRIx32 "\n",
     183             :                                 addrs.a32[0], addrs.a32[1]);
     184             :                       else
     185           2 :                         printf ("%#" PRIx64 " - %#" PRIx64 "\n",
     186             :                                 addrs.a64[0], addrs.a64[1]);
     187             :                     }
     188             :                 }
     189             :             }
     190             : 
     191             :           /* Most data actually is inside the name.
     192             :              https://fedoraproject.org/wiki/Toolchain/Watermark  */
     193             : 
     194             :           /* We need at least 2 chars of data to describe the
     195             :              attribute and value encodings.  */
     196          18 :           const char *data = (name
     197             :                               + strlen (ELF_NOTE_GNU_BUILD_ATTRIBUTE_PREFIX));
     198          18 :           if (namesz < 2)
     199             :             {
     200             :               printf ("<insufficient data>\n");
     201             :               return;
     202             :             }
     203             : 
     204          18 :           printf ("    ");
     205             : 
     206             :           /* In most cases the value comes right after the encoding bytes.  */
     207          18 :           const char *value = &data[2];
     208          18 :           switch (data[1])
     209             :             {
     210           1 :             case GNU_BUILD_ATTRIBUTE_VERSION:
     211             :               printf ("VERSION: ");
     212             :               break;
     213           2 :             case GNU_BUILD_ATTRIBUTE_STACK_PROT:
     214             :               printf ("STACK_PROT: ");
     215             :               break;
     216           0 :             case GNU_BUILD_ATTRIBUTE_RELRO:
     217             :               printf ("RELRO: ");
     218             :               break;
     219           0 :             case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
     220             :               printf ("STACK_SIZE: ");
     221             :               break;
     222           1 :             case GNU_BUILD_ATTRIBUTE_TOOL:
     223             :               printf ("TOOL: ");
     224             :               break;
     225           2 :             case GNU_BUILD_ATTRIBUTE_ABI:
     226             :               printf ("ABI: ");
     227             :               break;
     228           2 :             case GNU_BUILD_ATTRIBUTE_PIC:
     229             :               printf ("PIC: ");
     230             :               break;
     231           2 :             case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
     232             :               printf ("SHORT_ENUM: ");
     233             :               break;
     234           8 :             case 32 ... 126:
     235          16 :               printf ("\"%s\": ", &data[1]);
     236           8 :               value += strlen (&data[1]) + 1;
     237           8 :               break;
     238           0 :             default:
     239             :               printf ("<unknown>: ");
     240             :               break;
     241             :             }
     242             : 
     243          18 :           switch (data[0])
     244             :             {
     245          10 :             case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
     246             :               {
     247             :                 /* Any numbers are always in (unsigned) little endian.  */
     248             :                 static const Dwarf dbg
     249             :                   = { .other_byte_order = MY_ELFDATA != ELFDATA2LSB };
     250          10 :                 size_t bytes = namesz - (value - name);
     251             :                 uint64_t val;
     252          10 :                 if (bytes == 1)
     253           2 :                   val = *(unsigned char *) value;
     254           8 :                 else if (bytes == 2)
     255           6 :                   val = read_2ubyte_unaligned (&dbg, value);
     256           2 :                 else if (bytes == 4)
     257           0 :                   val = read_4ubyte_unaligned (&dbg, value);
     258           2 :                 else if (bytes == 8)
     259           2 :                   val = read_8ubyte_unaligned (&dbg, value);
     260             :                 else
     261             :                   goto unknown;
     262             :                 printf ("%" PRIx64, val);
     263             :               }
     264             :               break;
     265           2 :             case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
     266             :               printf ("\"%s\"", value);
     267             :               break;
     268           0 :             case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
     269             :               printf ("TRUE");
     270             :               break;
     271           6 :             case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
     272             :               printf ("FALSE");
     273             :               break;
     274             :             default:
     275             :               {
     276           0 :               unknown:
     277             :                 printf ("<unknown>");
     278             :               }
     279             :               break;
     280             :             }
     281             : 
     282             :           printf ("\n");
     283             : 
     284             :           return;
     285             :         }
     286             : 
     287             :       /* NT_VERSION doesn't have any info.  All data is in the name.  */
     288          43 :       if (descsz == 0 && type == NT_VERSION)
     289             :         return;
     290             : 
     291             :       /* Everything else should have the "GNU" owner name.  */
     292          40 :       if (strcmp ("GNU", name) != 0)
     293             :         return;
     294             : 
     295          39 :       switch (type)
     296             :         {
     297          28 :         case NT_GNU_BUILD_ID:
     298          28 :           if (strcmp (name, "GNU") == 0 && descsz > 0)
     299             :             {
     300          56 :               printf (gettext ("    Build ID: "));
     301             :               uint_fast32_t i;
     302         560 :               for (i = 0; i < descsz - 1; ++i)
     303        1064 :                 printf ("%02" PRIx8, (uint8_t) desc[i]);
     304          28 :               printf ("%02" PRIx8 "\n", (uint8_t) desc[i]);
     305             :             }
     306             :           break;
     307             : 
     308           0 :         case NT_GNU_GOLD_VERSION:
     309           0 :           if (strcmp (name, "GNU") == 0 && descsz > 0)
     310             :             /* A non-null terminated version string.  */
     311           0 :             printf (gettext ("    Linker version: %.*s\n"),
     312             :                     (int) descsz, desc);
     313             :           break;
     314             : 
     315           3 :         case NT_GNU_PROPERTY_TYPE_0:
     316           3 :           if (strcmp (name, "GNU") == 0 && descsz > 0)
     317             :             {
     318             :               /* There are at least 2 words. type and datasz.  */
     319           7 :               while (descsz >= 8)
     320             :                 {
     321             :                   struct pr_prop
     322             :                   {
     323             :                     GElf_Word pr_type;
     324             :                     GElf_Word pr_datasz;
     325             :                   } prop;
     326             : 
     327           4 :                   Elf_Data in =
     328             :                     {
     329             :                       .d_version = EV_CURRENT,
     330             :                       .d_type = ELF_T_WORD,
     331             :                       .d_size = 8,
     332             :                       .d_buf = (void *) desc
     333             :                     };
     334           4 :                   Elf_Data out =
     335             :                     {
     336             :                       .d_version = EV_CURRENT,
     337             :                       .d_type = ELF_T_WORD,
     338             :                       .d_size = descsz,
     339             :                       .d_buf = (void *) &prop
     340             :                     };
     341             : 
     342           4 :                   if (gelf_xlatetom (ebl->elf, &out, &in,
     343           4 :                                      elf_getident (ebl->elf,
     344           4 :                                                    NULL)[EI_DATA]) == NULL)
     345             :                     {
     346           0 :                       printf ("%s\n", elf_errmsg (-1));
     347           0 :                       return;
     348             :                     }
     349             : 
     350           4 :                   desc += 8;
     351           4 :                   descsz -= 8;
     352             : 
     353           4 :                   int elfclass = gelf_getclass (ebl->elf);
     354           4 :                   char *elfident = elf_getident (ebl->elf, NULL);
     355             :                   GElf_Ehdr ehdr;
     356           4 :                   gelf_getehdr (ebl->elf, &ehdr);
     357             : 
     358             :                   /* Prefix.  */
     359           4 :                   printf ("    ");
     360           4 :                   if (prop.pr_type == GNU_PROPERTY_STACK_SIZE)
     361             :                     {
     362           0 :                       printf ("STACK_SIZE ");
     363           0 :                       if (prop.pr_datasz == 4 || prop.pr_datasz == 8)
     364             :                         {
     365             :                           GElf_Addr addr;
     366           0 :                           in.d_type = ELF_T_ADDR;
     367           0 :                           out.d_type = ELF_T_ADDR;
     368           0 :                           in.d_size = prop.pr_datasz;
     369           0 :                           out.d_size = sizeof (addr);
     370           0 :                           in.d_buf = (void *) desc;
     371           0 :                           out.d_buf = (void *) &addr;
     372             : 
     373           0 :                           if (gelf_xlatetom (ebl->elf, &out, &in,
     374           0 :                                              elfident[EI_DATA]) == NULL)
     375             :                             {
     376           0 :                               printf ("%s\n", elf_errmsg (-1));
     377           0 :                               return;
     378             :                             }
     379           0 :                           printf ("%#" PRIx64 "\n", addr);
     380             :                         }
     381             :                       else
     382           0 :                         printf (" (garbage datasz: %" PRIx32 ")\n",
     383             :                                 prop.pr_datasz);
     384             :                     }
     385           4 :                   else if (prop.pr_type == GNU_PROPERTY_NO_COPY_ON_PROTECTED)
     386             :                     {
     387           0 :                       printf ("NO_COPY_ON_PROTECTION");
     388           0 :                       if (prop.pr_datasz == 0)
     389             :                         printf ("\n");
     390             :                       else
     391           0 :                         printf (" (garbage datasz: %" PRIx32 ")\n",
     392             :                                 prop.pr_datasz);
     393             :                     }
     394           4 :                   else if (prop.pr_type >= GNU_PROPERTY_LOPROC
     395           4 :                       && prop.pr_type <= GNU_PROPERTY_HIPROC
     396           8 :                       && (ehdr.e_machine == EM_386
     397           4 :                           || ehdr.e_machine == EM_X86_64))
     398             :                     {
     399           4 :                       printf ("X86 ");
     400           4 :                       if (prop.pr_type == GNU_PROPERTY_X86_FEATURE_1_AND)
     401             :                         {
     402           2 :                           printf ("FEATURE_1_AND: ");
     403             : 
     404           2 :                           if (prop.pr_datasz == 4)
     405             :                             {
     406             :                               GElf_Word data;
     407           2 :                               in.d_type = ELF_T_WORD;
     408           2 :                               out.d_type = ELF_T_WORD;
     409           2 :                               in.d_size = 4;
     410           2 :                               out.d_size = 4;
     411           2 :                               in.d_buf = (void *) desc;
     412           2 :                               out.d_buf = (void *) &data;
     413             : 
     414           2 :                               if (gelf_xlatetom (ebl->elf, &out, &in,
     415           2 :                                                  elfident[EI_DATA]) == NULL)
     416             :                                 {
     417           0 :                                   printf ("%s\n", elf_errmsg (-1));
     418           0 :                                   return;
     419             :                                 }
     420           4 :                               printf ("%08" PRIx32 " ", data);
     421             : 
     422           2 :                               if ((data & GNU_PROPERTY_X86_FEATURE_1_IBT)
     423             :                                   != 0)
     424             :                                 {
     425           2 :                                   printf ("IBT");
     426           2 :                                   data &= ~GNU_PROPERTY_X86_FEATURE_1_IBT;
     427           2 :                                   if (data != 0)
     428             :                                     printf (" ");
     429             :                                 }
     430             : 
     431           2 :                               if ((data & GNU_PROPERTY_X86_FEATURE_1_SHSTK)
     432             :                                   != 0)
     433             :                                 {
     434           2 :                                   printf ("SHSTK");
     435           2 :                                   data &= ~GNU_PROPERTY_X86_FEATURE_1_SHSTK;
     436           2 :                                   if (data != 0)
     437             :                                     printf (" ");
     438             :                                 }
     439             : 
     440           2 :                               if (data != 0)
     441             :                                 printf ("UNKNOWN");
     442             :                             }
     443             :                           else
     444           0 :                             printf ("<bad datasz: %" PRId32 ">",
     445             :                                     prop.pr_datasz);
     446             : 
     447             :                           printf ("\n");
     448             :                         }
     449             :                       else
     450             :                         {
     451           4 :                           printf ("%#" PRIx32, prop.pr_type);
     452           2 :                           if (prop.pr_datasz > 0)
     453             :                             {
     454           2 :                               printf (" data: ");
     455             :                               size_t i;
     456           8 :                               for (i = 0; i < prop.pr_datasz - 1; i++)
     457          12 :                                 printf ("%02" PRIx8 " ", (uint8_t) desc[i]);
     458           2 :                               printf ("%02" PRIx8 "\n", (uint8_t) desc[i]);
     459             :                             }
     460             :                         }
     461             :                     }
     462             :                   else
     463             :                     {
     464           0 :                       if (prop.pr_type >= GNU_PROPERTY_LOPROC
     465             :                           && prop.pr_type <= GNU_PROPERTY_HIPROC)
     466           0 :                         printf ("proc_type %#" PRIx32, prop.pr_type);
     467           0 :                       else if (prop.pr_type >= GNU_PROPERTY_LOUSER
     468             :                           && prop.pr_type <= GNU_PROPERTY_HIUSER)
     469           0 :                         printf ("app_type %#" PRIx32, prop.pr_type);
     470             :                       else
     471           0 :                         printf ("unknown_type %#" PRIx32, prop.pr_type);
     472             : 
     473           0 :                       if (prop.pr_datasz > 0)
     474             :                         {
     475           0 :                           printf (" data: ");
     476             :                           size_t i;
     477           0 :                           for (i = 0; i < prop.pr_datasz - 1; i++)
     478           0 :                             printf ("%02" PRIx8 " ", (uint8_t) desc[i]);
     479           0 :                           printf ("%02" PRIx8 "\n", (uint8_t) desc[i]);
     480             :                         }
     481             :                     }
     482           4 :                   if (elfclass == ELFCLASS32)
     483             :                     {
     484           0 :                       desc += NOTE_ALIGN4 (prop.pr_datasz);
     485           0 :                       descsz -= NOTE_ALIGN4 (prop.pr_datasz);
     486             :                     }
     487             :                   else
     488             :                     {
     489           4 :                       desc += NOTE_ALIGN8 (prop.pr_datasz);
     490           4 :                       descsz -= NOTE_ALIGN8 (prop.pr_datasz);
     491             :                     }
     492             :                 }
     493             :             }
     494             :           break;
     495             : 
     496           8 :         case NT_GNU_ABI_TAG:
     497           8 :           if (descsz >= 8 && descsz % 4 == 0)
     498             :             {
     499           8 :               Elf_Data in =
     500             :                 {
     501             :                   .d_version = EV_CURRENT,
     502             :                   .d_type = ELF_T_WORD,
     503             :                   .d_size = descsz,
     504             :                   .d_buf = (void *) desc
     505             :                 };
     506             :               /* Normally NT_GNU_ABI_TAG is just 4 words (16 bytes).  If it
     507             :                  is much (4*) larger dynamically allocate memory to convert.  */
     508             : #define FIXED_TAG_BYTES 16
     509             :               uint32_t sbuf[FIXED_TAG_BYTES];
     510             :               uint32_t *buf;
     511           8 :               if (unlikely (descsz / 4 > FIXED_TAG_BYTES))
     512             :                 {
     513           0 :                   buf = malloc (descsz);
     514           0 :                   if (unlikely (buf == NULL))
     515           0 :                     return;
     516             :                 }
     517             :               else
     518             :                 buf = sbuf;
     519           8 :               Elf_Data out =
     520             :                 {
     521             :                   .d_version = EV_CURRENT,
     522             :                   .d_type = ELF_T_WORD,
     523             :                   .d_size = descsz,
     524             :                   .d_buf = buf
     525             :                 };
     526             : 
     527           8 :               if (elf32_xlatetom (&out, &in, ebl->data) != NULL)
     528             :                 {
     529             :                   const char *os;
     530           8 :                   switch (buf[0])
     531             :                     {
     532             :                     case ELF_NOTE_OS_LINUX:
     533             :                       os = "Linux";
     534             :                       break;
     535             : 
     536           0 :                     case ELF_NOTE_OS_GNU:
     537           0 :                       os = "GNU";
     538           0 :                       break;
     539             : 
     540           0 :                     case ELF_NOTE_OS_SOLARIS2:
     541           0 :                       os = "Solaris";
     542           0 :                       break;
     543             : 
     544           0 :                     case ELF_NOTE_OS_FREEBSD:
     545           0 :                       os = "FreeBSD";
     546           0 :                       break;
     547             : 
     548           0 :                     default:
     549           0 :                       os = "???";
     550           0 :                       break;
     551             :                     }
     552             : 
     553          16 :                   printf (gettext ("    OS: %s, ABI: "), os);
     554          32 :                   for (size_t cnt = 1; cnt < descsz / 4; ++cnt)
     555             :                     {
     556          24 :                       if (cnt > 1)
     557             :                         putchar_unlocked ('.');
     558          48 :                       printf ("%" PRIu32, buf[cnt]);
     559             :                     }
     560             :                   putchar_unlocked ('\n');
     561             :                 }
     562           8 :               if (descsz / 4 > FIXED_TAG_BYTES)
     563           0 :                 free (buf);
     564           8 :               break;
     565             :             }
     566             :           FALLTHROUGH;
     567             : 
     568             :         default:
     569             :           /* Unknown type.  */
     570             :           break;
     571             :         }
     572           0 :     }
     573             : }

Generated by: LCOV version 1.13