Kill the use of atoi() and introduce syntax check to forbid it and it's friends (atol, atoll, atof, atoq). Also fix a typo in variable name holding the cylinders count of a disk pool (apparently unused). examples/domsuspend/suspend.c will need a larger scale refactor as the whole example file is broken thus it will be exempted from the syntax check for now. --- Notes: Version 3: - add TODO to examples/domsuspend/suspend.c to remove the exemption of the syntax check - exemption rule made specific for this file only cfg.mk | 9 +++++++++ examples/domsuspend/suspend.c | 1 + src/conf/storage_conf.h | 2 +- src/qemu/qemu_command.c | 8 ++++++-- src/storage/storage_backend_disk.c | 14 +++++++++----- src/xen/xend_internal.c | 17 +++++++++++++---- 6 files changed, 39 insertions(+), 12 deletions(-) diff --git a/cfg.mk b/cfg.mk index befd231..838934a 100644 --- a/cfg.mk +++ b/cfg.mk @@ -869,6 +869,12 @@ sc_prohibit_getenv: halt='Use virGetEnv{Allow,Block}SUID instead of getenv' \ $(_sc_search_regexp) +sc_prohibit_atoi: + @prohibit='\bato(i|f|l|ll|q) *\(' \ + halt='Use virStrToLong* instead of atoi, atol, atof, atoq, atoll' \ + $(_sc_search_regexp) + + # We don't use this feature of maint.mk. prev_version_file = /dev/null @@ -1040,3 +1046,6 @@ exclude_file_name_regexp--sc_prohibit_int_ijk = \ exclude_file_name_regexp--sc_prohibit_getenv = \ ^tests/.*\.[ch]$$ + +exclude_file_name_regexp--sc_prohibit_atoi= \ + ^examples/domsuspend/suspend.c$$ diff --git a/examples/domsuspend/suspend.c b/examples/domsuspend/suspend.c index 6a0f5c9..5f7a890 100644 --- a/examples/domsuspend/suspend.c +++ b/examples/domsuspend/suspend.c @@ -104,6 +104,7 @@ int main(int argc, char **argv) { } if (argc > 1) { + /* TODO: remove exclusion of this file from syntax check denying atoi */ id = atoi(argv[1]); } if (id == 0) { diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index f062bd8..05c291e 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -227,7 +227,7 @@ struct _virStoragePoolSourceDevice { * the geometry data is needed */ struct _geometry { - int cyliders; + int cylinders; int heads; int sectors; } geometry; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 966aa0d..25beedf 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3663,8 +3663,12 @@ qemuBuildDriveURIString(virConnectPtr conn, if (disk->src && virAsprintf(&volimg, "/%s", disk->src) < 0) goto cleanup; - if (disk->hosts->port) { - port = atoi(disk->hosts->port); + if (disk->hosts->port && + virStrToLong_i(disk->hosts->port, NULL, 0, &port) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse network port '%s'"), + disk->hosts->port); + goto cleanup; } if (disk->hosts->socket && diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index 4e53ec5..a7a7d0e 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -280,12 +280,16 @@ virStorageBackendDiskMakePoolGeometry(virStoragePoolObjPtr pool, char **const groups, void *data ATTRIBUTE_UNUSED) { + virStoragePoolSourceDevicePtr device = &(pool->def->source.devices[0]); + if (virStrToLong_i(groups[0], NULL, 0, &device->geometry.cylinders) < 0 || + virStrToLong_i(groups[1], NULL, 0, &device->geometry.heads) < 0 || + virStrToLong_i(groups[2], NULL, 0, &device->geometry.sectors) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to create disk pool geometry")); + return -1; + } - pool->def->source.devices[0].geometry.cyliders = atoi(groups[0]); - pool->def->source.devices[0].geometry.heads = atoi(groups[1]); - pool->def->source.devices[0].geometry.sectors = atoi(groups[2]); - - return 0; + return 0; } static int diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index dc57350..771288c 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -290,10 +290,19 @@ xend_req(int fd, char **content) if (STREQ(buffer, "\r\n")) break; - if (istartswith(buffer, "Content-Length: ")) - content_length = atoi(buffer + 16); - else if (istartswith(buffer, "HTTP/1.1 ")) - retcode = atoi(buffer + 9); + if (istartswith(buffer, "Content-Length: ")) { + if (virStrToLong_i(buffer + 16, NULL, 10, &content_length) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to parse Xend response content length")); + return -1; + } + } else if (istartswith(buffer, "HTTP/1.1 ")) { + if (virStrToLong_i(buffer + 9, NULL, 10, &retcode) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to parse Xend response return code")); + return -1; + } + } } VIR_FREE(buffer); -- 1.8.4.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list