[Libguestfs] [PATCH 3/3] Use an unsigned type (size_t) for all loop iterators.
Matthew Booth
mbooth at redhat.com
Fri Jul 16 14:34:26 UTC 2010
On 16/07/10 15:26, Richard W.M. Jones wrote:
> On Fri, Jul 16, 2010 at 02:27:12PM +0100, Matthew Booth wrote:
>> On 16/07/10 13:05, Richard W.M. Jones wrote:
>>> @@ -9354,7 +9354,7 @@ put_handle (guestfs_h *g)
>>> static char **
>>> get_string_list (PyObject *obj)
>>> {
>>> - int i, len;
>>> + size_t i, len;
>>> char **r;
>>>
>>> assert (obj);
>>
>> This isn't safe. len is assigned later:
>>
>> len = PyList_Size (obj);
>>
>> PyList_Size returns Py_ssize_t, which is a signed type. This may also
>> mean that the later code may also need a second look, as it doesn't
>> check for a negative return value.
>
> I checked in the Python source and PyList_Size does do some sort of
> runtime check of the obj parameter and could return -1. No wonder
> it's slow.
>
> In the updated patch attached the hunk now looks like this:
>
> @@ -9354,7 +9354,7 @@ put_handle (guestfs_h *g)
> static char **
> get_string_list (PyObject *obj)
> {
> - int i, len;
> + size_t i, len;
> char **r;
>
> assert (obj);
> @@ -9364,7 +9364,12 @@ get_string_list (PyObject *obj)
> return NULL;
> }
>
> - len = PyList_Size (obj);
> + Py_ssize_t slen = PyList_Size (obj);
> + if (slen == -1) {
> + PyErr_SetString (PyExc_RuntimeError, \"get_string_list: PyList_Size failure\");
> + return NULL;
> + }
> + len = (size_t) slen;
> r = malloc (sizeof (char *) * (len+1));
> if (r == NULL) {
> PyErr_SetString (PyExc_RuntimeError, \"get_string_list: out of memory\");
>
Looks good. ACK.
Matt
--
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team
GPG ID: D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490
More information about the Libguestfs
mailing list