diff --git a/pclsync/papi.c b/pclsync/papi.c index 511e25d..b6cfcee 100644 --- a/pclsync/papi.c +++ b/pclsync/papi.c @@ -314,10 +314,9 @@ static binresult *do_parse_result(unsigned char **restrict indata, arr = NULL; cnt = 0; alloc = 128; - arr = (binresult **)pmem_malloc(PMEM_SUBSYS_API, alloc * sizeof(binresult *)); + arr = (binresult **)pmem_malloc_array(PMEM_SUBSYS_API, alloc, sizeof(binresult *)); if (!arr) return NULL; - memset(arr, 0, alloc * sizeof(binresult *)); while (**indata != RPARAM_END) { if (cnt == alloc) { binresult **tmp; @@ -348,10 +347,9 @@ static binresult *do_parse_result(unsigned char **restrict indata, arr = NULL; cnt = 0; alloc = 32; - arr = (struct _hashpair *)pmem_malloc(PMEM_SUBSYS_API, alloc * sizeof(struct _hashpair)); + arr = (struct _hashpair *)pmem_malloc_array(PMEM_SUBSYS_API, alloc, sizeof(struct _hashpair)); if (!arr) return NULL; - memset(arr, 0, alloc * sizeof(struct _hashpair)); while (**indata != RPARAM_END) { if (cnt == alloc) { struct _hashpair *tmp; @@ -401,16 +399,14 @@ static binresult *parse_result(unsigned char *data, size_t datalen) { retlen = calc_ret_len(&datac, &datalenc, &strcnt); if (retlen == -1) return NULL; - datac = pmem_malloc(PMEM_SUBSYS_API, retlen * sizeof(unsigned char)); + datac = pmem_malloc_array(PMEM_SUBSYS_API, retlen, sizeof(unsigned char)); if (!datac) return NULL; - memset(datac, 0, retlen * sizeof(unsigned char)); - strings = pmem_malloc(PMEM_SUBSYS_API, strcnt * sizeof(binresult *)); + strings = pmem_malloc_array(PMEM_SUBSYS_API, strcnt, sizeof(binresult *)); if (!strings) { pmem_free(PMEM_SUBSYS_API, datac); return NULL; } - memset(strings, 0, strcnt * sizeof(binresult *)); strcnt = 0; res = do_parse_result(&data, &datac, strings, &strcnt); pmem_free(PMEM_SUBSYS_API, strings); diff --git a/pclsync/pbusinessaccount.c b/pclsync/pbusinessaccount.c index 7837759..acb8bb5 100644 --- a/pclsync/pbusinessaccount.c +++ b/pclsync/pbusinessaccount.c @@ -104,20 +104,18 @@ int do_psync_account_stopshare(psync_shareid_t usershareids[], int nusershareid, if (unlikely(numparam == 1)) return -3; - t = (binparam *)pmem_malloc(PMEM_SUBSYS_API, numparam * sizeof(binparam)); + t = (binparam *)pmem_malloc_array(PMEM_SUBSYS_API, numparam, sizeof(binparam)); if (!t) return -1; - memset(t, 0, numparam * sizeof(binparam)); init_param_str(t, "auth", psync_my_auth); if (nusershareid) { - ids1 = (char *)pmem_malloc(PMEM_SUBSYS_API, nusershareid * FOLDERID_ENTRY_SIZE); + ids1 = (char *)pmem_malloc_array(PMEM_SUBSYS_API, nusershareid, FOLDERID_ENTRY_SIZE); if (!ids1) { pmem_free(PMEM_SUBSYS_API, t); return -1; } - memset(ids1, 0, nusershareid * FOLDERID_ENTRY_SIZE); idsp = ids1; for (i = 0; i < nusershareid; ++i) { k = sprintf(idsp, "%lld", (long long)usershareids[i]); @@ -133,14 +131,13 @@ int do_psync_account_stopshare(psync_shareid_t usershareids[], int nusershareid, } if (nteamshareid) { - ids2 = (char *)pmem_malloc(PMEM_SUBSYS_API, nteamshareid * FOLDERID_ENTRY_SIZE); + ids2 = (char *)pmem_malloc_array(PMEM_SUBSYS_API, nteamshareid, FOLDERID_ENTRY_SIZE); if (!ids2) { if (nusershareid) pmem_free(PMEM_SUBSYS_API, ids1); pmem_free(PMEM_SUBSYS_API, t); return -1; } - memset(ids2, 0, nteamshareid * FOLDERID_ENTRY_SIZE); idsp = ids2; for (i = 0; i < nteamshareid; ++i) { k = sprintf(idsp, "%lld", (long long)teamshareids[i]); @@ -225,28 +222,25 @@ int do_psync_account_modifyshare(psync_shareid_t usrshrids[], uint32_t uperms[], if (unlikely(numparam == 1)) return -3; - t = (binparam *)pmem_malloc(PMEM_SUBSYS_API, numparam * sizeof(binparam)); + t = (binparam *)pmem_malloc_array(PMEM_SUBSYS_API, numparam, sizeof(binparam)); if (!t) return -1; - memset(t, 0, numparam * sizeof(binparam)); init_param_str(t, "auth", psync_my_auth); if (nushid) { - ids1 = (char *)pmem_malloc(PMEM_SUBSYS_API, nushid * FOLDERID_ENTRY_SIZE); + ids1 = (char *)pmem_malloc_array(PMEM_SUBSYS_API, nushid, FOLDERID_ENTRY_SIZE); if (!ids1) { pmem_free(PMEM_SUBSYS_API, t); return -1; } - memset(ids1, 0, nushid * FOLDERID_ENTRY_SIZE); idsp = ids1; - perms1 = (char *)pmem_malloc(PMEM_SUBSYS_API, nushid * FOLDERID_ENTRY_SIZE); + perms1 = (char *)pmem_malloc_array(PMEM_SUBSYS_API, nushid, FOLDERID_ENTRY_SIZE); if (!perms1) { pmem_free(PMEM_SUBSYS_API, ids1); pmem_free(PMEM_SUBSYS_API, t); return -1; } - memset(perms1, 0, nushid * FOLDERID_ENTRY_SIZE); permsp = perms1; for (i = 0; i < nushid; ++i) { k = sprintf(idsp, "%lld", (long long)usrshrids[i]); @@ -271,7 +265,7 @@ int do_psync_account_modifyshare(psync_shareid_t usrshrids[], uint32_t uperms[], } if (ntmshid) { - ids2 = (char *)pmem_malloc(PMEM_SUBSYS_API, ntmshid * FOLDERID_ENTRY_SIZE); + ids2 = (char *)pmem_malloc_array(PMEM_SUBSYS_API, ntmshid, FOLDERID_ENTRY_SIZE); if (!ids2) { if (nushid) { pmem_free(PMEM_SUBSYS_API, perms1); @@ -280,9 +274,8 @@ int do_psync_account_modifyshare(psync_shareid_t usrshrids[], uint32_t uperms[], pmem_free(PMEM_SUBSYS_API, t); return -1; } - memset(ids2, 0, ntmshid * FOLDERID_ENTRY_SIZE); idsp = ids2; - perms2 = (char *)pmem_malloc(PMEM_SUBSYS_API, ntmshid * FOLDERID_ENTRY_SIZE); + perms2 = (char *)pmem_malloc_array(PMEM_SUBSYS_API, ntmshid, FOLDERID_ENTRY_SIZE); if (!perms2) { pmem_free(PMEM_SUBSYS_API, ids2); if (nushid) { @@ -292,7 +285,6 @@ int do_psync_account_modifyshare(psync_shareid_t usrshrids[], uint32_t uperms[], pmem_free(PMEM_SUBSYS_API, t); return -1; } - memset(perms2, 0, ntmshid * FOLDERID_ENTRY_SIZE); permsp = perms2; for (i = 0; i < ntmshid; ++i) { diff --git a/pclsync/pmem.c b/pclsync/pmem.c index 348abca..363e5b4 100644 --- a/pclsync/pmem.c +++ b/pclsync/pmem.c @@ -136,3 +136,31 @@ void *pmem_realloc(pmem_subsystem_t subsystem, void *ptr, size_t size) { size_t pmem_get_stats(pmem_subsystem_t subsystem) { return __atomic_load_n(&subsystem_stats[subsystem], __ATOMIC_RELAXED); } + +void *pmem_malloc_array(pmem_subsystem_t subsystem, size_t nmemb, size_t size) { + pmem_header_t *hdr; + size_t alloc_size; + size_t total_size; + void *ptr; + + if (nmemb != 0 && size > SIZE_MAX / nmemb) { + return NULL; + } + + alloc_size = nmemb * size; + total_size = sizeof(pmem_header_t) + alloc_size; + + hdr = (pmem_header_t *)malloc(total_size); + if (!hdr) { + return NULL; + } + + hdr->size = alloc_size; + hdr->subsystem = subsystem; + __atomic_add_fetch(&subsystem_stats[subsystem], alloc_size, __ATOMIC_RELAXED); + + ptr = (void *)(hdr + 1); + memset(ptr, 0, alloc_size); + + return ptr; +} diff --git a/pclsync/pmem.h b/pclsync/pmem.h index 12461fd..474121d 100644 --- a/pclsync/pmem.h +++ b/pclsync/pmem.h @@ -23,6 +23,7 @@ void *pmem_calloc_safe(size_t nmemb, size_t size); void *pmem_malloc(pmem_subsystem_t subsystem, size_t size); void pmem_free(pmem_subsystem_t subsystem, void *ptr); void *pmem_realloc(pmem_subsystem_t subsystem, void *ptr, size_t size); +void *pmem_malloc_array(pmem_subsystem_t subsystem, size_t nmemb, size_t size); size_t pmem_get_stats(pmem_subsystem_t subsystem); #endif \ No newline at end of file diff --git a/pclsync/ptools.c b/pclsync/ptools.c index ba1c829..87adbf2 100644 --- a/pclsync/ptools.c +++ b/pclsync/ptools.c @@ -136,11 +136,10 @@ int ptools_create_backend_event(const char *binapi, const char *category, paramsLocal[5] = (binparam)PAPI_NUM(EPARAM_TIME, etime); if (pCnt > 0) { - keyParams = (char *)pmem_malloc(PMEM_SUBSYS_OTHER, pCnt * 258); + keyParams = (char *)pmem_malloc_array(PMEM_SUBSYS_OTHER, pCnt, 258); if (!keyParams) { return -1; } - memset(keyParams, 0, pCnt * 258); keyParams[0] = 0; for (i = 0; i < pCnt; i++) { @@ -376,7 +375,7 @@ int ptools_backend_call(const char *binapi, const char *wsPath, if (strlen(payloadName) > 0) { payload = (binresult *)papi_find_result2(res, payloadName, PARAM_HASH); - *resData = (binresult *)pmem_malloc(PMEM_SUBSYS_OTHER, payload->length * sizeof(binresult)); + *resData = (binresult *)pmem_malloc_array(PMEM_SUBSYS_OTHER, payload->length, sizeof(binresult)); if (!*resData) { return -1; } @@ -458,11 +457,10 @@ void ptools_send_psyncs_event(const char *binapi, const char *auth) { int intRes; int syncCnt = 0; - errMsg = (char *)pmem_malloc(PMEM_SUBSYS_OTHER, 1024 * sizeof(char)); + errMsg = (char *)pmem_malloc_array(PMEM_SUBSYS_OTHER, 1024, sizeof(char)); if (!errMsg) { return; } - memset(errMsg, 0, 1024 * sizeof(char)); errMsg[0] = 0; time(&rawtime);