Version in base suite: 18.08.5.2-1 Base version: slurm-llnl_18.08.5.2-1 Target version: slurm-llnl_18.08.5.2-1+deb10u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/s/slurm-llnl/slurm-llnl_18.08.5.2-1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/s/slurm-llnl/slurm-llnl_18.08.5.2-1+deb10u1.dsc changelog | 7 patches/CVE-2019-12838 | 1580 ++++++++++++++++++++++++++++++++++++++++++++++++ patches/fix-SIGABRT | 44 + patches/fix-memory-leak | 81 ++ patches/series | 3 5 files changed, 1715 insertions(+) diff -Nru slurm-llnl-18.08.5.2/debian/changelog slurm-llnl-18.08.5.2/debian/changelog --- slurm-llnl-18.08.5.2/debian/changelog 2019-02-17 12:32:52.000000000 +0000 +++ slurm-llnl-18.08.5.2/debian/changelog 2019-10-17 12:30:18.000000000 +0000 @@ -1,3 +1,10 @@ +slurm-llnl (18.08.5.2-1+deb10u1) buster-security; urgency=high + + * FIX CVE-2019-12838 by escaping strings in archive files in + accounting_storage/mysql + + -- Gennaro Oliva Thu, 17 Oct 2019 14:30:18 +0200 + slurm-llnl (18.08.5.2-1) unstable; urgency=medium * New upstream release fixes CVE-2019-6438 (Closes: #920997) diff -Nru slurm-llnl-18.08.5.2/debian/patches/CVE-2019-12838 slurm-llnl-18.08.5.2/debian/patches/CVE-2019-12838 --- slurm-llnl-18.08.5.2/debian/patches/CVE-2019-12838 1970-01-01 00:00:00.000000000 +0000 +++ slurm-llnl-18.08.5.2/debian/patches/CVE-2019-12838 2019-10-17 12:30:18.000000000 +0000 @@ -0,0 +1,1580 @@ +Description: Escape strings extracted from an archive file in accounting_storage/mysql + Use safe_unpackstr_xmalloc() instead of unpackstr_ptr to ensure all + strings are escaped correctly in SlurmDBD. + This requires the introduction of the _free_local_*() functions to free + the structure members, whereas they were previously just pointers into + the single managed buffer which was cleaned up elsewhere. + Remove the unsafe unpackstr_ptr macro definition as well. + Fix CVE-2019-12838 +Author: Nate Rini +Origin: upstream, https://github.com/SchedMD/slurm/commit/afa7d743f407c60a7c8a4bd98a10be32c82988b5 +Date: 2019-07-10 + +--- a/src/common/pack.h ++++ b/src/common/pack.h +@@ -328,9 +328,6 @@ + FREE_NULL_BITMAP(b); \ + } while (0) + +-#define unpackstr_ptr \ +- unpackmem_ptr +- + #define unpackstr_malloc \ + unpackmem_malloc + +--- a/src/plugins/accounting_storage/mysql/as_mysql_archive.c ++++ b/src/plugins/accounting_storage/mysql/as_mysql_archive.c +@@ -77,6 +77,20 @@ + char *tres_str; + } local_event_t; + ++static void _free_local_event_members(local_event_t *object) ++{ ++ if (object) { ++ xfree(object->cluster_nodes); ++ xfree(object->node_name); ++ xfree(object->period_end); ++ xfree(object->period_start); ++ xfree(object->reason); ++ xfree(object->reason_uid); ++ xfree(object->state); ++ xfree(object->tres_str); ++ } ++} ++ + typedef struct { + char *account; + char *admin_comment; +@@ -122,6 +136,54 @@ + char *work_dir; + } local_job_t; + ++static void _free_local_job_members(local_job_t *object) ++{ ++ if (object) { ++ xfree(object->account); ++ xfree(object->admin_comment); ++ xfree(object->alloc_nodes); ++ xfree(object->associd); ++ xfree(object->array_jobid); ++ xfree(object->array_max_tasks); ++ xfree(object->array_taskid); ++ xfree(object->blockid); ++ xfree(object->derived_ec); ++ xfree(object->derived_es); ++ xfree(object->exit_code); ++ xfree(object->eligible); ++ xfree(object->end); ++ xfree(object->gid); ++ xfree(object->job_db_inx); ++ xfree(object->jobid); ++ xfree(object->kill_requid); ++ xfree(object->mcs_label); ++ xfree(object->name); ++ xfree(object->nodelist); ++ xfree(object->node_inx); ++ xfree(object->pack_job_id); ++ xfree(object->pack_job_offset); ++ xfree(object->partition); ++ xfree(object->priority); ++ xfree(object->qos); ++ xfree(object->req_cpus); ++ xfree(object->req_mem); ++ xfree(object->resvid); ++ xfree(object->start); ++ xfree(object->state); ++ xfree(object->submit); ++ xfree(object->suspended); ++ xfree(object->system_comment); ++ xfree(object->timelimit); ++ xfree(object->track_steps); ++ xfree(object->tres_alloc_str); ++ xfree(object->tres_req_str); ++ xfree(object->uid); ++ xfree(object->wckey); ++ xfree(object->wckey_id); ++ xfree(object->work_dir); ++ } ++} ++ + typedef struct { + char *assocs; + char *flags; +@@ -135,6 +197,22 @@ + char *unused_wall; + } local_resv_t; + ++static void _free_local_resv_members(local_resv_t *object) ++{ ++ if (object) { ++ xfree(object->assocs); ++ xfree(object->flags); ++ xfree(object->id); ++ xfree(object->name); ++ xfree(object->nodes); ++ xfree(object->node_inx); ++ xfree(object->time_end); ++ xfree(object->time_start); ++ xfree(object->tres_str); ++ xfree(object->unused_wall); ++ } ++} ++ + typedef struct { + char *act_cpufreq; + char *exit_code; +@@ -178,6 +256,52 @@ + char *user_usec; + } local_step_t; + ++static void _free_local_step_members(local_step_t *object) ++{ ++ if (object) { ++ xfree(object->act_cpufreq); ++ xfree(object->exit_code); ++ xfree(object->consumed_energy); ++ xfree(object->job_db_inx); ++ xfree(object->kill_requid); ++ xfree(object->name); ++ xfree(object->nodelist); ++ xfree(object->nodes); ++ xfree(object->node_inx); ++ xfree(object->period_end); ++ xfree(object->period_start); ++ xfree(object->period_suspended); ++ xfree(object->req_cpufreq_min); ++ xfree(object->req_cpufreq_max); ++ xfree(object->req_cpufreq_gov); ++ xfree(object->state); ++ xfree(object->stepid); ++ xfree(object->sys_sec); ++ xfree(object->sys_usec); ++ xfree(object->tasks); ++ xfree(object->task_dist); ++ xfree(object->tres_alloc_str); ++ xfree(object->tres_usage_in_ave); ++ xfree(object->tres_usage_in_max); ++ xfree(object->tres_usage_in_max_nodeid); ++ xfree(object->tres_usage_in_max_taskid); ++ xfree(object->tres_usage_in_min); ++ xfree(object->tres_usage_in_min_nodeid); ++ xfree(object->tres_usage_in_min_taskid); ++ xfree(object->tres_usage_in_tot); ++ xfree(object->tres_usage_out_ave); ++ xfree(object->tres_usage_out_max); ++ xfree(object->tres_usage_out_max_nodeid); ++ xfree(object->tres_usage_out_max_taskid); ++ xfree(object->tres_usage_out_min); ++ xfree(object->tres_usage_out_min_nodeid); ++ xfree(object->tres_usage_out_min_taskid); ++ xfree(object->tres_usage_out_tot); ++ xfree(object->user_sec); ++ xfree(object->user_usec); ++ } ++} ++ + typedef struct { + char *associd; + char *job_db_inx; +@@ -185,6 +309,16 @@ + char *period_start; + } local_suspend_t; + ++static void _free_local_suspend_members(local_suspend_t *object) ++{ ++ if (object) { ++ xfree(object->associd); ++ xfree(object->job_db_inx); ++ xfree(object->period_end); ++ xfree(object->period_start); ++ } ++} ++ + typedef struct { + char *id; + char *timestamp; +@@ -195,6 +329,19 @@ + char *cluster; + } local_txn_t; + ++static void _free_local_txn_members(local_txn_t *object) ++{ ++ if (object) { ++ xfree(object->id); ++ xfree(object->timestamp); ++ xfree(object->action); ++ xfree(object->name); ++ xfree(object->actor); ++ xfree(object->info); ++ xfree(object->cluster); ++ } ++} ++ + typedef struct { + char *alloc_secs; + char *id; +@@ -202,6 +349,16 @@ + char *tres_id; + } local_usage_t; + ++static void _free_local_usage_members(local_usage_t *object) ++{ ++ if (object) { ++ xfree(object->alloc_secs); ++ xfree(object->id); ++ xfree(object->time_start); ++ xfree(object->tres_id); ++ } ++} ++ + typedef struct { + char *alloc_secs; + char *down_secs; +@@ -214,6 +371,21 @@ + char *tres_cnt; + } local_cluster_usage_t; + ++static void _free_local_cluster_members(local_cluster_usage_t *object) ++{ ++ if (object) { ++ xfree(object->alloc_secs); ++ xfree(object->down_secs); ++ xfree(object->idle_secs); ++ xfree(object->over_secs); ++ xfree(object->pdown_secs); ++ xfree(object->time_start); ++ xfree(object->resv_secs); ++ xfree(object->tres_id); ++ xfree(object->tres_cnt); ++ } ++} ++ + /* if this changes you will need to edit the corresponding enum below */ + char *event_req_inx[] = { + "time_start", +@@ -563,27 +735,32 @@ + char *tmp_char; + + if (rpc_version >= SLURM_15_08_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->cluster_nodes, &tmp32, buffer); +- unpackstr_ptr(&object->node_name, &tmp32, buffer); +- unpackstr_ptr(&object->period_end, &tmp32, buffer); +- unpackstr_ptr(&object->period_start, &tmp32, buffer); +- unpackstr_ptr(&object->reason, &tmp32, buffer); +- unpackstr_ptr(&object->reason_uid, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->tres_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->cluster_nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->reason, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->reason_uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_str, &tmp32, buffer); + } else { +- unpackstr_ptr(&object->cluster_nodes, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->cluster_nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + object->tres_str = xstrdup_printf("%d=%s", TRES_CPU, tmp_char); +- unpackstr_ptr(&object->node_name, &tmp32, buffer); +- unpackstr_ptr(&object->period_end, &tmp32, buffer); +- unpackstr_ptr(&object->period_start, &tmp32, buffer); +- unpackstr_ptr(&object->reason, &tmp32, buffer); +- unpackstr_ptr(&object->reason_uid, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); ++ xfree(tmp_char); ++ safe_unpackstr_xmalloc(&object->node_name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->reason, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->reason_uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); + } + + return SLURM_SUCCESS; ++ ++unpack_error: ++ _free_local_event_members(object); ++ return SLURM_ERROR; + } + + static void _pack_local_job(local_job_t *object, +@@ -663,119 +840,119 @@ + */ + + if (rpc_version >= SLURM_18_08_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->account, &tmp32, buffer); +- unpackstr_ptr(&object->admin_comment, &tmp32, buffer); +- unpackstr_ptr(&object->alloc_nodes, &tmp32, buffer); +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->array_jobid, &tmp32, buffer); +- unpackstr_ptr(&object->array_max_tasks, &tmp32, buffer); +- unpackstr_ptr(&object->array_taskid, &tmp32, buffer); +- unpackstr_ptr(&object->blockid, &tmp32, buffer); +- unpackstr_ptr(&object->derived_ec, &tmp32, buffer); +- unpackstr_ptr(&object->derived_es, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->timelimit, &tmp32, buffer); +- unpackstr_ptr(&object->eligible, &tmp32, buffer); +- unpackstr_ptr(&object->end, &tmp32, buffer); +- unpackstr_ptr(&object->gid, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->jobid, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->mcs_label, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->pack_job_id, &tmp32, buffer); +- unpackstr_ptr(&object->pack_job_offset, &tmp32, buffer); +- unpackstr_ptr(&object->partition, &tmp32, buffer); +- unpackstr_ptr(&object->priority, &tmp32, buffer); +- unpackstr_ptr(&object->qos, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&object->req_mem, &tmp32, buffer); +- unpackstr_ptr(&object->resvid, &tmp32, buffer); +- unpackstr_ptr(&object->start, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->submit, &tmp32, buffer); +- unpackstr_ptr(&object->suspended, &tmp32, buffer); +- unpackstr_ptr(&object->system_comment, &tmp32, buffer); +- unpackstr_ptr(&object->track_steps, &tmp32, buffer); +- unpackstr_ptr(&object->tres_alloc_str, &tmp32, buffer); +- unpackstr_ptr(&object->tres_req_str, &tmp32, buffer); +- unpackstr_ptr(&object->uid, &tmp32, buffer); +- unpackstr_ptr(&object->wckey, &tmp32, buffer); +- unpackstr_ptr(&object->wckey_id, &tmp32, buffer); +- unpackstr_ptr(&object->work_dir, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->account, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->admin_comment, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->alloc_nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_max_tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_taskid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->blockid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_ec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_es, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timelimit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->eligible, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->gid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->mcs_label, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->pack_job_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->pack_job_offset, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->partition, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->priority, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->qos, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpus, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_mem, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resvid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->submit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->system_comment, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->track_steps, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_alloc_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_req_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->work_dir, &tmp32, buffer); + } else if (rpc_version >= SLURM_17_11_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->account, &tmp32, buffer); +- unpackstr_ptr(&object->admin_comment, &tmp32, buffer); +- unpackstr_ptr(&object->alloc_nodes, &tmp32, buffer); +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->array_jobid, &tmp32, buffer); +- unpackstr_ptr(&object->array_max_tasks, &tmp32, buffer); +- unpackstr_ptr(&object->array_taskid, &tmp32, buffer); +- unpackstr_ptr(&object->blockid, &tmp32, buffer); +- unpackstr_ptr(&object->derived_ec, &tmp32, buffer); +- unpackstr_ptr(&object->derived_es, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->timelimit, &tmp32, buffer); +- unpackstr_ptr(&object->eligible, &tmp32, buffer); +- unpackstr_ptr(&object->end, &tmp32, buffer); +- unpackstr_ptr(&object->gid, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->jobid, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->mcs_label, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->pack_job_id, &tmp32, buffer); +- unpackstr_ptr(&object->pack_job_offset, &tmp32, buffer); +- unpackstr_ptr(&object->partition, &tmp32, buffer); +- unpackstr_ptr(&object->priority, &tmp32, buffer); +- unpackstr_ptr(&object->qos, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&object->req_mem, &tmp32, buffer); +- unpackstr_ptr(&object->resvid, &tmp32, buffer); +- unpackstr_ptr(&object->start, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->submit, &tmp32, buffer); +- unpackstr_ptr(&object->suspended, &tmp32, buffer); +- unpackstr_ptr(&object->track_steps, &tmp32, buffer); +- unpackstr_ptr(&object->tres_alloc_str, &tmp32, buffer); +- unpackstr_ptr(&object->tres_req_str, &tmp32, buffer); +- unpackstr_ptr(&object->uid, &tmp32, buffer); +- unpackstr_ptr(&object->wckey, &tmp32, buffer); +- unpackstr_ptr(&object->wckey_id, &tmp32, buffer); +- unpackstr_ptr(&object->work_dir, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->account, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->admin_comment, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->alloc_nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_max_tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_taskid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->blockid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_ec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_es, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timelimit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->eligible, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->gid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->mcs_label, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->pack_job_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->pack_job_offset, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->partition, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->priority, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->qos, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpus, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_mem, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resvid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->submit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->track_steps, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_alloc_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_req_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->work_dir, &tmp32, buffer); + } else if (rpc_version >= SLURM_17_02_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->account, &tmp32, buffer); +- unpackstr_ptr(&object->admin_comment, &tmp32, buffer); +- unpackstr_ptr(&object->alloc_nodes, &tmp32, buffer); +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->array_jobid, &tmp32, buffer); +- unpackstr_ptr(&object->array_max_tasks, &tmp32, buffer); +- unpackstr_ptr(&object->array_taskid, &tmp32, buffer); +- unpackstr_ptr(&object->blockid, &tmp32, buffer); +- unpackstr_ptr(&object->derived_ec, &tmp32, buffer); +- unpackstr_ptr(&object->derived_es, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->timelimit, &tmp32, buffer); +- unpackstr_ptr(&object->eligible, &tmp32, buffer); +- unpackstr_ptr(&object->end, &tmp32, buffer); +- unpackstr_ptr(&object->gid, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->jobid, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- object->pack_job_id = "0"; +- object->pack_job_offset = "4294967294"; +- unpackstr_ptr(&object->partition, &tmp32, buffer); +- unpackstr_ptr(&object->priority, &tmp32, buffer); +- unpackstr_ptr(&object->qos, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->account, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->admin_comment, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->alloc_nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_max_tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_taskid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->blockid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_ec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_es, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timelimit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->eligible, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->gid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ object->pack_job_id = xstrdup("0"); ++ object->pack_job_offset = xstrdup("4294967294"); ++ safe_unpackstr_xmalloc(&object->partition, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->priority, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->qos, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpus, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + if (tmp_char) { + uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && +@@ -792,46 +969,47 @@ + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } ++ xfree(tmp_char); + } +- unpackstr_ptr(&object->resvid, &tmp32, buffer); +- unpackstr_ptr(&object->start, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->submit, &tmp32, buffer); +- unpackstr_ptr(&object->suspended, &tmp32, buffer); +- unpackstr_ptr(&object->track_steps, &tmp32, buffer); +- unpackstr_ptr(&object->tres_alloc_str, &tmp32, buffer); +- unpackstr_ptr(&object->tres_req_str, &tmp32, buffer); +- unpackstr_ptr(&object->uid, &tmp32, buffer); +- unpackstr_ptr(&object->wckey, &tmp32, buffer); +- unpackstr_ptr(&object->wckey_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resvid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->submit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->track_steps, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_alloc_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_req_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey_id, &tmp32, buffer); + } else if (rpc_version >= SLURM_15_08_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->account, &tmp32, buffer); +- unpackstr_ptr(&object->alloc_nodes, &tmp32, buffer); +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->array_jobid, &tmp32, buffer); +- unpackstr_ptr(&object->array_max_tasks, &tmp32, buffer); +- unpackstr_ptr(&object->array_taskid, &tmp32, buffer); +- unpackstr_ptr(&object->blockid, &tmp32, buffer); +- unpackstr_ptr(&object->derived_ec, &tmp32, buffer); +- unpackstr_ptr(&object->derived_es, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->timelimit, &tmp32, buffer); +- unpackstr_ptr(&object->eligible, &tmp32, buffer); +- unpackstr_ptr(&object->end, &tmp32, buffer); +- unpackstr_ptr(&object->gid, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->jobid, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- object->pack_job_id = "0"; +- object->pack_job_offset = "4294967294"; +- unpackstr_ptr(&object->partition, &tmp32, buffer); +- unpackstr_ptr(&object->priority, &tmp32, buffer); +- unpackstr_ptr(&object->qos, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->account, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->alloc_nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_max_tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_taskid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->blockid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_ec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_es, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timelimit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->eligible, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->gid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ object->pack_job_id = xstrdup("0"); ++ object->pack_job_offset = xstrdup("4294967294"); ++ safe_unpackstr_xmalloc(&object->partition, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->priority, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->qos, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpus, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + if (tmp_char) { + uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && +@@ -848,46 +1026,48 @@ + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } ++ xfree(tmp_char); + } +- unpackstr_ptr(&object->resvid, &tmp32, buffer); +- unpackstr_ptr(&object->start, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->submit, &tmp32, buffer); +- unpackstr_ptr(&object->suspended, &tmp32, buffer); +- unpackstr_ptr(&object->track_steps, &tmp32, buffer); +- unpackstr_ptr(&object->tres_alloc_str, &tmp32, buffer); +- unpackstr_ptr(&object->tres_req_str, &tmp32, buffer); +- unpackstr_ptr(&object->uid, &tmp32, buffer); +- unpackstr_ptr(&object->wckey, &tmp32, buffer); +- unpackstr_ptr(&object->wckey_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resvid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->submit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->track_steps, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_alloc_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_req_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey_id, &tmp32, buffer); + } else if (rpc_version >= SLURM_14_11_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->account, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->account, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + object->tres_alloc_str = xstrdup_printf( + "%d=%s", TRES_CPU, tmp_char); +- unpackstr_ptr(&object->alloc_nodes, &tmp32, buffer); +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->array_jobid, &tmp32, buffer); +- unpackstr_ptr(&object->array_max_tasks, &tmp32, buffer); +- unpackstr_ptr(&object->array_taskid, &tmp32, buffer); +- unpackstr_ptr(&object->blockid, &tmp32, buffer); +- unpackstr_ptr(&object->derived_ec, &tmp32, buffer); +- unpackstr_ptr(&object->derived_es, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->timelimit, &tmp32, buffer); +- unpackstr_ptr(&object->eligible, &tmp32, buffer); +- unpackstr_ptr(&object->end, &tmp32, buffer); +- unpackstr_ptr(&object->gid, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->jobid, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->priority, &tmp32, buffer); +- unpackstr_ptr(&object->qos, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ xfree(tmp_char); ++ safe_unpackstr_xmalloc(&object->alloc_nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_max_tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->array_taskid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->blockid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_ec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_es, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timelimit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->eligible, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->gid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->priority, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->qos, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpus, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + if (tmp_char) { + uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && +@@ -904,45 +1084,47 @@ + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } ++ xfree(tmp_char); + } +- unpackstr_ptr(&object->resvid, &tmp32, buffer); +- object->pack_job_id = "0"; +- object->pack_job_offset = "4294967294"; +- unpackstr_ptr(&object->partition, &tmp32, buffer); +- unpackstr_ptr(&object->start, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->submit, &tmp32, buffer); +- unpackstr_ptr(&object->suspended, &tmp32, buffer); +- unpackstr_ptr(&object->track_steps, &tmp32, buffer); +- unpackstr_ptr(&object->uid, &tmp32, buffer); +- unpackstr_ptr(&object->wckey, &tmp32, buffer); +- unpackstr_ptr(&object->wckey_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resvid, &tmp32, buffer); ++ object->pack_job_id = xstrdup("0"); ++ object->pack_job_offset = xstrdup("4294967294"); ++ safe_unpackstr_xmalloc(&object->partition, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->submit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->track_steps, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey_id, &tmp32, buffer); + } else if (rpc_version >= SLURMDBD_2_6_VERSION) { +- unpackstr_ptr(&object->account, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->account, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + object->tres_alloc_str = xstrdup_printf( + "%d=%s", TRES_CPU, tmp_char); +- unpackstr_ptr(&object->alloc_nodes, &tmp32, buffer); +- object->array_taskid = "4294967294"; +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->blockid, &tmp32, buffer); +- unpackstr_ptr(&object->derived_ec, &tmp32, buffer); +- unpackstr_ptr(&object->derived_es, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->timelimit, &tmp32, buffer); +- unpackstr_ptr(&object->eligible, &tmp32, buffer); +- unpackstr_ptr(&object->end, &tmp32, buffer); +- unpackstr_ptr(&object->gid, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->jobid, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->priority, &tmp32, buffer); +- unpackstr_ptr(&object->qos, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ xfree(tmp_char); ++ safe_unpackstr_xmalloc(&object->alloc_nodes, &tmp32, buffer); ++ object->array_taskid = xstrdup("4294967294"); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->blockid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_ec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_es, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timelimit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->eligible, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->gid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->priority, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->qos, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpus, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + if (tmp_char) { + uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && +@@ -959,58 +1141,64 @@ + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } ++ xfree(tmp_char); + } +- unpackstr_ptr(&object->resvid, &tmp32, buffer); +- object->pack_job_id = "0"; +- object->pack_job_offset = "4294967294"; +- unpackstr_ptr(&object->partition, &tmp32, buffer); +- unpackstr_ptr(&object->start, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->submit, &tmp32, buffer); +- unpackstr_ptr(&object->suspended, &tmp32, buffer); +- unpackstr_ptr(&object->track_steps, &tmp32, buffer); +- unpackstr_ptr(&object->uid, &tmp32, buffer); +- unpackstr_ptr(&object->wckey, &tmp32, buffer); +- unpackstr_ptr(&object->wckey_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resvid, &tmp32, buffer); ++ object->pack_job_id = xstrdup("0"); ++ object->pack_job_offset = xstrdup("4294967294"); ++ safe_unpackstr_xmalloc(&object->partition, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->submit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->track_steps, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey_id, &tmp32, buffer); + } else { +- unpackstr_ptr(&object->account, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->account, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + object->tres_alloc_str = xstrdup_printf( + "%d=%s", TRES_CPU, tmp_char); +- unpackstr_ptr(&object->alloc_nodes, &tmp32, buffer); +- object->array_taskid = "4294967294"; +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->blockid, &tmp32, buffer); +- unpackstr_ptr(&object->derived_ec, &tmp32, buffer); +- unpackstr_ptr(&object->derived_es, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->timelimit, &tmp32, buffer); +- unpackstr_ptr(&object->eligible, &tmp32, buffer); +- unpackstr_ptr(&object->end, &tmp32, buffer); +- unpackstr_ptr(&object->gid, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->jobid, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->priority, &tmp32, buffer); +- unpackstr_ptr(&object->qos, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&object->resvid, &tmp32, buffer); +- object->pack_job_id = "0"; +- object->pack_job_offset = "4294967294"; +- unpackstr_ptr(&object->partition, &tmp32, buffer); +- unpackstr_ptr(&object->start, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->submit, &tmp32, buffer); +- unpackstr_ptr(&object->suspended, &tmp32, buffer); +- unpackstr_ptr(&object->track_steps, &tmp32, buffer); +- unpackstr_ptr(&object->uid, &tmp32, buffer); +- unpackstr_ptr(&object->wckey, &tmp32, buffer); +- unpackstr_ptr(&object->wckey_id, &tmp32, buffer); ++ xfree(tmp_char); ++ safe_unpackstr_xmalloc(&object->alloc_nodes, &tmp32, buffer); ++ object->array_taskid = xstrdup("4294967294"); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->blockid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_ec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->derived_es, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timelimit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->eligible, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->gid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->jobid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->priority, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->qos, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpus, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resvid, &tmp32, buffer); ++ object->pack_job_id = xstrdup("0"); ++ object->pack_job_offset = xstrdup("4294967294"); ++ safe_unpackstr_xmalloc(&object->partition, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->submit, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->track_steps, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->uid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->wckey_id, &tmp32, buffer); + } + return SLURM_SUCCESS; ++ ++unpack_error: ++ _free_local_job_members(object); ++ return SLURM_ERROR; + } + + static void _pack_local_resv(local_resv_t *object, +@@ -1037,40 +1225,45 @@ + char *tmp_char; + + if (rpc_version >= SLURM_17_11_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->assocs, &tmp32, buffer); +- unpackstr_ptr(&object->flags, &tmp32, buffer); +- unpackstr_ptr(&object->id, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodes, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->time_end, &tmp32, buffer); +- unpackstr_ptr(&object->time_start, &tmp32, buffer); +- unpackstr_ptr(&object->tres_str, &tmp32, buffer); +- unpackstr_ptr(&object->unused_wall, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->assocs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->flags, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->unused_wall, &tmp32, buffer); + } else if (rpc_version >= SLURM_15_08_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->assocs, &tmp32, buffer); +- unpackstr_ptr(&object->flags, &tmp32, buffer); +- unpackstr_ptr(&object->id, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodes, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->time_end, &tmp32, buffer); +- unpackstr_ptr(&object->time_start, &tmp32, buffer); +- unpackstr_ptr(&object->tres_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->assocs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->flags, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_str, &tmp32, buffer); + } else { +- unpackstr_ptr(&object->assocs, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->assocs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + object->tres_str = xstrdup_printf("%d=%s", TRES_CPU, tmp_char); +- unpackstr_ptr(&object->flags, &tmp32, buffer); +- unpackstr_ptr(&object->id, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodes, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->time_end, &tmp32, buffer); +- unpackstr_ptr(&object->time_start, &tmp32, buffer); ++ xfree(tmp_char); ++ safe_unpackstr_xmalloc(&object->flags, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_start, &tmp32, buffer); + } + + return SLURM_SUCCESS; ++ ++unpack_error: ++ _free_local_resv_members(object); ++ return SLURM_ERROR; + } + + static void _pack_local_step(local_step_t *object, +@@ -1127,54 +1320,54 @@ + char *tmp_char; + + if (rpc_version >= SLURM_18_08_PROTOCOL_VERSION) { +- unpackstr_ptr(&object->act_cpufreq, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->consumed_energy, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->nodes, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->period_end, &tmp32, buffer); +- unpackstr_ptr(&object->period_start, &tmp32, buffer); +- unpackstr_ptr(&object->period_suspended, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpufreq_min, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpufreq_max, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpufreq_gov, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->stepid, &tmp32, buffer); +- unpackstr_ptr(&object->sys_sec, &tmp32, buffer); +- unpackstr_ptr(&object->sys_usec, &tmp32, buffer); +- unpackstr_ptr(&object->tasks, &tmp32, buffer); +- unpackstr_ptr(&object->task_dist, &tmp32, buffer); +- unpackstr_ptr(&object->tres_alloc_str, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_in_ave, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_in_max, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_in_max_nodeid, &tmp32, ++ safe_unpackstr_xmalloc(&object->act_cpufreq, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->consumed_energy, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpufreq_min, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpufreq_max, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpufreq_gov, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->stepid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->sys_sec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->sys_usec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->task_dist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_alloc_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_in_ave, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_in_max, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_in_max_nodeid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_in_max_taskid, &tmp32, ++ safe_unpackstr_xmalloc(&object->tres_usage_in_max_taskid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_in_min, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_in_min_nodeid, &tmp32, ++ safe_unpackstr_xmalloc(&object->tres_usage_in_min, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_in_min_nodeid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_in_min_taskid, &tmp32, ++ safe_unpackstr_xmalloc(&object->tres_usage_in_min_taskid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_in_tot, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_out_ave, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_out_max, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_out_max_nodeid, &tmp32, ++ safe_unpackstr_xmalloc(&object->tres_usage_in_tot, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_out_ave, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_out_max, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_out_max_nodeid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_out_max_taskid, &tmp32, ++ safe_unpackstr_xmalloc(&object->tres_usage_out_max_taskid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_out_min, &tmp32, buffer); +- unpackstr_ptr(&object->tres_usage_out_min_nodeid, &tmp32, ++ safe_unpackstr_xmalloc(&object->tres_usage_out_min, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_out_min_nodeid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_out_min_taskid, &tmp32, ++ safe_unpackstr_xmalloc(&object->tres_usage_out_min_taskid, &tmp32, + buffer); +- unpackstr_ptr(&object->tres_usage_out_tot, &tmp32, buffer); +- unpackstr_ptr(&object->user_sec, &tmp32, buffer); +- unpackstr_ptr(&object->user_usec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_usage_out_tot, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->user_sec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->user_usec, &tmp32, buffer); + } else if (rpc_version >= SLURM_15_08_PROTOCOL_VERSION) { + char *ave_cpu; + char *ave_disk_read; +@@ -1201,35 +1394,35 @@ + char *min_cpu_node; + char *min_cpu_task; + +- unpackstr_ptr(&object->act_cpufreq, &tmp32, buffer); +- unpackstr_ptr(&ave_cpu, &tmp32, buffer); +- unpackstr_ptr(&ave_disk_read, &tmp32, buffer); +- unpackstr_ptr(&ave_disk_write, &tmp32, buffer); +- unpackstr_ptr(&ave_pages, &tmp32, buffer); +- unpackstr_ptr(&ave_rss, &tmp32, buffer); +- unpackstr_ptr(&ave_vsize, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->consumed_energy, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&max_disk_read, &tmp32, buffer); +- unpackstr_ptr(&max_disk_read_node, &tmp32, buffer); +- unpackstr_ptr(&max_disk_read_task, &tmp32, buffer); +- unpackstr_ptr(&max_disk_write, &tmp32, buffer); +- unpackstr_ptr(&max_disk_write_node, &tmp32, buffer); +- unpackstr_ptr(&max_disk_write_task, &tmp32, buffer); +- unpackstr_ptr(&max_pages, &tmp32, buffer); +- unpackstr_ptr(&max_pages_node, &tmp32, buffer); +- unpackstr_ptr(&max_pages_task, &tmp32, buffer); +- unpackstr_ptr(&max_rss, &tmp32, buffer); +- unpackstr_ptr(&max_rss_node, &tmp32, buffer); +- unpackstr_ptr(&max_rss_task, &tmp32, buffer); +- unpackstr_ptr(&max_vsize, &tmp32, buffer); +- unpackstr_ptr(&max_vsize_node, &tmp32, buffer); +- unpackstr_ptr(&max_vsize_task, &tmp32, buffer); +- unpackstr_ptr(&min_cpu, &tmp32, buffer); +- unpackstr_ptr(&min_cpu_node, &tmp32, buffer); +- unpackstr_ptr(&min_cpu_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->act_cpufreq, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_cpu, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_disk_read, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_disk_write, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_pages, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_rss, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_vsize, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->consumed_energy, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_read, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_read_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_read_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_write, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_write_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_write_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_pages, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_pages_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_pages_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_rss, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_rss_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_rss_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_vsize, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_vsize_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_vsize_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&min_cpu, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&min_cpu_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&min_cpu_task, &tmp32, buffer); + + if (atol(min_cpu) != NO_VAL) { + object->tres_usage_in_ave = xstrdup_printf( +@@ -1285,25 +1478,50 @@ + TRES_CPU, min_cpu_task); + } + +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->nodes, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->period_end, &tmp32, buffer); +- unpackstr_ptr(&object->period_start, &tmp32, buffer); +- unpackstr_ptr(&object->period_suspended, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpufreq_min, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpufreq_max, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpufreq_gov, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->stepid, &tmp32, buffer); +- unpackstr_ptr(&object->sys_sec, &tmp32, buffer); +- unpackstr_ptr(&object->sys_usec, &tmp32, buffer); +- unpackstr_ptr(&object->tasks, &tmp32, buffer); +- unpackstr_ptr(&object->task_dist, &tmp32, buffer); +- unpackstr_ptr(&object->tres_alloc_str, &tmp32, buffer); +- unpackstr_ptr(&object->user_sec, &tmp32, buffer); +- unpackstr_ptr(&object->user_usec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpufreq_min, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpufreq_max, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpufreq_gov, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->stepid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->sys_sec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->sys_usec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->task_dist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_alloc_str, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->user_sec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->user_usec, &tmp32, buffer); ++ ++ xfree(ave_cpu); ++ xfree(ave_disk_read); ++ xfree(ave_disk_write); ++ xfree(ave_pages); ++ xfree(ave_rss); ++ xfree(ave_vsize); ++ xfree(max_disk_read); ++ xfree(max_disk_read_node); ++ xfree(max_disk_read_task); ++ xfree(max_disk_write); ++ xfree(max_disk_write_node); ++ xfree(max_disk_write_task); ++ xfree(max_pages); ++ xfree(max_pages_node); ++ xfree(max_pages_task); ++ xfree(max_rss); ++ xfree(max_rss_node); ++ xfree(max_rss_task); ++ xfree(max_vsize); ++ xfree(max_vsize_node); ++ xfree(max_vsize_task); ++ xfree(min_cpu); ++ xfree(min_cpu_node); ++ xfree(min_cpu_task); + } else if (rpc_version >= SLURMDBD_2_6_VERSION) { + char *ave_cpu; + char *ave_disk_read; +@@ -1330,38 +1548,39 @@ + char *min_cpu_node; + char *min_cpu_task; + +- unpackstr_ptr(&object->act_cpufreq, &tmp32, buffer); +- unpackstr_ptr(&ave_cpu, &tmp32, buffer); +- unpackstr_ptr(&ave_disk_read, &tmp32, buffer); +- unpackstr_ptr(&ave_disk_write, &tmp32, buffer); +- unpackstr_ptr(&ave_pages, &tmp32, buffer); +- unpackstr_ptr(&ave_rss, &tmp32, buffer); +- unpackstr_ptr(&ave_vsize, &tmp32, buffer); +- unpackstr_ptr(&object->exit_code, &tmp32, buffer); +- unpackstr_ptr(&object->consumed_energy, &tmp32, buffer); +- unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->act_cpufreq, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_cpu, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_disk_read, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_disk_write, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_pages, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_rss, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&ave_vsize, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->exit_code, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->consumed_energy, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&tmp_char, &tmp32, buffer); + object->tres_alloc_str = xstrdup_printf( + "%d=%s", TRES_CPU, tmp_char); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->kill_requid, &tmp32, buffer); +- unpackstr_ptr(&max_disk_read, &tmp32, buffer); +- unpackstr_ptr(&max_disk_read_node, &tmp32, buffer); +- unpackstr_ptr(&max_disk_read_task, &tmp32, buffer); +- unpackstr_ptr(&max_disk_write, &tmp32, buffer); +- unpackstr_ptr(&max_disk_write_node, &tmp32, buffer); +- unpackstr_ptr(&max_disk_write_task, &tmp32, buffer); +- unpackstr_ptr(&max_pages, &tmp32, buffer); +- unpackstr_ptr(&max_pages_node, &tmp32, buffer); +- unpackstr_ptr(&max_pages_task, &tmp32, buffer); +- unpackstr_ptr(&max_rss, &tmp32, buffer); +- unpackstr_ptr(&max_rss_node, &tmp32, buffer); +- unpackstr_ptr(&max_rss_task, &tmp32, buffer); +- unpackstr_ptr(&max_vsize, &tmp32, buffer); +- unpackstr_ptr(&max_vsize_node, &tmp32, buffer); +- unpackstr_ptr(&max_vsize_task, &tmp32, buffer); +- unpackstr_ptr(&min_cpu, &tmp32, buffer); +- unpackstr_ptr(&min_cpu_node, &tmp32, buffer); +- unpackstr_ptr(&min_cpu_task, &tmp32, buffer); ++ xfree(tmp_char); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->kill_requid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_read, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_read_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_read_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_write, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_write_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_disk_write_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_pages, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_pages_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_pages_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_rss, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_rss_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_rss_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_vsize, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_vsize_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&max_vsize_task, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&min_cpu, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&min_cpu_node, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&min_cpu_task, &tmp32, buffer); + + if (atol(min_cpu) != NO_VAL) { + object->tres_usage_in_ave = xstrdup_printf( +@@ -1417,22 +1636,47 @@ + TRES_CPU, min_cpu_task); + } + +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->nodelist, &tmp32, buffer); +- unpackstr_ptr(&object->nodes, &tmp32, buffer); +- unpackstr_ptr(&object->node_inx, &tmp32, buffer); +- unpackstr_ptr(&object->period_end, &tmp32, buffer); +- unpackstr_ptr(&object->period_start, &tmp32, buffer); +- unpackstr_ptr(&object->period_suspended, &tmp32, buffer); +- unpackstr_ptr(&object->req_cpufreq_max, &tmp32, buffer); +- unpackstr_ptr(&object->state, &tmp32, buffer); +- unpackstr_ptr(&object->stepid, &tmp32, buffer); +- unpackstr_ptr(&object->sys_sec, &tmp32, buffer); +- unpackstr_ptr(&object->sys_usec, &tmp32, buffer); +- unpackstr_ptr(&object->tasks, &tmp32, buffer); +- unpackstr_ptr(&object->task_dist, &tmp32, buffer); +- unpackstr_ptr(&object->user_sec, &tmp32, buffer); +- unpackstr_ptr(&object->user_usec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodelist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->nodes, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->node_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_suspended, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->req_cpufreq_max, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->state, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->stepid, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->sys_sec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->sys_usec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tasks, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->task_dist, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->user_sec, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->user_usec, &tmp32, buffer); ++ ++ xfree(ave_cpu); ++ xfree(ave_disk_read); ++ xfree(ave_disk_write); ++ xfree(ave_pages); ++ xfree(ave_rss); ++ xfree(ave_vsize); ++ xfree(max_disk_read); ++ xfree(max_disk_read_node); ++ xfree(max_disk_read_task); ++ xfree(max_disk_write); ++ xfree(max_disk_write_node); ++ xfree(max_disk_write_task); ++ xfree(max_pages); ++ xfree(max_pages_node); ++ xfree(max_pages_task); ++ xfree(max_rss); ++ xfree(max_rss_node); ++ xfree(max_rss_task); ++ xfree(max_vsize); ++ xfree(max_vsize_node); ++ xfree(max_vsize_task); ++ xfree(min_cpu); ++ xfree(min_cpu_node); ++ xfree(min_cpu_task); + } else { + goto unpack_error; + } +@@ -1440,6 +1684,7 @@ + return SLURM_SUCCESS; + + unpack_error: ++ _free_local_step_members(object); + return SLURM_ERROR; + } + +@@ -1459,12 +1704,16 @@ + { + uint32_t tmp32; + +- unpackstr_ptr(&object->associd, &tmp32, buffer); +- unpackstr_ptr(&object->job_db_inx, &tmp32, buffer); +- unpackstr_ptr(&object->period_end, &tmp32, buffer); +- unpackstr_ptr(&object->period_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->associd, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->job_db_inx, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_end, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->period_start, &tmp32, buffer); + + return SLURM_SUCCESS; ++ ++unpack_error: ++ _free_local_suspend_members(object); ++ return SLURM_ERROR; + } + + static void _pack_local_txn(local_txn_t *object, +@@ -1486,15 +1735,19 @@ + { + uint32_t tmp32; + +- unpackstr_ptr(&object->id, &tmp32, buffer); +- unpackstr_ptr(&object->timestamp, &tmp32, buffer); +- unpackstr_ptr(&object->action, &tmp32, buffer); +- unpackstr_ptr(&object->name, &tmp32, buffer); +- unpackstr_ptr(&object->actor, &tmp32, buffer); +- unpackstr_ptr(&object->info, &tmp32, buffer); +- unpackstr_ptr(&object->cluster, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->timestamp, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->action, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->actor, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->info, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->cluster, &tmp32, buffer); + + return SLURM_SUCCESS; ++ ++unpack_error: ++ _free_local_txn_members(object); ++ return SLURM_ERROR; + } + + static void _pack_local_usage(local_usage_t *object, +@@ -1513,12 +1766,16 @@ + { + uint32_t tmp32; + +- unpackstr_ptr(&object->id, &tmp32, buffer); +- unpackstr_ptr(&object->tres_id, &tmp32, buffer); +- unpackstr_ptr(&object->time_start, &tmp32, buffer); +- unpackstr_ptr(&object->alloc_secs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->alloc_secs, &tmp32, buffer); + + return SLURM_SUCCESS; ++ ++unpack_error: ++ _free_local_usage_members(object); ++ return SLURM_ERROR; + } + + static void _pack_local_cluster_usage(local_cluster_usage_t *object, +@@ -1541,16 +1798,20 @@ + { + uint32_t tmp32; + +- unpackstr_ptr(&object->tres_id, &tmp32, buffer); +- unpackstr_ptr(&object->time_start, &tmp32, buffer); +- unpackstr_ptr(&object->tres_cnt, &tmp32, buffer); +- unpackstr_ptr(&object->alloc_secs, &tmp32, buffer); +- unpackstr_ptr(&object->down_secs, &tmp32, buffer); +- unpackstr_ptr(&object->idle_secs, &tmp32, buffer); +- unpackstr_ptr(&object->resv_secs, &tmp32, buffer); +- unpackstr_ptr(&object->over_secs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_id, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->time_start, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->tres_cnt, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->alloc_secs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->down_secs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->idle_secs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->resv_secs, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&object->over_secs, &tmp32, buffer); + + return SLURM_SUCCESS; ++ ++unpack_error: ++ _free_local_cluster_members(object); ++ return SLURM_ERROR; + } + + static int _process_old_sql_line(const char *data_in, +@@ -2251,8 +2512,8 @@ + object.state, + object.tres_str); + +- if (rpc_version < SLURM_15_08_PROTOCOL_VERSION) +- xfree(object.tres_str); ++ ++ _free_local_event_members(&object); + } + // END_TIMER2("step query"); + // info("event query took %s", TIME_STR); +@@ -2399,14 +2660,7 @@ + object.tres_alloc_str, + object.tres_req_str); + +- if (rpc_version >= SLURMDBD_2_6_VERSION && +- rpc_version <= SLURM_17_02_PROTOCOL_VERSION) +- xfree(object.req_mem); +- +- if (rpc_version < SLURM_15_08_PROTOCOL_VERSION) { +- xfree(object.tres_alloc_str); +- xfree(object.tres_req_str); +- } ++ _free_local_job_members(&object); + } + // END_TIMER2("step query"); + // info("job query took %s", TIME_STR); +@@ -2495,8 +2749,7 @@ + object.time_end, + object.unused_wall); + +- if (rpc_version < SLURM_15_08_PROTOCOL_VERSION) +- xfree(object.tres_str); ++ _free_local_resv_members(&object); + } + // END_TIMER2("step query"); + // info("resv query took %s", TIME_STR); +@@ -2653,22 +2906,7 @@ + object.tres_usage_out_min_taskid, + object.tres_usage_out_tot); + +- if (rpc_version < SLURM_18_08_PROTOCOL_VERSION) { +- xfree(object.tres_usage_in_ave); +- xfree(object.tres_usage_in_max); +- xfree(object.tres_usage_in_max_nodeid); +- xfree(object.tres_usage_in_max_taskid); +- xfree(object.tres_usage_in_min); +- xfree(object.tres_usage_in_min_nodeid); +- xfree(object.tres_usage_in_min_taskid); +- xfree(object.tres_usage_out_ave); +- xfree(object.tres_usage_out_max); +- xfree(object.tres_usage_out_max_nodeid); +- xfree(object.tres_usage_out_max_taskid); +- } +- +- if (rpc_version < SLURM_15_08_PROTOCOL_VERSION) +- xfree(object.tres_alloc_str); ++ _free_local_step_members(&object); + } + // END_TIMER2("step query"); + // info("step query took %s", TIME_STR); +@@ -2745,6 +2983,8 @@ + object.associd, + object.period_start, + object.period_end); ++ ++ _free_local_suspend_members(&object); + } + // END_TIMER2("suspend query"); + // info("suspend query took %s", TIME_STR); +@@ -2795,7 +3035,6 @@ + { + char *insert = NULL, *format = NULL; + local_txn_t object; +- char *tmp = NULL; + int i = 0; + + xstrfmtcat(insert, "insert into \"%s\" (%s", +@@ -2820,17 +3059,16 @@ + if (i) + xstrcat(insert, ", "); + +- /* object.info has a bunch of "'" in it */ +- tmp = slurm_add_slash_to_quotes(object.info); + xstrfmtcat(insert, format, + object.id, + object.timestamp, + object.action, + object.name, + object.actor, +- tmp, ++ object.info, + object.cluster); +- xfree(tmp); ++ ++ _free_local_txn_members(&object); + } + // END_TIMER2("txn query"); + // info("txn query took %s", TIME_STR); +@@ -2951,6 +3189,8 @@ + object.tres_id, + object.time_start, + object.alloc_secs); ++ ++ _free_local_usage_members(&object); + } + // END_TIMER2("usage query"); + // info("usage query took %s", TIME_STR); +@@ -3056,6 +3296,8 @@ + object.idle_secs, + object.resv_secs, + object.over_secs); ++ ++ _free_local_cluster_members(&object); + } + // END_TIMER2("usage query"); + // info("usage query took %s", TIME_STR); +@@ -3697,7 +3939,7 @@ + } + safe_unpack_time(&buf_time, buffer); + safe_unpack16(&type, buffer); +- unpackstr_ptr(&cluster_name, &tmp32, buffer); ++ safe_unpackstr_xmalloc(&cluster_name, &tmp32, buffer); + safe_unpack32(&rec_cnt, buffer); + + if (!rec_cnt) { +--- a/testsuite/slurm_unit/common/pack-test.c ++++ b/testsuite/slurm_unit/common/pack-test.c +@@ -62,7 +62,7 @@ + /* info("uint64\t %ld", test64); */ + /* info("converted LD\t %Lf", test_double2); */ + +- unpackstr_ptr(&outbytes, &byte_cnt, buffer); ++ unpackmem_ptr(&outbytes, &byte_cnt, buffer); + TEST( ( strcmp(testbytes, outbytes) != 0 ) , "un/packstr_ptr"); + + unpackstr_xmalloc(&outstring, &byte_cnt, buffer); diff -Nru slurm-llnl-18.08.5.2/debian/patches/fix-SIGABRT slurm-llnl-18.08.5.2/debian/patches/fix-SIGABRT --- slurm-llnl-18.08.5.2/debian/patches/fix-SIGABRT 1970-01-01 00:00:00.000000000 +0000 +++ slurm-llnl-18.08.5.2/debian/patches/fix-SIGABRT 2019-10-17 12:30:18.000000000 +0000 @@ -0,0 +1,44 @@ +Description: fix SIGABRT in the archive load logic + The problem was freeing an interior pointer to buffer contents before + the call to FREE_NULL_BUFFER. The issue was only triggered when loading + an archived data with protocol version < 17.11. +Author: Nate Rini +Origin: upstream, https://github.com/SchedMD/slurm/commit/e174e1353f35dceccc8588969302e7aed374bfe8 +Last-Update: 2019-04-26 + +diff --git a/src/plugins/accounting_storage/mysql/as_mysql_archive.c b/src/plugins/accounting_storage/mysql/as_mysql_archive.c +index f2cf67f02c..4e8c8fea16 100644 +--- a/src/plugins/accounting_storage/mysql/as_mysql_archive.c ++++ b/src/plugins/accounting_storage/mysql/as_mysql_archive.c +@@ -789,7 +789,6 @@ static int _unpack_local_job(local_job_t *object, + */ + tmp_uint64 &= (~0x80000000); + tmp_uint64 |= MEM_PER_CPU; +- xfree(object->req_mem); + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } +@@ -846,7 +845,6 @@ static int _unpack_local_job(local_job_t *object, + */ + tmp_uint64 &= (~0x80000000); + tmp_uint64 |= MEM_PER_CPU; +- xfree(object->req_mem); + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } +@@ -903,7 +901,6 @@ static int _unpack_local_job(local_job_t *object, + */ + tmp_uint64 &= (~0x80000000); + tmp_uint64 |= MEM_PER_CPU; +- xfree(object->req_mem); + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } +@@ -959,7 +956,6 @@ static int _unpack_local_job(local_job_t *object, + */ + tmp_uint64 &= (~0x80000000); + tmp_uint64 |= MEM_PER_CPU; +- xfree(object->req_mem); + object->req_mem = xstrdup_printf("%"PRIu64, + tmp_uint64); + } diff -Nru slurm-llnl-18.08.5.2/debian/patches/fix-memory-leak slurm-llnl-18.08.5.2/debian/patches/fix-memory-leak --- slurm-llnl-18.08.5.2/debian/patches/fix-memory-leak 1970-01-01 00:00:00.000000000 +0000 +++ slurm-llnl-18.08.5.2/debian/patches/fix-memory-leak 2019-10-17 12:30:18.000000000 +0000 @@ -0,0 +1,81 @@ +Description: Fix memory leak in the archive load logic. +Author: Alejandro Sanchez +Origin: upstream, https://github.com/SchedMD/slurm/commit/e8567e06be57190825bff737e5523c307da51530 +Date: 2019-04-26 + +diff --git a/src/plugins/accounting_storage/mysql/as_mysql_archive.c b/src/plugins/accounting_storage/mysql/as_mysql_archive.c +index 4e8c8fea16..bdaf1b428f 100644 +--- a/src/plugins/accounting_storage/mysql/as_mysql_archive.c ++++ b/src/plugins/accounting_storage/mysql/as_mysql_archive.c +@@ -639,7 +639,7 @@ static int _unpack_local_job(local_job_t *object, + uint16_t rpc_version, Buf buffer) + { + uint32_t tmp32; +- char *tmp_char; ++ char *tmp_char = NULL; + + memset(object, 0, sizeof(local_job_t)); + +@@ -775,9 +775,9 @@ static int _unpack_local_job(local_job_t *object, + unpackstr_ptr(&object->priority, &tmp32, buffer); + unpackstr_ptr(&object->qos, &tmp32, buffer); + unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&object->req_mem, &tmp32, buffer); +- if (object->req_mem) { +- uint64_t tmp_uint64 = slurm_atoull(object->req_mem); ++ unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ if (tmp_char) { ++ uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && + (tmp_uint64 < 0x100000000)) { + /* +@@ -831,9 +831,9 @@ static int _unpack_local_job(local_job_t *object, + unpackstr_ptr(&object->priority, &tmp32, buffer); + unpackstr_ptr(&object->qos, &tmp32, buffer); + unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&object->req_mem, &tmp32, buffer); +- if (object->req_mem) { +- uint64_t tmp_uint64 = slurm_atoull(object->req_mem); ++ unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ if (tmp_char) { ++ uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && + (tmp_uint64 < 0x100000000)) { + /* +@@ -887,9 +887,9 @@ static int _unpack_local_job(local_job_t *object, + unpackstr_ptr(&object->priority, &tmp32, buffer); + unpackstr_ptr(&object->qos, &tmp32, buffer); + unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&object->req_mem, &tmp32, buffer); +- if (object->req_mem) { +- uint64_t tmp_uint64 = slurm_atoull(object->req_mem); ++ unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ if (tmp_char) { ++ uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && + (tmp_uint64 < 0x100000000)) { + /* +@@ -942,9 +942,9 @@ static int _unpack_local_job(local_job_t *object, + unpackstr_ptr(&object->priority, &tmp32, buffer); + unpackstr_ptr(&object->qos, &tmp32, buffer); + unpackstr_ptr(&object->req_cpus, &tmp32, buffer); +- unpackstr_ptr(&object->req_mem, &tmp32, buffer); +- if (object->req_mem) { +- uint64_t tmp_uint64 = slurm_atoull(object->req_mem); ++ unpackstr_ptr(&tmp_char, &tmp32, buffer); ++ if (tmp_char) { ++ uint64_t tmp_uint64 = slurm_atoull(tmp_char); + if ((tmp_uint64 & 0x80000000) && + (tmp_uint64 < 0x100000000)) { + /* +@@ -2399,6 +2399,10 @@ static char *_load_jobs(uint16_t rpc_version, Buf buffer, + object.tres_alloc_str, + object.tres_req_str); + ++ if (rpc_version >= SLURMDBD_2_6_VERSION && ++ rpc_version <= SLURM_17_02_PROTOCOL_VERSION) ++ xfree(object.req_mem); ++ + if (rpc_version < SLURM_15_08_PROTOCOL_VERSION) { + xfree(object.tres_alloc_str); + xfree(object.tres_req_str); diff -Nru slurm-llnl-18.08.5.2/debian/patches/series slurm-llnl-18.08.5.2/debian/patches/series --- slurm-llnl-18.08.5.2/debian/patches/series 2019-02-15 22:57:32.000000000 +0000 +++ slurm-llnl-18.08.5.2/debian/patches/series 2019-10-17 12:30:18.000000000 +0000 @@ -5,3 +5,6 @@ rpath mpiexec-man-page fix-perl-doc +fix-SIGABRT +fix-memory-leak +CVE-2019-12838