Skip to content

Commit 3b4c8ea

Browse files
committed
Updated remaining flow paths to have the agent return failure & also to guard against memory leaks
1 parent cd24be4 commit 3b4c8ea

3 files changed

Lines changed: 71 additions & 19 deletions

File tree

enrollment.c

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,17 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
256256

257257
res = get_enroll_config(sessionToken, jobInfo->JobId,
258258
jobInfo->ConfigurationEndpoint, &enrConf);
259-
260-
log_verbose("%s::%s(%d) : KeyType: %s", LOG_INF, enrConf->KeyType);
261-
log_verbose("%s::%s(%d) : Store to reenroll = %s",
262-
LOG_INF, enrConf->StorePath);
259+
if (res != 0) {
260+
log_error("%s::%s(%d) : Failed to get enrollment config", LOG_INF);
261+
free(statusMessage);
262+
return 999;
263+
}
263264

264265
/* Validate returned data */
265266
if (enrConf) {
267+
log_verbose("%s::%s(%d) : KeyType: %s", LOG_INF, enrConf->KeyType);
268+
log_verbose("%s::%s(%d) : Store to reenroll = %s",
269+
LOG_INF, enrConf->StorePath);
266270
bool failed = false;
267271
/* Verify the target store isn't a directory */
268272
if (is_directory(enrConf->StorePath)) {
@@ -294,12 +298,14 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
294298
jobInfo->CompletionEndpoint, STAT_ERR, enrConf->AuditId,
295299
statusMessage, &enrComp);
296300
EnrollmentCompleteResp_free(enrComp);
301+
returnable = 999;
297302
goto exit;
298303
}
299304
} else {
300305
log_error("%s::%s(%d) : Error, no enrollment configuration "
301306
"returned by platform", LOG_INF);
302-
goto exit;
307+
free(statusMessage);
308+
return 999;
303309
}
304310

