LCOV - code coverage report
Current view: top level - source3/lib - test_adouble.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 76 77 98.7 %
Date: 2024-04-21 15:09:00 Functions: 11 11 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Unix SMB/CIFS implementation.
       3             :  *
       4             :  * Copyright (C) 2021 Ralph Boehme <slow@samba.org>
       5             :  *
       6             :  * This program is free software; you can redistribute it and/or modify
       7             :  * it under the terms of the GNU General Public License as published by
       8             :  * the Free Software Foundation; either version 3 of the License, or
       9             :  * (at your option) any later version.
      10             :  *
      11             :  * This program is distributed in the hope that it will be useful,
      12             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             :  * GNU General Public License for more details.
      15             :  *
      16             :  * You should have received a copy of the GNU General Public License
      17             :  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
      18             :  */
      19             : 
      20             : #include "adouble.c"
      21             : #include <cmocka.h>
      22             : 
      23           1 : static int setup_talloc_context(void **state)
      24             : {
      25           1 :         TALLOC_CTX *frame = talloc_stackframe();
      26             : 
      27           1 :         *state = frame;
      28           1 :         return 0;
      29             : }
      30             : 
      31           1 : static int teardown_talloc_context(void **state)
      32             : {
      33           1 :         TALLOC_CTX *frame = *state;
      34             : 
      35           1 :         TALLOC_FREE(frame);
      36           1 :         return 0;
      37             : }
      38             : 
      39             : /*
      40             :  * Basic and sane buffer.
      41             :  */
      42             : static uint8_t ad_basic[] = {
      43             :         0x00, 0x05, 0x16, 0x07, /* Magic */
      44             :         0x00, 0x02, 0x00, 0x00, /* Version */
      45             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      46             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      47             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      48             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      49             :         0x00, 0x02,             /* Count */
      50             :         /* adentry 1: FinderInfo */
      51             :         0x00, 0x00, 0x00, 0x09, /* eid: FinderInfo */
      52             :         0x00, 0x00, 0x00, 0x32, /* offset */
      53             :         0x00, 0x00, 0x00, 0x20, /* length */
      54             :         /* adentry 2: Resourcefork */
      55             :         0x00, 0x00, 0x00, 0x02, /* eid: Resourcefork */
      56             :         0x00, 0x00, 0x00, 0x52, /* offset */
      57             :         0xff, 0xff, 0xff, 0x00, /* length */
      58             :         /* FinderInfo data: 32 bytes */
      59             :         0x00, 0x00, 0x00, 0x00,
      60             :         0x00, 0x00, 0x00, 0x00,
      61             :         0x00, 0x00, 0x00, 0x00,
      62             :         0x00, 0x00, 0x00, 0x00,
      63             :         0x00, 0x00, 0x00, 0x00,
      64             :         0x00, 0x00, 0x00, 0x00,
      65             :         0x00, 0x00, 0x00, 0x00,
      66             :         0x00, 0x00, 0x00, 0x00,
      67             : };
      68             : 
      69             : /*
      70             :  * An empty FinderInfo entry.
      71             :  */
      72             : static uint8_t ad_finderinfo1[] = {
      73             :         0x00, 0x05, 0x16, 0x07, /* Magic */
      74             :         0x00, 0x02, 0x00, 0x00, /* Version */
      75             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      76             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      77             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      78             :         0x00, 0x00, 0x00, 0x00, /* Filler */
      79             :         0x00, 0x02,             /* Count */
      80             :         /* adentry 1: FinderInfo */
      81             :         0x00, 0x00, 0x00, 0x09, /* eid: FinderInfo */
      82             :         0x00, 0x00, 0x00, 0x52, /* off: points at end of buffer */
      83             :         0x00, 0x00, 0x00, 0x00, /* len: 0, so off+len don't exceed bufferlen */
      84             :         /* adentry 2: Resourcefork */
      85             :         0x00, 0x00, 0x00, 0x02, /* eid: Resourcefork */
      86             :         0x00, 0x00, 0x00, 0x52, /* offset */
      87             :         0xff, 0xff, 0xff, 0x00, /* length */
      88             :         /* FinderInfo data: 32 bytes */
      89             :         0x00, 0x00, 0x00, 0x00,
      90             :         0x00, 0x00, 0x00, 0x00,
      91             :         0x00, 0x00, 0x00, 0x00,
      92             :         0x00, 0x00, 0x00, 0x00,
      93             :         0x00, 0x00, 0x00, 0x00,
      94             :         0x00, 0x00, 0x00, 0x00,
      95             :         0x00, 0x00, 0x00, 0x00,
      96             :         0x00, 0x00, 0x00, 0x00,
      97             : };
      98             : 
      99             : /*
     100             :  * A dangerous FinderInfo with correct length exceeding buffer by one byte.
     101             :  */
     102             : static uint8_t ad_finderinfo2[] = {
     103             :         0x00, 0x05, 0x16, 0x07, /* Magic */
     104             :         0x00, 0x02, 0x00, 0x00, /* Version */
     105             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     106             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     107             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     108             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     109             :         0x00, 0x02,             /* Count */
     110             :         /* adentry 1: FinderInfo */
     111             :         0x00, 0x00, 0x00, 0x09, /* eid: FinderInfo */
     112             :         0x00, 0x00, 0x00, 0x33, /* off: points at beginng of data + 1 */
     113             :         0x00, 0x00, 0x00, 0x20, /* len: 32, so off+len exceeds bufferlen by 1 */
     114             :         /* adentry 2: Resourcefork */
     115             :         0x00, 0x00, 0x00, 0x02, /* eid: Resourcefork */
     116             :         0x00, 0x00, 0x00, 0x52, /* offset */
     117             :         0xff, 0xff, 0xff, 0x00, /* length */
     118             :         /* FinderInfo data: 32 bytes */
     119             :         0x00, 0x00, 0x00, 0x00,
     120             :         0x00, 0x00, 0x00, 0x00,
     121             :         0x00, 0x00, 0x00, 0x00,
     122             :         0x00, 0x00, 0x00, 0x00,
     123             :         0x00, 0x00, 0x00, 0x00,
     124             :         0x00, 0x00, 0x00, 0x00,
     125             :         0x00, 0x00, 0x00, 0x00,
     126             :         0x00, 0x00, 0x00, 0x00,
     127             : };
     128             : 
     129             : static uint8_t ad_finderinfo3[] = {
     130             :         0x00, 0x05, 0x16, 0x07, /* Magic */
     131             :         0x00, 0x02, 0x00, 0x00, /* Version */
     132             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     133             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     134             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     135             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     136             :         0x00, 0x02,             /* Count */
     137             :         /* adentry 1: FinderInfo */
     138             :         0x00, 0x00, 0x00, 0x09, /* eid: FinderInfo */
     139             :         0x00, 0x00, 0x00, 0x33, /* off: points at beginng of data + 1 */
     140             :         0x00, 0x00, 0x00, 0x1f, /* len: 31, so off+len don't exceed buf */
     141             :         /* adentry 2: Resourcefork */
     142             :         0x00, 0x00, 0x00, 0x02, /* eid: Resourcefork */
     143             :         0x00, 0x00, 0x00, 0x52, /* offset */
     144             :         0xff, 0xff, 0xff, 0x00, /* length */
     145             :         /* FinderInfo data: 32 bytes */
     146             :         0x00, 0x00, 0x00, 0x00,
     147             :         0x00, 0x00, 0x00, 0x00,
     148             :         0x00, 0x00, 0x00, 0x00,
     149             :         0x00, 0x00, 0x00, 0x00,
     150             :         0x00, 0x00, 0x00, 0x00,
     151             :         0x00, 0x00, 0x00, 0x00,
     152             :         0x00, 0x00, 0x00, 0x00,
     153             :         0x00, 0x00, 0x00, 0x00,
     154             : };
     155             : 
     156             : /*
     157             :  * A dangerous name entry.
     158             :  */
     159             : static uint8_t ad_name[] = {
     160             :         0x00, 0x05, 0x16, 0x07, /* Magic */
     161             :         0x00, 0x02, 0x00, 0x00, /* Version */
     162             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     163             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     164             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     165             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     166             :         0x00, 0x02,             /* Count */
     167             :         /* adentry 1: FinderInfo */
     168             :         0x00, 0x00, 0x00, 0x09, /* eid: FinderInfo */
     169             :         0x00, 0x00, 0x00, 0x32, /* offset */
     170             :         0x00, 0x00, 0x00, 0x20, /* length */
     171             :         /* adentry 2: Name */
     172             :         0x00, 0x00, 0x00, 0x03, /* eid: Name */
     173             :         0x00, 0x00, 0x00, 0x52, /* off: points at end of buffer */
     174             :         0x00, 0x00, 0x00, 0x01, /* len: 1, so off+len exceeds bufferlen */
     175             :         /* FinderInfo data: 32 bytes */
     176             :         0x00, 0x00, 0x00, 0x00,
     177             :         0x00, 0x00, 0x00, 0x00,
     178             :         0x00, 0x00, 0x00, 0x00,
     179             :         0x00, 0x00, 0x00, 0x00,
     180             :         0x00, 0x00, 0x00, 0x00,
     181             :         0x00, 0x00, 0x00, 0x00,
     182             :         0x00, 0x00, 0x00, 0x00,
     183             :         0x00, 0x00, 0x00, 0x00,
     184             : };
     185             : 
     186             : /*
     187             :  * A empty ADEID_FILEDATESI entry.
     188             :  */
     189             : static uint8_t ad_date1[] = {
     190             :         0x00, 0x05, 0x16, 0x07, /* Magic */
     191             :         0x00, 0x02, 0x00, 0x00, /* Version */
     192             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     193             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     194             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     195             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     196             :         0x00, 0x02,             /* Count */
     197             :         /* adentry 1: FinderInfo */
     198             :         0x00, 0x00, 0x00, 0x09, /* eid: FinderInfo */
     199             :         0x00, 0x00, 0x00, 0x32, /* offset */
     200             :         0x00, 0x00, 0x00, 0x20, /* length */
     201             :         /* adentry 2: Dates */
     202             :         0x00, 0x00, 0x00, 0x08, /* eid: dates */
     203             :         0x00, 0x00, 0x00, 0x52, /* off: end of buffer */
     204             :         0x00, 0x00, 0x00, 0x00, /* len: 0, empty entry, valid */
     205             :         /* FinderInfo data: 32 bytes */
     206             :         0x00, 0x00, 0x00, 0x00,
     207             :         0x00, 0x00, 0x00, 0x00,
     208             :         0x00, 0x00, 0x00, 0x00,
     209             :         0x00, 0x00, 0x00, 0x00,
     210             :         0x00, 0x00, 0x00, 0x00,
     211             :         0x00, 0x00, 0x00, 0x00,
     212             :         0x00, 0x00, 0x00, 0x00,
     213             :         0x00, 0x00, 0x00, 0x00,
     214             : };
     215             : 
     216             : /*
     217             :  * A dangerous ADEID_FILEDATESI entry, invalid length.
     218             :  */
     219             : static uint8_t ad_date2[] = {
     220             :         0x00, 0x05, 0x16, 0x07, /* Magic */
     221             :         0x00, 0x02, 0x00, 0x00, /* Version */
     222             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     223             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     224             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     225             :         0x00, 0x00, 0x00, 0x00, /* Filler */
     226             :         0x00, 0x02,             /* Count */
     227             :         /* adentry 1: FinderInfo */
     228             :         0x00, 0x00, 0x00, 0x09, /* eid: FinderInfo */
     229             :         0x00, 0x00, 0x00, 0x32, /* offset */
     230             :         0x00, 0x00, 0x00, 0x20, /* length */
     231             :         /* adentry 2: Dates */
     232             :         0x00, 0x00, 0x00, 0x08, /* eid: dates */
     233             :         0x00, 0x00, 0x00, 0x43, /* off: FinderInfo buf but one byte short */
     234             :         0x00, 0x00, 0x00, 0x0f, /* len: 15, so off+len don't exceed bufferlen */
     235             :         /* FinderInfo data: 32 bytes */
     236             :         0x00, 0x00, 0x00, 0x00,
     237             :         0x00, 0x00, 0x00, 0x00,
     238             :         0x00, 0x00, 0x00, 0x00,
     239             :         0x00, 0x00, 0x00, 0x00,
     240             :         0x00, 0x00, 0x00, 0x00,
     241             :         0x00, 0x00, 0x00, 0x00,
     242             :         0x00, 0x00, 0x00, 0x00,
     243             :         0x00, 0x00, 0x00, 0x00,
     244             : };
     245             : 
     246           7 : static struct adouble *parse_adouble(TALLOC_CTX *mem_ctx,
     247             :                                      uint8_t *adbuf,
     248             :                                      size_t adsize,
     249             :                                      off_t filesize)
     250             : {
     251           7 :         struct adouble *ad = NULL;
     252           7 :         bool ok;
     253             : 
     254           7 :         ad = talloc_zero(mem_ctx, struct adouble);
     255           7 :         ad->ad_data = talloc_zero_size(ad, adsize);
     256           7 :         assert_non_null(ad);
     257             : 
     258           7 :         memcpy(ad->ad_data, adbuf, adsize);
     259             : 
     260           7 :         ok = ad_unpack(ad, 2, filesize);
     261           7 :         if (!ok) {
     262           4 :                 return NULL;
     263             :         }
     264             : 
     265             :         return ad;
     266             : }
     267             : 
     268           1 : static void parse_abouble_basic(void **state)
     269             : {
     270           1 :         TALLOC_CTX *frame = *state;
     271           1 :         struct adouble *ad = NULL;
     272           1 :         char *p = NULL;
     273             : 
     274           1 :         ad = parse_adouble(frame, ad_basic, sizeof(ad_basic), 0xffffff52);
     275           1 :         assert_non_null(ad);
     276             : 
     277           1 :         p = ad_get_entry(ad, ADEID_FINDERI);
     278           1 :         assert_non_null(p);
     279             : 
     280           1 :         return;
     281             : }
     282             : 
     283           1 : static void parse_abouble_finderinfo1(void **state)
     284             : {
     285           1 :         TALLOC_CTX *frame = *state;
     286           1 :         struct adouble *ad = NULL;
     287           1 :         char *p = NULL;
     288             : 
     289           1 :         ad = parse_adouble(frame,
     290             :                            ad_finderinfo1,
     291             :                            sizeof(ad_finderinfo1),
     292             :                            0xffffff52);
     293           1 :         assert_non_null(ad);
     294             : 
     295           1 :         p = ad_get_entry(ad, ADEID_FINDERI);
     296           1 :         assert_null(p);
     297             : 
     298           1 :         return;
     299             : }
     300             : 
     301           1 : static void parse_abouble_finderinfo2(void **state)
     302             : {
     303           1 :         TALLOC_CTX *frame = *state;
     304           1 :         struct adouble *ad = NULL;
     305             : 
     306           1 :         ad = parse_adouble(frame,
     307             :                            ad_finderinfo2,
     308             :                            sizeof(ad_finderinfo2),
     309             :                            0xffffff52);
     310           1 :         assert_null(ad);
     311             : 
     312           1 :         return;
     313             : }
     314             : 
     315           1 : static void parse_abouble_finderinfo3(void **state)
     316             : {
     317           1 :         TALLOC_CTX *frame = *state;
     318           1 :         struct adouble *ad = NULL;
     319             : 
     320           1 :         ad = parse_adouble(frame,
     321             :                            ad_finderinfo3,
     322             :                            sizeof(ad_finderinfo3),
     323             :                            0xffffff52);
     324           1 :         assert_null(ad);
     325             : 
     326           1 :         return;
     327             : }
     328             : 
     329           1 : static void parse_abouble_name(void **state)
     330             : {
     331           1 :         TALLOC_CTX *frame = *state;
     332           1 :         struct adouble *ad = NULL;
     333             : 
     334           1 :         ad = parse_adouble(frame, ad_name, sizeof(ad_name), 0x52);
     335           1 :         assert_null(ad);
     336             : 
     337           1 :         return;
     338             : }
     339             : 
     340           1 : static void parse_abouble_date1(void **state)
     341             : {
     342           1 :         TALLOC_CTX *frame = *state;
     343           1 :         struct adouble *ad = NULL;
     344           1 :         char *p = NULL;
     345             : 
     346           1 :         ad = parse_adouble(frame, ad_date1, sizeof(ad_date1), 0x52);
     347           1 :         assert_non_null(ad);
     348             : 
     349           1 :         p = ad_get_entry(ad, ADEID_FILEDATESI);
     350           1 :         assert_null(p);
     351             : 
     352           1 :         return;
     353             : }
     354             : 
     355           1 : static void parse_abouble_date2(void **state)
     356             : {
     357           1 :         TALLOC_CTX *frame = *state;
     358           1 :         struct adouble *ad = NULL;
     359             : 
     360           1 :         ad = parse_adouble(frame, ad_date2, sizeof(ad_date2), 0x52);
     361           1 :         assert_null(ad);
     362             : 
     363           1 :         return;
     364             : }
     365             : 
     366           1 : int main(int argc, char *argv[])
     367             : {
     368           1 :         int rc;
     369           1 :         const struct CMUnitTest tests[] = {
     370             :                 cmocka_unit_test(parse_abouble_basic),
     371             :                 cmocka_unit_test(parse_abouble_finderinfo1),
     372             :                 cmocka_unit_test(parse_abouble_finderinfo2),
     373             :                 cmocka_unit_test(parse_abouble_finderinfo3),
     374             :                 cmocka_unit_test(parse_abouble_name),
     375             :                 cmocka_unit_test(parse_abouble_date1),
     376             :                 cmocka_unit_test(parse_abouble_date2),
     377             :         };
     378             : 
     379           1 :         if (argc == 2) {
     380           0 :                 cmocka_set_test_filter(argv[1]);
     381             :         }
     382           1 :         cmocka_set_message_output(CM_OUTPUT_SUBUNIT);
     383             : 
     384           1 :         rc = cmocka_run_group_tests(tests,
     385             :                                     setup_talloc_context,
     386             :                                     teardown_talloc_context);
     387             : 
     388           1 :         return rc;
     389             : }

Generated by: LCOV version 1.14