Index: res/res_pjsip_pubsub.c =================================================================== --- res/res_pjsip_pubsub.c (revision 410558) +++ res/res_pjsip_pubsub.c (working copy) @@ -762,11 +762,19 @@ expires_header = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_EXPIRES, rdata->msg_info.msg->hdr.next); - if (expires_header && expires_header->ivalue < endpoint->subscription.minexpiry) { - ast_log(LOG_WARNING, "Subscription expiration %d is too brief for endpoint %s. Minimum is %d\n", - expires_header->ivalue, ast_sorcery_object_get_id(endpoint), endpoint->subscription.minexpiry); - pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 423, NULL, NULL, NULL); - return PJ_TRUE; + if (expires_header) { + if (expires_header->ivalue == 0) { + ast_log(LOG_WARNING, "Susbscription request from endpoint %s rejected. Expiration of 0 is invalid\n", + ast_sorcery_object_get_id(endpoint)); + pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 400, NULL, NULL, NULL); + return PJ_TRUE; + } + if (expires_header->ivalue < endpoint->subscription.minexpiry) { + ast_log(LOG_WARNING, "Subscription expiration %d is too brief for endpoint %s. Minimum is %d\n", + expires_header->ivalue, ast_sorcery_object_get_id(endpoint), endpoint->subscription.minexpiry); + pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 423, NULL, NULL, NULL); + return PJ_TRUE; + } } event_header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_event_name, rdata->msg_info.msg->hdr.next);