[Libvir] [PATCH] Fixed integer wraparound in python binding
Daniel P. Berrange
berrange at redhat.com
Wed Nov 15 02:41:55 UTC 2006
The attached patch fixes a problem with integrate wraparound in the python
bindings. THe problem is thus:
- the memory & max-memory fields in the virDomainInfo struct are
of type 'unsigned long'.
- The python bindings, however, then stick this into a python 'Int'
which is signed.
Now, on 64-bit this is not an issue. For DomU guests on 32-bit it is not
an issue either, but for Dom0 XenD sets the max-memory field to be
2^32-1 whcih causes wraparound when converting to python int.
This patch simply switches the python binding over to using a python Long
which is 64 bits on all platforms.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
-------------- next part --------------
Index: libvir.c
===================================================================
RCS file: /data/cvs/libvirt/python/libvir.c,v
retrieving revision 1.15
diff -c -r1.15 libvir.c
*** libvir.c 7 Nov 2006 23:18:56 -0000 1.15
--- libvir.c 13 Nov 2006 20:25:12 -0000
***************
*** 261,268 ****
}
py_retval = PyList_New(5);
PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state));
! PyList_SetItem(py_retval, 1, libvirt_longWrap((long) info.maxMem));
! PyList_SetItem(py_retval, 2, libvirt_longWrap((long) info.memory));
PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.nrVirtCpu));
PyList_SetItem(py_retval, 4,
libvirt_longlongWrap((unsigned long long) info.cpuTime));
--- 261,268 ----
}
py_retval = PyList_New(5);
PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state));
! PyList_SetItem(py_retval, 1, libvirt_ulongWrap(info.maxMem));
! PyList_SetItem(py_retval, 2, libvirt_ulongWrap(info.memory));
PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.nrVirtCpu));
PyList_SetItem(py_retval, 4,
libvirt_longlongWrap((unsigned long long) info.cpuTime));
Index: libvirt_wrap.h
===================================================================
RCS file: /data/cvs/libvirt/python/libvirt_wrap.h,v
retrieving revision 1.4
diff -c -r1.4 libvirt_wrap.h
*** libvirt_wrap.h 24 Oct 2006 20:28:16 -0000 1.4
--- libvirt_wrap.h 13 Nov 2006 20:25:12 -0000
***************
*** 41,46 ****
--- 41,47 ----
PyObject * libvirt_intWrap(int val);
PyObject * libvirt_longWrap(long val);
+ PyObject * libvirt_ulongWrap(unsigned long val);
PyObject * libvirt_longlongWrap(long long val);
PyObject * libvirt_charPtrWrap(char *str);
PyObject * libvirt_constcharPtrWrap(const char *str);
Index: types.c
===================================================================
RCS file: /data/cvs/libvirt/python/types.c,v
retrieving revision 1.3
diff -c -r1.3 types.c
*** types.c 9 Feb 2006 17:45:12 -0000 1.3
--- types.c 13 Nov 2006 20:25:12 -0000
***************
*** 34,39 ****
--- 34,51 ----
}
PyObject *
+ libvirt_ulongWrap(unsigned long val)
+ {
+ PyObject *ret;
+
+ #ifdef DEBUG
+ printf("libvirt_ulongWrap: val = %lu\n", val);
+ #endif
+ ret = PyLong_FromLong(val);
+ return (ret);
+ }
+
+ PyObject *
libvirt_longlongWrap(long long val)
{
PyObject *ret;
More information about the libvir-list
mailing list