1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

Bug 1015: Define and use Py_ssize_t.

This commit is contained in:
Kalle Olavi Niemitalo 2008-06-09 23:18:03 +03:00 committed by Kalle Olavi Niemitalo
parent 5e4a565603
commit a833d6d093
4 changed files with 23 additions and 3 deletions

1
NEWS
View File

@ -225,6 +225,7 @@ have already been considered.
not sorted not sorted
- (bugfix 968) assertion width > 0 failed in copy_chars called from - (bugfix 968) assertion width > 0 failed in copy_chars called from
justify_line justify_line
- bug 1015: incompatible pointer type for PyString_AsStringAndSize
* Already backported to a previous release but not listed there: * Already backported to a previous release but not listed there:
- (enhancement) Activate link only when onClick returns true. - (enhancement) Activate link only when onClick returns true.
Fixed bug 786 in ELinks 0.11.2. Fixed bug 786 in ELinks 0.11.2.

View File

@ -6,6 +6,19 @@
#include "config.h" #include "config.h"
#endif #endif
/* PyString_AsStringAndSize() takes a Py_ssize_t * in Python 2.5 but
* an int * in Python 2.4. To be compatible with both, ELinks uses
* Py_ssize_t and defines it here if necessary. The public-domain
* PEP 353 <http://www.python.org/dev/peps/pep-0353/> suggests the
* following snippet, so we can use the Py_ssize_t name even though
* Python generally reserves names starting with "Py_". */
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
typedef int Py_ssize_t;
#define PY_SSIZE_T_MAX INT_MAX
#define PY_SSIZE_T_MIN INT_MIN
#endif
/* End of PEP 353 snippet. */
struct module; struct module;
extern struct session *python_ses; extern struct session *python_ses;

View File

@ -103,11 +103,16 @@ script_hook_pre_format_html(va_list ap, void *data)
if (result != Py_None) { if (result != Py_None) {
unsigned char *str; unsigned char *str;
int len; Py_ssize_t len;
if (PyString_AsStringAndSize(result, (char **) &str, &len) != 0) if (PyString_AsStringAndSize(result, (char **) &str, &len) != 0)
goto error; goto error;
/* This assumes the Py_ssize_t len is not too large to
* fit in the off_t parameter of normalize_cache_entry().
* add_fragment() itself seems to assume the same thing,
* and there is no standard OFF_MAX macro against which
* ELinks could check the value. */
(void) add_fragment(cached, 0, str, len); (void) add_fragment(cached, 0, str, len);
normalize_cache_entry(cached, len); normalize_cache_entry(cached, len);
} }

View File

@ -79,7 +79,8 @@ python_menu(PyObject *self, PyObject *args, PyObject *kwargs)
{ {
PyObject *items; PyObject *items;
enum python_menu_type menu_type = PYTHON_MENU_DEFAULT; enum python_menu_type menu_type = PYTHON_MENU_DEFAULT;
int length, i; Py_ssize_t length;
int i;
struct menu_item *menu; struct menu_item *menu;
struct memory_list *ml = NULL; struct memory_list *ml = NULL;
static char *kwlist[] = {"items", "type", NULL}; static char *kwlist[] = {"items", "type", NULL};
@ -104,7 +105,7 @@ python_menu(PyObject *self, PyObject *args, PyObject *kwargs)
return NULL; return NULL;
} }
length = PySequence_Length(items); length = PySequence_Length(items);
if (length == -1) return NULL; if (length == -1 || length > INT_MAX) return NULL;
else if (length == 0) goto success; else if (length == 0) goto success;
if (menu_type < 0 || menu_type >= PYTHON_MENU_MAX) { if (menu_type < 0 || menu_type >= PYTHON_MENU_MAX) {