提交 da5a8aee 编写于 作者: D Daniel P. Berrange

Avoid integer wrap on remotePortMax in QEMU driver

The QEMU driver default max port is 65535, but it then increments
this by 1 to 65536. This maps to 0 in an unsigned short :-( This
was apparently done so that for() loops could use "< max" instead
of "<= max". Remove this insanity and just make the loop do the
right thing.
上级 4909bcbb
......@@ -233,10 +233,6 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
filename, QEMU_REMOTE_PORT_MAX);
goto cleanup;
}
/* increasing the value by 1 makes all the loops going through
the bitmap (i = remotePortMin; i < remotePortMax; i++), work as
expected. */
driver->remotePortMax++;
if (driver->remotePortMin > driver->remotePortMax) {
virReportError(VIR_ERR_INTERNAL_ERROR,
......
......@@ -84,7 +84,7 @@ virPortAllocatorPtr virPortAllocatorNew(unsigned short start,
pa->start = start;
pa->end = end;
if (!(pa->bitmap = virBitmapNew(end-start))) {
if (!(pa->bitmap = virBitmapNew((end-start)+1))) {
virReportOOMError();
virObjectUnref(pa);
return NULL;
......@@ -103,7 +103,7 @@ int virPortAllocatorAcquire(virPortAllocatorPtr pa,
*port = 0;
virObjectLock(pa);
for (i = pa->start ; i < pa->end && !*port; i++) {
for (i = pa->start ; i <= pa->end && !*port; i++) {
int reuse = 1;
struct sockaddr_in addr;
bool used = false;
......@@ -168,7 +168,7 @@ int virPortAllocatorRelease(virPortAllocatorPtr pa,
virObjectLock(pa);
if (port < pa->start ||
port >= pa->end) {
port > pa->end) {
virReportInvalidArg(port, "port %d must be in range (%d, %d)",
port, pa->start, pa->end);
goto cleanup;
......
......@@ -59,7 +59,7 @@ int bind(int sockfd ATTRIBUTE_UNUSED,
static int testAllocAll(const void *args ATTRIBUTE_UNUSED)
{
virPortAllocatorPtr alloc = virPortAllocatorNew(5900, 5910);
virPortAllocatorPtr alloc = virPortAllocatorNew(5900, 5909);
int ret = -1;
unsigned short p1, p2, p3, p4, p5, p6, p7;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册