- fix possible leaks when changing message type
[m6w6/ext-http] / http_message_object.c
index 3adbb273e76c523c3ce869aa1ac31ab0293718b8..e2dbb563de8c62fabb30587d62b6733fa4a83195 100644 (file)
@@ -886,8 +886,8 @@ PHP_METHOD(HttpMessage, setResponseCode)
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &code)) {
                RETURN_FALSE;
        }
-       if (code < 100 || code > 510) {
-               http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid response code (100-510): %ld", code);
+       if (code < 100 || code > 599) {
+               http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid response code (100-599): %ld", code);
                RETURN_FALSE;
        }
 
@@ -905,7 +905,11 @@ PHP_METHOD(HttpMessage, getResponseStatus)
        if (return_value_used) {
                getObject(http_message_object, obj);
                HTTP_CHECK_MESSAGE_TYPE_RESPONSE(obj->message, RETURN_FALSE);
-               RETURN_STRING(obj->message->http.info.response.status, 1);
+               if (obj->message->http.info.response.status) {
+                       RETURN_STRING(obj->message->http.info.response.status, 1);
+               } else {
+                       RETURN_EMPTY_STRING();
+               }
        }
 }
 /* }}} */
@@ -923,7 +927,7 @@ PHP_METHOD(HttpMessage, setResponseStatus)
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &status, &status_len)) {
                RETURN_FALSE;
        }
-       STR_SET(obj->message->http.info.response.status, estrdup(status));
+       STR_SET(obj->message->http.info.response.status, estrndup(status, status_len));
        RETURN_TRUE;
 }
 /* }}} */
@@ -937,7 +941,11 @@ PHP_METHOD(HttpMessage, getRequestMethod)
        if (return_value_used) {
                getObject(http_message_object, obj);
                HTTP_CHECK_MESSAGE_TYPE_REQUEST(obj->message, RETURN_FALSE);
-               RETURN_STRING(obj->message->http.info.request.method, 1);
+               if (obj->message->http.info.request.method) {
+                       RETURN_STRING(obj->message->http.info.request.method, 1);
+               } else {
+                       RETURN_EMPTY_STRING();
+               }
        }
 }
 /* }}} */
@@ -978,7 +986,11 @@ PHP_METHOD(HttpMessage, getRequestUrl)
        if (return_value_used) {
                getObject(http_message_object, obj);
                HTTP_CHECK_MESSAGE_TYPE_REQUEST(obj->message, RETURN_FALSE);
-               RETURN_STRING(obj->message->http.info.request.url, 1);
+               if (obj->message->http.info.request.url) {
+                       RETURN_STRING(obj->message->http.info.request.url, 1);
+               } else {
+                       RETURN_EMPTY_STRING();
+               }
        }
 }
 /* }}} */
@@ -1278,8 +1290,12 @@ PHP_METHOD(HttpMessage, unserialize)
        getObject(http_message_object, obj);
        
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &serialized, &length)) {
+               http_message *msg;
+               
                http_message_dtor(obj->message);
-               if (!http_message_parse_ex(obj->message, serialized, (size_t) length)) {
+               if ((msg = http_message_parse_ex(obj->message, serialized, (size_t) length))) {
+                       obj->message = msg;
+               } else {
                        http_error(HE_ERROR, HTTP_E_RUNTIME, "Could not unserialize HttpMessage");
                        http_message_init(obj->message);
                }