--- a/crack.c 2016-12-19 16:04:09.244782234 -0500 +++ b/crack.c 2016-12-20 09:20:11.903140742 -0500 @@ -36,13 +36,31 @@ /* True global resources - no need for thread safety here */ static int le_crack; +ZEND_BEGIN_ARG_INFO_EX(crack_opendict_args, 0, ZEND_RETURN_VALUE, 1) + ZEND_ARG_INFO(0, dictionary) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(crack_closedict_args, 0, ZEND_RETURN_VALUE, 0) + ZEND_ARG_INFO(0, dictionary) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(crack_check_args, 0, ZEND_RETURN_VALUE, 1) + ZEND_ARG_INFO(0, password) + ZEND_ARG_INFO(0, username) + ZEND_ARG_INFO(0, gecos) + ZEND_ARG_INFO(0, dictionary) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(crack_getlastmessage_args, 0, ZEND_RETURN_VALUE, 0) +ZEND_END_ARG_INFO() + /* {{{ crack_functions[] */ zend_function_entry crack_functions[] = { - PHP_FE(crack_opendict, NULL) - PHP_FE(crack_closedict, NULL) - PHP_FE(crack_check, NULL) - PHP_FE(crack_getlastmessage, NULL) + ZEND_FE(crack_opendict, crack_opendict_args) + ZEND_FE(crack_closedict, crack_closedict_args) + ZEND_FE(crack_check, crack_check_args) + ZEND_FE(crack_getlastmessage, crack_getlastmessage_args) {NULL, NULL, NULL} }; /* }}} */ @@ -55,7 +73,7 @@ #endif "crack", crack_functions, - PHP_MINIT(crack), + PHP_MINIT(crack), PHP_MSHUTDOWN(crack), PHP_RINIT(crack), PHP_RSHUTDOWN(crack), @@ -84,7 +102,11 @@ static void php_crack_init_globals(zend_crack_globals *crack_globals) { crack_globals->last_message = NULL; +#if PHP_VERSION_ID >= 70000 + crack_globals->default_dict = NULL; +#else crack_globals->default_dict = -1; +#endif } /* }}} */ @@ -95,7 +117,7 @@ char *filename; int filename_len; int result = SUCCESS; - + #if PHP_VERSION_ID < 50400 if (PG(safe_mode)) { filename_len = strlen(path) + 10; @@ -103,7 +125,7 @@ if (NULL == filename) { return FAILURE; } - + memset(filename, '\0', filename_len); strcpy(filename, path); strcat(filename, ".pwd"); @@ -111,7 +133,7 @@ efree(filename); return FAILURE; } - + memset(filename, '\0', filename_len); strcpy(filename, path); strcat(filename, ".pwi"); @@ -119,7 +141,7 @@ efree(filename); return FAILURE; } - + memset(filename, '\0', filename_len); strcpy(filename, path); strcat(filename, ".hwm"); @@ -129,39 +151,64 @@ } } #endif - + if (php_check_open_basedir(path TSRMLS_CC)) { return FAILURE; } - + return SUCCESS; } /* }}} */ /* {{{ php_crack_set_default_dict */ +#if PHP_VERSION_ID >= 70000 +static void php_crack_set_default_dict(zend_resource *id) +{ + if (CRACKG(default_dict) != NULL) { + zend_list_close(CRACKG(default_dict)); + } + + CRACKG(default_dict) = id; + id->gc.refcount++; +} +#else static void php_crack_set_default_dict(int id TSRMLS_DC) { if (CRACKG(default_dict) != -1) { zend_list_delete(CRACKG(default_dict)); } - + CRACKG(default_dict) = id; zend_list_addref(id); } +#endif /* }}} */ /* {{{ php_crack_get_default_dict */ +#if PHP_VERSION_ID >= 70000 +static zend_resource * php_crack_get_default_dict(INTERNAL_FUNCTION_PARAMETERS) +#else static int php_crack_get_default_dict(INTERNAL_FUNCTION_PARAMETERS) +#endif { +#if PHP_VERSION_ID >= 70000 + if ((NULL == CRACKG(default_dict)) && (NULL != CRACKG(default_dictionary))) { +#else if ((-1 == CRACKG(default_dict)) && (NULL != CRACKG(default_dictionary))) { +#endif CRACKLIB_PWDICT *pwdict; printf("trying to open: %s\n", CRACKG(default_dictionary)); pwdict = cracklib_pw_open(CRACKG(default_dictionary), "r"); if (NULL != pwdict) { +#if PHP_VERSION_ID >= 70000 + ZVAL_RES(return_value, zend_register_resource(pwdict, le_crack)); + php_crack_set_default_dict(Z_RES_P(return_value)); +#else ZEND_REGISTER_RESOURCE(return_value, pwdict, le_crack); php_crack_set_default_dict(Z_LVAL_P(return_value) TSRMLS_CC); +#endif } } @@ -171,7 +218,11 @@ /* {{{ php_crack_module_dtor */ +#if PHP_VERSION_ID >= 70000 +static void php_crack_module_dtor(zend_resource *rsrc) +#else static void php_crack_module_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) +#endif { CRACKLIB_PWDICT *pwdict = (CRACKLIB_PWDICT *) rsrc->ptr; @@ -191,7 +242,9 @@ REGISTER_INI_ENTRIES(); le_crack = zend_register_list_destructors_ex(php_crack_module_dtor, NULL, "crack dictionary", module_number); +#if PHP_VERSION_ID < 70000 Z_TYPE(crack_module_entry) = type; +#endif return SUCCESS; } @@ -210,7 +263,11 @@ PHP_RINIT_FUNCTION(crack) { CRACKG(last_message) = NULL; +#if PHP_VERSION_ID >= 70000 + CRACKG(default_dict) = NULL; +#else CRACKG(default_dict) = -1; +#endif return SUCCESS; } @@ -245,7 +302,7 @@ PHP_FUNCTION(crack_opendict) { char *path; - int path_len; + size_t path_len; CRACKLIB_PWDICT *pwdict; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &path, &path_len) == FAILURE) { @@ -265,9 +322,14 @@ #endif RETURN_FALSE; } - + +#if PHP_VERSION_ID >= 70000 + RETURN_RES(zend_register_resource(pwdict, le_crack)); + php_crack_set_default_dict(Z_RES_P(return_value)); +#else ZEND_REGISTER_RESOURCE(return_value, pwdict, le_crack); php_crack_set_default_dict(Z_LVAL_P(return_value) TSRMLS_CC); +#endif } /* }}} */ @@ -276,7 +338,11 @@ PHP_FUNCTION(crack_closedict) { zval *dictionary = NULL; +#if PHP_VERSION_ID >= 70000 + zend_resource *id; +#else int id = -1; +#endif CRACKLIB_PWDICT *pwdict; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &dictionary)) { @@ -285,7 +351,11 @@ if (NULL == dictionary) { id = php_crack_get_default_dict(INTERNAL_FUNCTION_PARAM_PASSTHRU); +#if PHP_VERSION_ID >= 70000 + if (id == NULL) { +#else if (id == -1) { +#endif #if ZEND_MODULE_API_NO >= 20021010 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not open default crack dicionary"); #else @@ -294,8 +364,21 @@ RETURN_FALSE; } } +#if PHP_VERSION_ID >= 70000 + if((pwdict = (CRACKLIB_PWDICT *)zend_fetch_resource(Z_RES_P(dictionary), "crack dictionary", le_crack)) == NULL) + { + RETURN_FALSE; + } + if (NULL == dictionary) { + zend_list_close(CRACKG(default_dict)); + CRACKG(default_dict) = NULL; + } + else { + zend_list_close(Z_RES_P(dictionary)); + } +#else ZEND_FETCH_RESOURCE(pwdict, CRACKLIB_PWDICT *, &dictionary, id, "crack dictionary", le_crack); - + if (NULL == dictionary) { zend_list_delete(CRACKG(default_dict)); CRACKG(default_dict) = -1; @@ -303,7 +386,7 @@ else { zend_list_delete(Z_RESVAL_P(dictionary)); } - +#endif RETURN_TRUE; } /* }}} */ @@ -314,14 +397,18 @@ { zval *dictionary = NULL; char *password = NULL; - int password_len; + size_t password_len; char *username = NULL; - int username_len; + size_t username_len; char *gecos = NULL; - int gecos_len; + size_t gecos_len; char *message; CRACKLIB_PWDICT *pwdict; +#if PHP_VERSION_ID >= 70000 + zend_resource *crack_res; +#else int id = -1; +#endif if (NULL != CRACKG(last_message)) { efree(CRACKG(last_message)); @@ -335,6 +422,21 @@ } if (NULL == dictionary) { +#if PHP_VERSION_ID >= 70000 + crack_res = php_crack_get_default_dict(INTERNAL_FUNCTION_PARAM_PASSTHRU); + if (crack_res == NULL || crack_res->ptr == NULL) { + php_error(E_WARNING, "Could not open default crack dicionary"); + RETURN_FALSE; + } + + } + else { + if((pwdict = (CRACKLIB_PWDICT *)zend_fetch_resource(Z_RES_P(dictionary), "crack dictionary", le_crack)) == NULL) { + php_error(E_WARNING, "Could not open crack dicionary resource"); + RETURN_FALSE; + } + } +#else id = php_crack_get_default_dict(INTERNAL_FUNCTION_PARAM_PASSTHRU); if (id == -1) { #if ZEND_MODULE_API_NO >= 20021010 @@ -346,6 +448,7 @@ } } ZEND_FETCH_RESOURCE(pwdict, CRACKLIB_PWDICT *, &dictionary, id, "crack dictionary", le_crack); +#endif message = cracklib_fascist_look_ex(pwdict, password, username, gecos); @@ -377,7 +480,11 @@ RETURN_FALSE; } +#if PHP_VERSION_ID >= 70000 + RETURN_STRING(CRACKG(last_message)); +#else RETURN_STRING(CRACKG(last_message), 1); +#endif } /* }}} */ --- a/php_crack.h 2005-09-21 05:00:06.000000000 -0400 +++ b/php_crack.h 2016-12-19 16:51:22.449321851 -0500 @@ -52,7 +52,11 @@ ZEND_BEGIN_MODULE_GLOBALS(crack) char *default_dictionary; char *last_message; +#if PHP_VERSION_ID >= 70000 + zend_resource *default_dict; +#else int default_dict; +#endif ZEND_END_MODULE_GLOBALS(crack) #ifdef ZTS