305311
if (res == 0 &&
@@ -336,6 +342,7 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
336342
log_error("%s::%s(%d) : A TPM requires a PrivateKeyPath",
337343
LOG_INF);
338344
status = STAT_ERR;
345+
returnable = 999;
339346
append_linef(&statusMessage, "%s::%s(%d) : A TPM "
340347
"requires a PrivateKeyPath", LOG_INF);
341348
}
@@ -349,6 +356,7 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
349356
"with type %s and length %d", LOG_INF, enrConf->KeyType,
350357
enrConf->KeySize);
351358
status = STAT_ERR;
359+
returnable = 999;
352360
append_linef(&statusMessage, "Unable to generate key "
353361
"pair with type %s and length %d", enrConf->KeyType,
354362
enrConf->KeySize);
@@ -362,10 +370,11 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
362370
csrString = ssl_generate_csr(enrConf->Subject, &csrLen,
363371
&statusMessage);
364372
if (!csrString) {
365-
log_error("%s::%s(%d) : Out of memory", LOG_INF);
366-
append_linef(&statusMessage, "%s::%s(%d) : Out of memory",
373+
log_error("%s::%s(%d) : Failed to generate CSR", LOG_INF);
374+
append_linef(&statusMessage, "%s::%s(%d) : Failed to generate CSR",
367375
LOG_INF);
368376
status = STAT_ERR;
377+
returnable = 999;
369378
} else {
370379
log_verbose("%s::%s(%d) : Successfully created CSR",
371380
LOG_INF);
@@ -376,15 +385,21 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
376385
/* Send the CSR to the Platform for signing */
377386
res = send_enrollment(sessionToken, jobInfo->JobId,
378387
enrConf->EnrollEndpoint, csrString, &enrResp);
379-
if (res == 0 && enrResp) {
380-
AgentApiResult_log(enrResp->Result, &statusMessage, &status);
381-
} else {
388+
if (res != 0) {
382389
log_error("%s::%s(%d) : Enrollment failed with error"
383390
" code %d", LOG_INF, res);
384391
status = STAT_ERR;
392+
returnable = 999;
385393
append_linef(&statusMessage, "Enrollment failed with "
386394
"error code %d", res);
387395
}
396+
if (res == 0 && enrResp) {
397+
if (!AgentApiResult_log(enrResp->Result, &statusMessage, &status)) {
398+
log_error("%s::%s(%d) : Enrollment response indicates error", LOG_INF);
399+
status = STAT_ERR;
400+
returnable = 999;
401+
}
402+
}
388403
}
389404

390405
if (status < STAT_ERR && enrResp && enrResp->Certificate) {
@@ -393,12 +408,20 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
393408
res = save_cert_key(enrConf->StorePath, enrConf->PrivateKeyPath,
394409
enrConf->StorePassword, enrResp->Certificate,
395410
&statusMessage, &status);
411+
if (res != 0 || status >= STAT_ERR) {
412+
log_error("%s::%s(%d) : Failed to save certificate and key", LOG_INF);
413+
returnable = 999;
414+
}
396415
}
397416

398417
/* Send the normal job complete */
399418
res = send_enroll_job_complete(sessionToken, jobInfo->JobId,
400419
jobInfo->CompletionEndpoint, status + 1, auditId,
401420
statusMessage, &enrComp);
421+
if (res != 0) {
422+
log_error("%s::%s(%d) : Failed to send enrollment job complete", LOG_INF);
423+
returnable = 999;
424+
}
402425

403426
#if defined(__RUN_CHAIN_JOBS__)
404427
if (enrComp) {
@@ -411,8 +434,9 @@ int cms_job_enroll(SessionJob_t * jobInfo, char *sessionToken,
411434
#endif
412435

413436
if (status >= STAT_ERR) {
414-
log_info("%s::%s(%d) : Enrollment job %s failed with error: %s",
437+
log_error("%s::%s(%d) : Enrollment job %s failed with error: %s",
415438
LOG_INF, jobInfo->JobId, statusMessage);
439+
returnable = 999;
416440
} else if (status == STAT_WARN) {
417441
log_warn("%s::%s(%d) : Enrollment job %s completed with"
418442
" warning: %s", LOG_INF, jobInfo->JobId, statusMessage);

inventory.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,11 @@ int cms_job_inventory(SessionJob_t * jobInfo, char *sessionToken)
393393

394394
res = get_inventory_config(sessionToken, jobInfo->JobId,
395395
jobInfo->ConfigurationEndpoint, &invConf);
396+
if (res != 0) {
397+
log_error("%s::%s(%d) : Failed to get inventory config", LOG_INF);
398+
free(statusMessage);
399+
return 999;
400+
}
396401

397402
/* Validate inputs */
398403
if (invConf) {
@@ -440,12 +445,14 @@ int cms_job_inventory(SessionJob_t * jobInfo, char *sessionToken)
440445
jobInfo->CompletionEndpoint, STAT_ERR, invConf->AuditId,
441446
statusMessage, &invComp);
442447
CommonCompleteResp_free(invComp);
448+
returnable = 999;
443449
goto exit;
444450
}
445451
} else {
446452
log_error("%s::%s(%d) : No inventory configuration was returned "
447453
"from the platform", LOG_INF);
448-
goto exit;
454+
free(statusMessage);
455+
return 999;
449456
}
450457

451458
if ((res == 0) &&
@@ -464,6 +471,13 @@ int cms_job_inventory(SessionJob_t * jobInfo, char *sessionToken)
464471
res = ssl_read_store_inventory(invConf->Job.StorePath,
465472
invConf->Job.StorePassword, &pemList);
466473

474+
if (res != 0) {
475+
log_error("%s::%s(%d) : Failed to read store inventory", LOG_INF);
476+
status = STAT_ERR;
477+
append_line(&statusMessage, strerror(res));
478+
returnable = 999;
479+
}
480+
467481
if (res == 0) {
468482
InventoryUpdateList_t *updateList = NULL;
469483
compute_inventory_update(invConf->Job.Inventory,
@@ -472,6 +486,11 @@ int cms_job_inventory(SessionJob_t * jobInfo, char *sessionToken)
472486
InventoryUpdateResp_t *updResp = NULL;
473487
res = send_inventory_update(sessionToken, jobInfo->JobId,
474488
invConf->InventoryEndpoint, updateList, &updResp);
489+
if (res != 0) {
490+
log_error("%s::%s(%d) : Failed to send inventory update", LOG_INF);
491+
status = STAT_ERR;
492+
returnable = 999;
493+
}
475494
if (res == 0 && updResp) {
476495
AgentApiResult_log(updResp->Result, &statusMessage, &status);
477496
}
@@ -497,13 +516,18 @@ int cms_job_inventory(SessionJob_t * jobInfo, char *sessionToken)
497516
res = send_inventory_job_complete(sessionToken, jobInfo->JobId,
498517
jobInfo->CompletionEndpoint, (status + 1), auditId,
499518
statusMessage, &invComp);
519+
if (res != 0) {
520+
log_error("%s::%s(%d) : Failed to send inventory job complete", LOG_INF);
521+
returnable = 999;
522+
}
500523
if (res == 0 && invComp) {
501524
AgentApiResult_log(invComp->Result, NULL, NULL);
502525
}
503526

504527
if (status >= STAT_ERR) {
505528
log_error("%s::%s(%d) : Inventory job %s failed with error: %s",
506529
LOG_INF, jobInfo->JobId, statusMessage);
530+
returnable = 999;
507531
} else if (status == STAT_WARN) {
508532
log_warn("%s::%s(%d) : Inventory job %s completed with "
509533
"warning: %s", LOG_INF, jobInfo->JobId, statusMessage);

management.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -401,13 +401,13 @@ int cms_job_manage(SessionJob_t * jobInfo, char *sessionToken,
401401
jobInfo->CompletionEndpoint, STAT_ERR, manConf->AuditId,
402402
statusMessage, &manComp);
403403
ManagementCompleteResp_free(manComp);
404-
res = 999;
404+
returnable = 999;
405405
goto exit;
406406
}
407407
} else {
408408
log_error("%s::%s(%d) : No management configuration was returned from the platform.", LOG_INF);
409-
res = 999;
410-
goto exit;
409+
free(statusMessage);
410+
return 999;
411411
}
412412

413413
/* Data ok, process job */
@@ -428,7 +428,7 @@ int cms_job_manage(SessionJob_t * jobInfo, char *sessionToken,
428428
const char* msg = "Adding a PFX is not supported at this time";
429429
log_info("%s::%s(%d) : %s", LOG_INF, msg);
430430
status = STAT_ERR;
431-
res = 999;
431+
returnable = 999;
432432
append_line(&statusMessage, msg);
433433
} else {
434434
log_info("%s::%s(%d) : Attempting to add certificate to the store:\n%s", LOG_INF,
@@ -437,7 +437,7 @@ int cms_job_manage(SessionJob_t * jobInfo, char *sessionToken,
437437
manConf->Job.EntryContents, &statusMessage, &status);
438438
if (res != 0) {
439439
log_error("%s::%s(%d) : Failed to add certificate to the store", LOG_INF);
440-
res = 999;
440+
returnable = 999;
441441
}
442442
}
443443
break;
@@ -448,14 +448,15 @@ int cms_job_manage(SessionJob_t * jobInfo, char *sessionToken,
448448
manConf->Job.Alias, manConf->Job.PrivateKeyPath,
449449
manConf->Job.StorePassword, &statusMessage, &status);
450450
if (res != 0) {
451-
log_error("%s::%s(%d) : Failed to add certificate to the store", LOG_INF);
452-
res = 999;
451+
log_error("%s::%s(%d) : Failed to remove certificate from the store", LOG_INF);
452+
returnable = 999;
453453
}
454454
break;
455455
default:
456456
log_error("%s::%s(%d) : Unsupported operation type: %d", LOG_INF, opType);
457457
append_linef(&statusMessage, "Unsupported operation type: %d", opType);
458458
status = STAT_ERR;
459+
returnable = 999;
459460
break;
460461
}
461462

@@ -471,12 +472,15 @@ int cms_job_manage(SessionJob_t * jobInfo, char *sessionToken,
471472

472473
if (res != 0) {
473474
log_error("%s::%s(%d) : Failed to send management job complete", LOG_INF);
475+
returnable = 999;
476+
ManagementCompleteResp_free(manComp);
474477
goto exit;
475478
}
476479

477480
if (status >= STAT_ERR) {
478481
log_error("%s::%s(%d) : Management job %s failed with "
479482
"error: %s", LOG_INF, jobInfo->JobId, statusMessage);
483+
returnable = 999;
480484
} else if (status == STAT_WARN) {
481485
log_warn("%s::%s(%d) : Management job %s completed"
482486
" with warning: %s", LOG_INF, jobInfo->JobId, statusMessage);

0 commit comments

Comments
 (0)