Changeset 725


Ignore:
Timestamp:
Jul 5, 2007, 10:15:59 PM (13 years ago)
Author:
Steven Levine
Message:

GetFileEAs: avoid heap corruption

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/eas.c

    r574 r725  
    1515  17 Jul 06 SHL Use Runtime_Error
    1616  22 Mar 07 GKY Use QWL_USER
     17  05 Jul 07 SHL GetFileEAs: avoid heap corruption
    1718
    1819***********************************************************************/
     
    171172
    172173            ealen = sizeof(FEA2LIST) + strlen(s) + 64;
    173             rc = DosAllocMem((PPVOID) & pfealist, ealen + 1L,
     174            rc = DosAllocMem((PPVOID) & pfealist, ealen + 1,
    174175                             OBJ_TILE | PAG_COMMIT | PAG_READ | PAG_WRITE);
    175176            if (rc)
     
    179180              memset(pfealist, 0, ealen + 1);
    180181              pfealist->cbList = ealen;
    181               pfealist->list[0].oNextEntryOffset = 0L;
     182              pfealist->list[0].oNextEntryOffset = 0;
    182183              pfealist->list[0].fEA = 0;
    183184              pfealist->list[0].cbName = strlen(s);
     
    202203              eaop.fpGEA2List = (PGEA2LIST) 0;
    203204              eaop.fpFEA2List = pfealist;
    204               eaop.oError = 0L;
     205              eaop.oError = 0;
    205206              DosSetPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & eaop,
    206207                             (ULONG) sizeof(EAOP2), DSPI_WRTTHRU);
     
    483484                const CHAR *linefeed = "\n";
    484485                BOOL alltext;
    485                 IPT pos = 0L;
     486                IPT pos = 0;
    486487
    487488                info = eap->head;
     
    902903          eaop.fpGEA2List = &gealist;
    903904          eaop.fpFEA2List = pfealist;
    904           eaop.oError = 0L;
     905          eaop.oError = 0;
    905906          rc = DosSetPathInfo(eap->filename, FIL_QUERYEASIZE, (PVOID) & eaop,
    906907                              (ULONG) sizeof(EAOP2), DSPI_WRTTHRU);
     
    10051006    return (PVOID) pfealist;
    10061007  len = strlen(newdata);
    1007   ealen = sizeof(FEA2LIST) + 24L + (ULONG) current->cbName + 1L +
    1008     (ULONG) len + 4L;
     1008  ealen = sizeof(FEA2LIST) + 24 + (ULONG) current->cbName + 1 +
     1009         (ULONG)len + 4;
    10091010  switch (*(USHORT *) current->value) {
    10101011  case EAT_EA:
     
    10441045  else {
    10451046    memset(pfealist, 0, ealen);
    1046     pfealist->list[0].oNextEntryOffset = 0L;
     1047    pfealist->list[0].oNextEntryOffset = 0;
    10471048    pfealist->list[0].fEA = 0;          //current->fEA;
    10481049
     
    11451146    eaop.fpGEA2List = (PGEA2LIST) 0;
    11461147    eaop.fpFEA2List = pfealist;
    1147     eaop.oError = 0L;
    1148     pfealist->cbList = 13L + (ULONG) pfealist->list[0].cbName +
    1149       (ULONG) pfealist->list[0].cbValue;
     1148    eaop.oError = 0;
     1149    pfealist->cbList = 13 + (ULONG) pfealist->list[0].cbName +
     1150                       (ULONG)pfealist->list[0].cbValue;
    11501151
    11511152    rc = DosSetPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & eaop,
     
    11881189  if (!filename)
    11891190    return head;
    1190   if (ishandle || !DosOpen(filename, &handle, &action, 0L, 0,
     1191  if (ishandle || !DosOpen(filename, &handle, &action, 0, 0,
    11911192                           OPEN_ACTION_FAIL_IF_NEW |
    11921193                           OPEN_ACTION_OPEN_IF_EXISTS,
    11931194                           OPEN_FLAGS_NOINHERIT |
    11941195                           OPEN_SHARE_DENYREADWRITE |
    1195                            OPEN_ACCESS_READWRITE, (PEAOP2) 0)) {
     1196                           OPEN_ACCESS_READWRITE, (PEAOP2)0)) {
    11961197    if (ishandle)
    11971198      handle = *(HFILE *) filename;
    1198     if (!DosQueryFileInfo(handle, FIL_QUERYEASIZE, (PVOID) & fsa4,
    1199                           (ULONG) sizeof(fsa4)) && fsa4.cbList > 4L) {
    1200 
     1199    if (!DosQueryFileInfo(handle, FIL_QUERYEASIZE, (PVOID)&fsa4,
     1200                          (ULONG) sizeof(fsa4)) &&
     1201        fsa4.cbList > 4)
     1202    {
    12011203      PDENA2 pdena;
    12021204      EAOP2 eaop;
     
    12041206      PFEA2LIST pfealist;
    12051207      PGEA2 pgea;
    1206       ULONG x = 1L, ecnt = 1L;
     1208      ULONG ulEntry = 1;                // Ordinal of EA to return
     1209      ULONG ulCount = 1;                // # of EAs to return
    12071210
    12081211      pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
    12091212      if (pdena) {
    1210         while (!DosEnumAttribute
    1211                (ENUMEA_REFTYPE_FHANDLE, &handle, x, (PVOID) pdena,
    1212                 (ULONG) 65536L, &ecnt, ENUMEA_LEVEL_NO_VALUE) && ecnt) {
     1213        while (!DosEnumAttribute(ENUMEA_REFTYPE_FHANDLE,
     1214                                 &handle,
     1215                                 ulEntry,
     1216                                 (PVOID)pdena,
     1217                                 (ULONG)65536L,
     1218                                 &ulCount,
     1219                                 ENUMEA_LEVEL_NO_VALUE) &&
     1220               ulCount)
     1221        {
     1222          // 64 is for header and spare - fixme to allocate smarter
    12131223          pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
    12141224          if (pgealist) {
    12151225            pgealist->cbList = 64 + pdena->cbName;
    12161226            pgea = pgealist->list;
    1217             pgea->oNextEntryOffset = 0L;
     1227            pgea->oNextEntryOffset = 0;
    12181228            pgea->cbName = pdena->cbName;
    12191229            memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
    1220             pfealist =
    1221               xmallocz(64 + pdena->cbName + pdena->cbValue, pszSrcFile,
    1222                        __LINE__);
     1230            pfealist = xmallocz(64 + pdena->cbName + pdena->cbValue,
     1231                                pszSrcFile, __LINE__);
    12231232            if (pfealist) {
    12241233              pfealist->cbList = 64 + pdena->cbName + pdena->cbValue;
    12251234              eaop.fpGEA2List = pgealist;
    12261235              eaop.fpFEA2List = pfealist;
    1227               eaop.oError = 0L;
    1228               // saymsg(MB_ENTER,HWND_DESKTOP,"Debug1","\"%s\" %ld",pdena->szName,x);
     1236              eaop.oError = 0;
     1237              // saymsg(MB_ENTER,HWND_DESKTOP,"Debug1","\"%s\" %ld",pdena->szName,ulEntry);
    12291238              rc =
    12301239                DosQueryFileInfo(handle, FIL_QUERYEASFROMLIST, (PVOID) & eaop,
     
    12431252                info = xmalloc(sizeof(HOLDFEA), pszSrcFile, __LINE__);
    12441253                if (info) {
    1245                   info->pfea =
    1246                     xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG),
    1247                             pszSrcFile, __LINE__);
     1254                  // 05 Jul 07 SHL was one short
     1255                  info->pfea = xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG) + 1,
     1256                                       pszSrcFile, __LINE__);
    12481257                  memcpy(info->pfea, eaop.fpFEA2List->list,
    12491258                         eaop.fpFEA2List->cbList - sizeof(ULONG));
     
    12651274            free(pgealist);
    12661275          }
    1267           x += ecnt;
    1268         }
     1276          ulEntry += ulCount;
     1277        } // while
    12691278        free(pdena);
    12701279        DosPostEventSem(CompactSem);
     
    12751284  }
    12761285  else {
     1286    Runtime_Error(pszSrcFile, __LINE__, "why here", filename);
    12771287    /* try it without opening it */
    12781288    if (!DosQueryPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & fsa4,
    1279                           (ULONG) sizeof(fsa4)) && fsa4.cbList > 4L) {
    1280 
     1289                          (ULONG) sizeof(fsa4)) &&
     1290        fsa4.cbList > 4)
     1291    {
    12811292      PDENA2 pdena;
    12821293      EAOP2 eaop;
     
    12841295      PFEA2LIST pfealist;
    12851296      PGEA2 pgea;
    1286       ULONG x = 1L, ecnt = 1L;
     1297      ULONG ulEntry = 1, ulCount = 1;
    12871298
    12881299      pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
    12891300      if (pdena) {
    12901301        while (!DosEnumAttribute
    1291                (ENUMEA_REFTYPE_PATH, filename, x, (PVOID) pdena,
    1292                 (ULONG) 65536L, &ecnt, ENUMEA_LEVEL_NO_VALUE) && ecnt) {
     1302               (ENUMEA_REFTYPE_PATH, filename, ulEntry, (PVOID) pdena,
     1303                (ULONG) 65536L, &ulCount, ENUMEA_LEVEL_NO_VALUE) && ulCount)
     1304        {
    12931305          pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
    12941306          if (pgealist) {
    12951307            pgealist->cbList = 64 + pdena->cbName;
    12961308            pgea = pgealist->list;
    1297             pgea->oNextEntryOffset = 0L;
     1309            pgea->oNextEntryOffset = 0;
    12981310            pgea->cbName = pdena->cbName;
    12991311            memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
     
    13051317              eaop.fpGEA2List = pgealist;
    13061318              eaop.fpFEA2List = pfealist;
    1307               eaop.oError = 0L;
    1308 // saymsg(MB_ENTER,HWND_DESKTOP,"Debug2","\"%s\" %ld",pdena->szName,x);
     1319              eaop.oError = 0;
     1320              // saymsg(MB_ENTER,HWND_DESKTOP,"Debug2","\"%s\" %ld",pdena->szName,ulEntry);
    13091321              rc = DosQueryPathInfo(filename, FIL_QUERYEASFROMLIST,
    13101322                                    (PVOID) & eaop, (ULONG) sizeof(EAOP2));
     
    13601372            free(pgealist);
    13611373          }
    1362           x += ecnt;
    1363         }
     1374          ulEntry += ulCount;
     1375        } // while
    13641376        free(pdena);
    13651377        DosPostEventSem(CompactSem);
Note: See TracChangeset for help on using the changeset viewer.