【问题标题】:Is the return value of pycurl.CurlMulti.info_read still usable after call to remove_handle?调用 remove_handle 后,pycurl.CurlMulti.info_read 的返回值是否仍然可用?
【发布时间】:2019-05-01 12:20:05
【问题描述】:

我在python3 中使用pycurl.CurlMulti 接口,我想使用info_read 来检查成功和失败的连接。

根据c接口curl_multi_info_readlibcurl的文档:

警告:返回的指针指向的数据在调用 curl_multi_cleanup、curl_multi_remove_handle 或 curl_easy_cleanup 时将无法生存。

但是,pycurl.CurlMulti 的文档并没有提到 pycurl.CurlMulti.info_read() 的返回值中的 curl error message 在调用 curl_multi_remove_handle 后是否有效。

唯一的检查方法是阅读pycurl的源代码。

【问题讨论】:

    标签: libcurl pycurl


    【解决方案1】:

    我检查了pycurl.CurlMulti.info_read 的源代码,它显示:

            /* When an error occurs */
            else {
                /* Create a result tuple that will get added to err_list. */
                PyObject *v = Py_BuildValue("(Ois)", (PyObject *)co, (int)msg->data.result, co->error);
                /* Append curl object to list of objects which failed */
                if (v == NULL || PyList_Append(err_list, v) != 0) {
                    Py_XDECREF(v);
                    goto error;
                }
                Py_DECREF(v);
            }
    

    其中co 是从L781 检索到的:

            /* Fetch the curl object that corresponds to the curl handle in the message */
            res = curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, (char **) &co);
    

    CURLINFO_PRIVATEco->error 设置为src/easy.c#L52

        /* Set curl error buffer and zero it */
        res = curl_easy_setopt(self->handle, CURLOPT_ERRORBUFFER, self->error);
        if (res != CURLE_OK) {
            return (-1);
        }
        memset(self->error, 0, sizeof(self->error));
    
        /* Set backreference */
        res = curl_easy_setopt(self->handle, CURLOPT_PRIVATE, (char *) self);
        if (res != CURLE_OK) {
            return (-1);
        }
    

    这意味着鉴于pycurl.Curl 对象没有被重用于另一个连接或被销毁,在pycurl.CurlMulti.info_read() 的返回值中使用curl error message 应该是相当安全的。

    这个答案给了我另一个有趣的事实:

    pycurl.Curl 对象上设置CURLOPT_PRIVATE 是不安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-04
      • 2012-03-22
      • 2020-09-24
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 2021-01-07
      • 2017-11-08
      相关资源
      最近更新 更多