Changeset 65 for trunk/lib


Ignore:
Timestamp:
07/23/06 13:00:20 (18 years ago)
Author:
tim
Message:

fixed a bug in types

added paranoid checks in smb_deps to prevent NULL pointer dereferences and corner-case memory leaks.

Location:
trunk/lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/regfio.c

    r61 r65  
    3131const unsigned int regfio_num_reg_types = 11;
    3232static const char* regfio_type_names[] =
    33   {"NONE", "SZ", "EXPAND_SZ", "BINARY", "DWORD", "DWORD_BE", "LINK"
     33  {"NONE", "SZ", "EXPAND_SZ", "BINARY", "DWORD", "DWORD_BE", "LINK",
    3434   "MULTI_SZ", "RSRC_LIST", "RSRC_DESC", "RSRC_REQ_LIST"};
    3535
  • trunk/lib/smb_deps.c

    r59 r65  
    44 *   http://websvn.samba.org/cgi-bin/viewcvs.cgi/trunk/source/
    55 *
    6  * Copyright (C) 2005 Timothy D. Morgan
     6 * Copyright (C) 2005-2006 Timothy D. Morgan
    77 * Copyright (C) 1992-2005 Samba development team
    88 *               (see individual files under Subversion for details.)
     
    181181    if((new_data = zalloc(new_size)) == NULL)
    182182      return false;
    183 
    184     memset(new_data, '\0', (size_t)new_size );
    185183  }
    186184  else
     
    237235bool prs_init(prs_struct *ps, uint32 size, void *ctx, bool io)
    238236{
     237  if(ps == NULL)
     238    return false;
    239239  memset(ps, 0, sizeof(prs_struct));
     240
    240241  ps->io = io;
    241242  ps->bigendian_data = RPC_LITTLE_ENDIAN;
     
    253254      return false;
    254255
    255     memset(ps->data_p, '\0', (size_t)size);
    256256    ps->is_dynamic = true; /* We own this memory. */
    257257  }
     
    279279      return NULL;
    280280  }
     281
    281282  return &ps->data_p[ps->data_offset];
    282283}
     
    795796  uint32 old_offset;
    796797  uint32 offset_acl_size;
    797   SEC_ACL *psa;
     798  SEC_ACL* psa;
    798799
    799800  /*
     
    804805   */
    805806
    806   if (ppsa == NULL)
     807  if (ppsa == NULL || ps == NULL)
    807808    return false;
    808809
     
    819820  }
    820821
    821   depth++;
    822        
     822  depth++;     
    823823  old_offset = ps->data_offset;
    824824
    825   if(!prs_uint16("revision", ps, depth, &psa->revision))
    826     return false;
    827 
    828   if(!prs_uint16_pre("size     ", ps, depth, &psa->size, &offset_acl_size))
    829     return false;
    830 
    831   if(!prs_uint32("num_aces ", ps, depth, &psa->num_aces))
    832     return false;
     825  if(!prs_uint16("revision", ps, depth, &psa->revision)
     826     || !prs_uint16_pre("size     ", ps, depth, &psa->size, &offset_acl_size)
     827     || !prs_uint32("num_aces ", ps, depth, &psa->num_aces))
     828  {
     829    free(psa);
     830    *ppsa = NULL;
     831    return false;
     832  }
    833833
    834834  if (ps->io)
     
    840840     */
    841841    if((psa->ace = (SEC_ACE*)zcalloc(sizeof(SEC_ACE), psa->num_aces+1)) == NULL)
    842       return false;
     842    {
     843      free(psa);
     844      *ppsa = NULL;
     845      return false;
     846    }
    843847  }
    844848
     
    848852    snprintf(tmp, sizeof(tmp)-1, "ace_list[%02d]: ", i);
    849853    if(!sec_io_ace(tmp, &psa->ace[i], ps, depth))
    850       return false;
     854    {
     855      free(psa);
     856      *ppsa = NULL;
     857      return false;
     858    }
    851859  }
    852860
     
    864872    {
    865873      if (!prs_uint8("acl extra space", ps, depth, &c))
     874      {
     875        free(psa);
     876        *ppsa = NULL;
    866877        return false;
     878      }
    867879    }
    868880  }
     
    870882  if(!prs_uint16_post("size     ", ps, depth, &psa->size,
    871883                      offset_acl_size, old_offset))
    872   { return false; }
     884  {
     885    free(psa);
     886    *ppsa = NULL;
     887    return false;
     888  }
    873889
    874890  return true;
     
    888904  SEC_DESC *psd;
    889905
    890   if (ppsd == NULL)
     906  if (ppsd == NULL || ps == NULL)
    891907    return false;
    892908
    893909  psd = *ppsd;
    894 
    895910  if (psd == NULL)
    896911  {
     
    913928  old_offset = ps->data_offset;
    914929
    915   if(!prs_uint16("revision ", ps, depth, &psd->revision))
    916     return false;
    917 
    918   if(!prs_uint16("type     ", ps, depth, &psd->type))
    919     return false;
    920 
    921   if (!ps->io)
     930  if(!prs_uint16("revision ", ps, depth, &psd->revision)
     931     || !prs_uint16("type     ", ps, depth, &psd->type))
     932  {
     933    free(psd);
     934    *ppsd = NULL;
     935    return false;
     936  }
     937
     938  if (!ps->io)
    922939  {
    923940    uint32 offset = SEC_DESC_HEADER_SIZE;
     
    960977  }
    961978
    962   if(!prs_uint32("off_owner_sid", ps, depth, &psd->off_owner_sid))
    963     return false;
    964 
    965   if(!prs_uint32("off_grp_sid  ", ps, depth, &psd->off_grp_sid))
    966     return false;
    967 
    968   if(!prs_uint32("off_sacl     ", ps, depth, &psd->off_sacl))
    969     return false;
    970 
    971   if(!prs_uint32("off_dacl     ", ps, depth, &psd->off_dacl))
    972     return false;
    973 
     979  if(!prs_uint32("off_owner_sid", ps, depth, &psd->off_owner_sid)
     980     || !prs_uint32("off_grp_sid  ", ps, depth, &psd->off_grp_sid)
     981     || !prs_uint32("off_sacl     ", ps, depth, &psd->off_sacl)
     982     || !prs_uint32("off_dacl     ", ps, depth, &psd->off_dacl))
     983  {
     984    free(psd);
     985    *ppsd = NULL;   
     986    return false;
     987  }
    974988  max_offset = MAX(max_offset, ps->data_offset);
    975989
     
    978992    tmp_offset = ps->data_offset;
    979993    if(!prs_set_offset(ps, old_offset + psd->off_owner_sid))
    980       return false;
     994    {
     995      free(psd);
     996      *ppsd = NULL;
     997      return false;
     998    }
    981999
    9821000    if (ps->io)
     
    9841002      /* reading */
    9851003      if((psd->owner_sid = (DOM_SID*)zalloc(sizeof(DOM_SID))) == NULL)
     1004      {
     1005        free(psd);
     1006        *ppsd = NULL;
    9861007        return false;
     1008      }
    9871009    }
    9881010
    9891011    if(!smb_io_dom_sid("owner_sid ", psd->owner_sid , ps, depth))
    990       return false;
     1012    {
     1013      if(ps->io)
     1014        free(psd->owner_sid);
     1015      free(psd);
     1016      *ppsd = NULL;
     1017      return false;
     1018    }
    9911019
    9921020    max_offset = MAX(max_offset, ps->data_offset);
    9931021
    9941022    if (!prs_set_offset(ps,tmp_offset))
    995       return false;
     1023    {
     1024      if(ps->io)
     1025        free(psd->owner_sid);
     1026      free(psd);
     1027      *ppsd = NULL;
     1028      return false;
     1029    }
    9961030  }
    9971031
     
    10001034    tmp_offset = ps->data_offset;
    10011035    if(!prs_set_offset(ps, old_offset + psd->off_grp_sid))
    1002       return false;
     1036    {
     1037      if(ps->io)
     1038        free(psd->owner_sid);
     1039      free(psd);
     1040      *ppsd = NULL;
     1041      return false;
     1042    }
    10031043
    10041044    if (ps->io)
     
    10061046      /* reading */
    10071047      if((psd->grp_sid = (DOM_SID*)zalloc(sizeof(DOM_SID))) == NULL)
     1048      {
     1049        free(psd->owner_sid);
     1050        free(psd);
     1051        *ppsd = NULL;
    10081052        return false;
     1053      }
    10091054    }
    10101055
    10111056    if(!smb_io_dom_sid("grp_sid", psd->grp_sid, ps, depth))
    1012       return false;
     1057    {
     1058      if(ps->io)
     1059      {
     1060        free(psd->grp_sid);
     1061        free(psd->owner_sid);
     1062      }
     1063      free(psd);
     1064      *ppsd = NULL;
     1065      return false;
     1066    }
    10131067                       
    10141068    max_offset = MAX(max_offset, ps->data_offset);
    10151069
    10161070    if (!prs_set_offset(ps,tmp_offset))
    1017       return false;
     1071    {
     1072      if(ps->io)
     1073      {
     1074        free(psd->grp_sid);
     1075        free(psd->owner_sid);
     1076      }
     1077      free(psd);
     1078      *ppsd = NULL;
     1079      return false;
     1080    }
    10181081  }
    10191082
     
    10211084  {
    10221085    tmp_offset = ps->data_offset;
    1023     if(!prs_set_offset(ps, old_offset + psd->off_sacl))
    1024       return false;
    1025     if(!sec_io_acl("sacl", &psd->sacl, ps, depth))
    1026       return false;
     1086    if(!prs_set_offset(ps, old_offset + psd->off_sacl)
     1087       || !sec_io_acl("sacl", &psd->sacl, ps, depth))
     1088    {
     1089      if(ps->io)
     1090      {
     1091        free(psd->grp_sid);
     1092        free(psd->owner_sid);
     1093      }
     1094      free(psd);
     1095      *ppsd = NULL;
     1096      return false;
     1097    }
    10271098    max_offset = MAX(max_offset, ps->data_offset);
    10281099    if (!prs_set_offset(ps,tmp_offset))
    1029       return false;
     1100    {
     1101      if(ps->io)
     1102      {
     1103        free(psd->grp_sid);
     1104        free(psd->owner_sid);
     1105      }
     1106      free(psd);
     1107      *ppsd = NULL;
     1108      return false;
     1109    }
    10301110  }
    10311111
     
    10331113  {
    10341114    tmp_offset = ps->data_offset;
    1035     if(!prs_set_offset(ps, old_offset + psd->off_dacl))
    1036       return false;
    1037     if(!sec_io_acl("dacl", &psd->dacl, ps, depth))
    1038       return false;
     1115    if(!prs_set_offset(ps, old_offset + psd->off_dacl)
     1116       || !sec_io_acl("dacl", &psd->dacl, ps, depth))
     1117    {
     1118      if(ps->io)
     1119      {
     1120        free(psd->grp_sid);
     1121        free(psd->owner_sid);
     1122      }
     1123      free(psd);
     1124      *ppsd = NULL;
     1125      return false;
     1126    }
    10391127    max_offset = MAX(max_offset, ps->data_offset);
    10401128    if (!prs_set_offset(ps,tmp_offset))
    1041       return false;
     1129    {
     1130      if(ps->io)
     1131      {
     1132        free(psd->grp_sid);
     1133        free(psd->owner_sid);
     1134      }
     1135      free(psd);
     1136      *ppsd = NULL;
     1137      return false;
     1138    }
    10421139  }
    10431140
    10441141  if(!prs_set_offset(ps, max_offset))
    1045     return false;
     1142  {
     1143      if(ps->io)
     1144      {
     1145        free(psd->grp_sid);
     1146        free(psd->owner_sid);
     1147      }
     1148      free(psd);
     1149      *ppsd = NULL;
     1150      return false;
     1151  }
    10461152
    10471153  return true;
     
    10571163bool sec_ace_equal(SEC_ACE *s1, SEC_ACE *s2)
    10581164{
    1059   /* Trivial case */
     1165  /* Trivial cases */
    10601166  if (!s1 && !s2)
    10611167    return true;
     1168  if (!s1 || !s2)
     1169    return false;
    10621170
    10631171  /* Check top level stuff */
     
    11301238bool sec_desc_equal(SEC_DESC *s1, SEC_DESC *s2)
    11311239{
    1132   /* Trivial case */
    1133 
     1240  /* Trivial cases */
    11341241  if (!s1 && !s2)
    1135     goto done;
     1242    return true;
     1243  if (!s1 || !s2)
     1244    return false;
    11361245
    11371246  /* Check top level stuff */
     
    11591268    return false;
    11601269
    1161  done:
    11621270  return true;
    11631271}
Note: See TracChangeset for help on using the changeset viewer.