~stepankk/pyopenssl/bug-845445

« back to all changes in this revision

Viewing changes to OpenSSL/crypto/x509name.c

  • Committer: Jean-Paul Calderone
  • Date: 2011-04-25 23:41:32 UTC
  • mfrom: (128.2.10 run-on-pypy)
  • Revision ID: exarkun@divmod.com-20110425234132-0f76yf59poaegjxu
Various fixes which make pyOpenSSL more likely to work with PyPy

  * Fix a consistent refcounting bug across most modules
  * switch from tp_setattr to tp_setattro
  * Fix a general bug in error handling when setting invalid X509Name attributes

Show diffs side-by-side

added added

removed removed

Lines of Context:
195
195
 *            value - The value to set
196
196
 */
197
197
static int
198
 
crypto_X509Name_setattr(crypto_X509NameObj *self, char *name, PyObject *value)
 
198
crypto_X509Name_setattro(crypto_X509NameObj *self, PyObject *nameobj, PyObject *value)
199
199
{
200
200
    int nid;
201
201
    int result;
202
202
    char *buffer;
 
203
    char *name;
 
204
 
 
205
    if (!PyBytes_CheckExact(nameobj) && !PyUnicode_CheckExact(nameobj)) {
 
206
        PyErr_Format(PyExc_TypeError,
 
207
                     "attribute name must be string, not '%.200s'",
 
208
                     Py_TYPE(nameobj)->tp_name);
 
209
        return -1;
 
210
    }
 
211
 
 
212
#ifdef PY3
 
213
    name = PyBytes_AsString(PyUnicode_AsASCIIString(nameobj));
 
214
#else
 
215
    name = PyBytes_AsString(nameobj);
 
216
#endif
203
217
 
204
218
    if ((nid = OBJ_txt2nid(name)) == NID_undef)
205
219
    {
 
220
        /* Just like the case in the getattr function */
 
221
        flush_error_queue();
206
222
        PyErr_SetString(PyExc_AttributeError, "No such attribute");
207
223
        return -1;
208
224
    }
475
491
    (destructor)crypto_X509Name_dealloc,
476
492
    NULL, /* print */
477
493
    NULL, /* getattr */
478
 
    (setattrfunc)crypto_X509Name_setattr,
 
494
    NULL, /* setattr */
479
495
    NULL, /* reserved */
480
496
    (reprfunc)crypto_X509Name_repr,
481
497
    NULL, /* as_number */
485
501
    NULL, /* call */
486
502
    NULL, /* str */
487
503
    (getattrofunc)crypto_X509Name_getattro, /* getattro */
488
 
    NULL, /* setattro */
 
504
    (setattrofunc)crypto_X509Name_setattro, /* setattro */
489
505
    NULL, /* as_buffer */
490
506
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
491
507
    crypto_X509Name_doc, /* tp_doc */
521
537
        return 0;
522
538
    }
523
539
 
 
540
    /* PyModule_AddObject steals a reference.
 
541
     */
 
542
    Py_INCREF((PyObject *)&crypto_X509Name_Type);
524
543
    if (PyModule_AddObject(module, "X509Name", (PyObject *)&crypto_X509Name_Type) != 0) {
525
544
        return 0;
526
545
    }
527
546
 
 
547
    /* PyModule_AddObject steals a reference.
 
548
     */
 
549
    Py_INCREF((PyObject *)&crypto_X509Name_Type);
528
550
    if (PyModule_AddObject(module, "X509NameType", (PyObject *)&crypto_X509Name_Type) != 0) {
529
551
        return 0;
530
552
    }