Skip to content

Commit a7fc9c4

Browse files
author
Chris Stivers
committed
fixed a leak with byte arrays. also made sure to deref unicode strings
1 parent dfb0f8a commit a7fc9c4

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

src/main/client/get.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ PyObject * AerospikeClient_Get_Invoke(
8585

8686
CLEANUP:
8787

88+
// as_key_destroy(&key);
8889
as_record_destroy(rec);
8990

9091
if ( err.code != AEROSPIKE_OK ) {

src/main/conversions.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ as_status pyobject_to_val(as_error * err, PyObject * py_obj, as_val ** val)
284284
PyObject * py_ustr = PyUnicode_AsUTF8String(py_obj);
285285
char * str = PyString_AsString(py_ustr);
286286
*val = (as_val *) as_string_new(str, false);
287+
Py_DECREF(py_ustr);
287288
}
288289
else if ( PyByteArray_Check(py_obj) ) {
289290
uint8_t * b = (uint8_t *) PyByteArray_AsString(py_obj);
@@ -356,6 +357,7 @@ as_status pyobject_to_record(as_error * err, PyObject * py_rec, PyObject * py_me
356357
PyObject * py_ustr = PyUnicode_AsUTF8String(value);
357358
char * val = PyString_AsString(py_ustr);
358359
as_record_set_strp(rec, name, val, false);
360+
Py_DECREF(py_ustr);
359361
}
360362
else if ( PyString_Check(value) ) {
361363
char * val = PyString_AsString(value);
@@ -480,6 +482,7 @@ as_status pyobject_to_key(as_error * err, PyObject * py_keytuple, as_key * key)
480482
else if ( PyUnicode_Check(py_set) ) {
481483
PyObject * py_ustr = PyUnicode_AsUTF8String(py_set);
482484
set = PyString_AsString(py_ustr);
485+
Py_DECREF(py_ustr);
483486
}
484487
else {
485488
return as_error_update(err, AEROSPIKE_ERR_PARAM, "set must be a string");
@@ -503,6 +506,7 @@ as_status pyobject_to_key(as_error * err, PyObject * py_keytuple, as_key * key)
503506
PyObject * py_ustr = PyUnicode_AsUTF8String(py_key);
504507
char * k = PyString_AsString(py_ustr);
505508
as_key_init_strp(key, ns, set, k, true);
509+
Py_DECREF(py_ustr);
506510
}
507511
else if ( PyByteArray_Check(py_key) ) {
508512
return as_error_update(err, AEROSPIKE_ERR_PARAM, "key as a byte array is not supported");
@@ -758,28 +762,26 @@ as_status key_to_pyobject(as_error * err, const as_key * key, PyObject ** obj)
758762
as_val_t type = as_val_type(val);
759763
switch(type) {
760764
case AS_INTEGER: {
761-
as_integer * ival = as_integer_fromval(val);
762-
py_key = PyInt_FromLong((long) as_integer_get(ival));
763-
break;
764-
}
765+
as_integer * ival = as_integer_fromval(val);
766+
py_key = PyInt_FromLong((long) as_integer_get(ival));
767+
break;
768+
}
765769
case AS_STRING: {
766770
as_string * sval = as_string_fromval(val);
767771
py_key = PyUnicode_DecodeUTF8(as_string_get(sval), as_string_len(sval), NULL);
768772
break;
769773
}
770774
case AS_BYTES: {
771-
as_bytes * bval = as_bytes_fromval(val);
772-
if ( bval ) {
773-
uint32_t bval_size = as_bytes_size(bval);
774-
uint8_t * bval_bytes = malloc(bval_size * sizeof(uint8_t));
775-
memcpy(bval_bytes, as_bytes_get(bval), bval_size);
776-
py_key = PyByteArray_FromStringAndSize((char *) bval_bytes, bval_size);
777-
}
778-
break;
779-
}
775+
as_bytes * bval = as_bytes_fromval(val);
776+
if ( bval ) {
777+
uint32_t bval_size = as_bytes_size(bval);
778+
py_key = PyByteArray_FromStringAndSize((char *) as_bytes_get(bval), bval_size);
779+
}
780+
break;
781+
}
780782
default: {
781-
break;
782-
}
783+
break;
784+
}
783785
}
784786
}
785787

0 commit comments

Comments
 (0)