# [PATCH] Fixes for Sybase-DB in PHP 5 HEAD

- Thread: https://externals.io/message/2202
- Original archive: https://news-web.php.net/php.internals/2202
- Started by David Brown on 2003-06-06T18:07:16+00:00
- Messages: 1
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #2202 — David Brown — 2003-06-06T18:07:16+00:00

URL: https://externals.io/message/2202#2202

Hi:

The enclosed patch makes the Sybase DBLib support compile against PHP 5
and ZE 2, fixes crashes in sybase_select_db() and sybase_affected_rows()
related to incorrect zval initialization, implements the missing
sybase_fetch_assoc(), removes a bunch of redundant calls to Z_STRLEN_PP()
in php_sybase_do_connect(), and checks the return value of malloc() in the one
place it's called.  I've tested the modifications against a CVS snapshot of the
FreeTDS dblib.

If everything in the patch looks okay, could this be applied?


Thanks in advance,

- Dave
  dave@codewhore.org


Index: ext/sybase/php_sybase_db.c
===================================================================
RCS file: /repository/php4/ext/sybase/php_sybase_db.c,v
retrieving revision 1.48
diff -u -u -r1.48 php_sybase_db.c
--- ext/sybase/php_sybase_db.c	15 Apr 2003 01:48:01 -0000	1.48
+++ ext/sybase/php_sybase_db.c	6 Jun 2003 18:06:55 -0000
@@ -92,6 +92,7 @@
 	PHP_FE(sybase_num_fields,		NULL)
 	PHP_FE(sybase_fetch_row,		NULL)
 	PHP_FE(sybase_fetch_array,		NULL)
+	PHP_FE(sybase_fetch_assoc,		NULL)
 	PHP_FE(sybase_fetch_object,		NULL)
 	PHP_FE(sybase_data_seek,		NULL)
 	PHP_FE(sybase_fetch_field,		NULL)
@@ -111,6 +112,7 @@
 	PHP_FALIAS(mssql_num_fields,	sybase_num_fields,		NULL)
 	PHP_FALIAS(mssql_fetch_row,		sybase_fetch_row,		NULL)
 	PHP_FALIAS(mssql_fetch_array,	sybase_fetch_array,		NULL)
+	PHP_FALIAS(mssql_fetch_assoc,	sybase_fetch_assoc,		NULL)
 	PHP_FALIAS(mssql_fetch_object,	sybase_fetch_object,	NULL)
 	PHP_FALIAS(mssql_data_seek,		sybase_data_seek,		NULL)
 	PHP_FALIAS(mssql_fetch_field,	sybase_fetch_field,		NULL)
@@ -322,7 +324,7 @@
 				host = Z_STRVAL_PP(yyhost);
 				hashed_details_length = Z_STRLEN_PP(yyhost)+6+5;
 				hashed_details = (char *) emalloc(hashed_details_length+1);
-				sprintf(hashed_details,"sybase_%s____", Z_STRVAL_PP(yyhost));
+				sprintf(hashed_details,"sybase_%s____", host); /* SAFE */
 			}
 			break;
 		case 2: {
@@ -337,7 +339,7 @@
 				user = Z_STRVAL_PP(yyuser);
 				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+6+5;
 				hashed_details = (char *) emalloc(hashed_details_length+1);
-				sprintf(hashed_details,"sybase_%s_%s___",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser));
+				sprintf(hashed_details,"sybase_%s_%s___",host,user); /* SAFE */
 			}
 			break;
 		case 3: {
@@ -354,7 +356,7 @@
 				passwd = Z_STRVAL_PP(yypasswd);
 				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+6+5;
 				hashed_details = (char *) emalloc(hashed_details_length+1);
-				sprintf(hashed_details,"sybase_%s_%s_%s__",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd)); /* SAFE */
+				sprintf(hashed_details,"sybase_%s_%s_%s__",host,user,passwd); /* SAFE */
 			}
 			break;
 		case 4: {
@@ -373,7 +375,7 @@
 				charset = Z_STRVAL_PP(yycharset);
 				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+Z_STRLEN_PP(yycharset)+6+5;
 				hashed_details = (char *) emalloc(hashed_details_length+1);
-				sprintf(hashed_details,"sybase_%s_%s_%s_%s_",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd),Z_STRVAL_PP(yycharset)); /* SAFE */
+				sprintf(hashed_details,"sybase_%s_%s_%s_%s_",host,user,passwd,charset); /* SAFE */
 			}
 			break;
 		case 5: {
@@ -392,9 +394,9 @@
 				passwd = Z_STRVAL_PP(yypasswd);
 				charset = Z_STRVAL_PP(yycharset);
 				appname = Z_STRVAL_PP(yyappname);
-				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+Z_STRLEN_P(yycharset)+Z_STRLEN_PP(yyappname)+6+5;
+				hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+Z_STRLEN_PP(yycharset)+Z_STRLEN_PP(yyappname)+6+5;
 				hashed_details = (char *) emalloc(hashed_details_length+1);
-				sprintf(hashed_details,"sybase_%s_%s_%s_%s_%s",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd),Z_STRVAL_PP(yycharset),Z_STRVAL_PP(yyappname)); /* SAFE */
+				sprintf(hashed_details,"sybase_%s_%s_%s_%s_%s",host,user,passwd,charset,appname); /* SAFE */
 			}
 			break;
 		default:
@@ -455,7 +457,9 @@
 			}
 
 			/* hash it up */
-			sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link));
+			if (!(sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link))))
+			  goto err_link;
+
 			memcpy(sybase_ptr,&sybase,sizeof(sybase_link));
 			Z_TYPE(new_le) = php_sybase_module.le_plink;
 			new_le.ptr = sybase_ptr;
@@ -621,8 +625,8 @@
    Select Sybase database */
 PHP_FUNCTION(sybase_select_db)
 {
-	zval *db, **sybase_link_index;
-	int id,type;
+	zval **db, **sybase_link_index;
+	int id, type;
 	sybase_link  *sybase_ptr;
 	
 	switch(ZEND_NUM_ARGS()) {
@@ -630,6 +634,7 @@
 			if (zend_get_parameters_ex(1, &db) == FAILURE) {
 				RETURN_FALSE;
 			}
+
 			id = php_sybase_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
 			break;
 		case 2:
@@ -645,14 +650,14 @@
 	}
 	
 	CHECK_LINK(id);
-	
+
 	sybase_ptr = (sybase_link *) zend_list_find(id,&type);
 	if (type!=php_sybase_module.le_link && type!=php_sybase_module.le_plink) {
 		php_error_docref(NULL TSRMLS_CC, E_WARNING,"%d is not a Sybase link index",id);
 		RETURN_FALSE;
 	}
-	
-	convert_to_string(db);
+
+	convert_to_string_ex(db);
 	
 	if (dbuse(sybase_ptr->link,Z_STRVAL_PP(db))==FAIL) {
 		/*php_error_docref(NULL TSRMLS_CC, E_WARNING,"Sybase:  Unable to select database:  %s",sybase_error(sybase));*/
@@ -911,7 +916,7 @@
 		WRONG_PARAM_COUNT;
 	}
 	
-	convert_to_long_ex(sybase_result_index);~
+	convert_to_long_ex(sybase_result_index);
 	if (Z_LVAL_PP(sybase_result_index)==0) {
 		RETURN_FALSE;
 	}
@@ -921,7 +926,7 @@
 		php_error_docref(NULL TSRMLS_CC, E_WARNING,"%d is not a Sybase result index",Z_LVAL_PP(sybase_result_index));
 		RETURN_FALSE;
 	}
-	zend_list_delete(Z_LVAL_P(sybase_result_index));
+	zend_list_delete(Z_LVAL_PP(sybase_result_index));
 	RETURN_TRUE;
 }
 /* }}} */
@@ -995,7 +1000,6 @@
 	zval **sybase_result_index;
 	int type,i,id;
 	sybase_result *result;
-	pval *field_content;
 
 	if (ZEND_NUM_ARGS() !=1 || zend_get_parameters_ex(1, &sybase_result_index)==FAILURE) {
 		WRONG_PARAM_COUNT;
@@ -1024,7 +1028,7 @@
 /* }}} */
 
 
-static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS)
+static void php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int numerics)
 {
 	zval **sybase_result_index;
 	sybase_result *result;
@@ -1050,8 +1054,10 @@
 	array_init(return_value);
 	
 	for (i=0; i<result->num_fields; i++) {
-		ZVAL_ADDREF(result->data[result->cur_row][i]);
-		zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &result->data[result->cur_row][i], sizeof(pval *), NULL);
+		if (numerics) {
+			ZVAL_ADDREF(result->data[result->cur_row][i]);
+			zend_hash_index_update(Z_ARRVAL_P(return_value), i, (void *) &result->data[result->cur_row][i], sizeof(pval *), NULL);
+		}
 		ZVAL_ADDREF(result->data[result->cur_row][i]);
 		zend_hash_update(Z_ARRVAL_P(return_value), result->fields[i].name, strlen(result->fields[i].name)+1, (void *) &result->data[result->cur_row][i], sizeof(pval  *), NULL);
 	}
@@ -1063,11 +1069,9 @@
    Fetch row as object */
 PHP_FUNCTION(sybase_fetch_object)
 {
-	php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+	php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
 	if (Z_TYPE_P(return_value)==IS_ARRAY) {
-		Z_TYPE_P(return_value)=IS_OBJECT;
-		Z_OBJPROP_P(return_value) = Z_ARRVAL_P(return_value);
-		Z_OBJCE_P(return_value) = ZEND_STANDARD_CLASS_DEF_PTR;
+		object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));
 	}
 }
 /* }}} */
@@ -1076,7 +1080,15 @@
    Fetch row as array */
 PHP_FUNCTION(sybase_fetch_array)
 {
-	php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+	php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* {{{ proto array sybase_fetch_assoc(int result)
+   Fetch row as array */
+PHP_FUNCTION(sybase_fetch_assoc)
+{
+	php_sybase_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
 }
 /* }}} */
 
@@ -1284,7 +1296,7 @@
 			int i;
 
 			for (i=0; i<result->num_fields; i++) {
-				if (!strcasecmp(result->fields[i].name,Z_STRVAL_P(field))) {
+				if (!strcasecmp(result->fields[i].name,Z_STRVAL_PP(field))) {
 					field_offset = i;
 					break;
 				}
@@ -1315,17 +1327,16 @@
     Get number of affected rows in last query */
 PHP_FUNCTION(sybase_affected_rows)
 {
-	zval *sybase_link_index = NULL;
-	sybase_link *sybase_ptr = NULL;
-	int id                  = 0;
-	int type                = 0;
+	zval **sybase_link_index;
+	sybase_link *sybase_ptr;
+	int id, type;
 
 	switch(ZEND_NUM_ARGS()) {
 		case 0:
 			id = php_sybase_module.default_link;
 			break;
 		case 1:
-			if (zend_get_parameters_ex(ht, 1, &sybase_link_index) == FAILURE) {
+			if (zend_get_parameters_ex(1, &sybase_link_index) == FAILURE) {
 				RETURN_FALSE;
 			}
 			convert_to_long_ex(sybase_link_index);
Index: ext/sybase/php_sybase_db.h
===================================================================
RCS file: /repository/php4/ext/sybase/php_sybase_db.h,v
retrieving revision 1.9
diff -u -u -r1.9 php_sybase_db.h
--- ext/sybase/php_sybase_db.h	31 Dec 2002 16:07:58 -0000	1.9
+++ ext/sybase/php_sybase_db.h	6 Jun 2003 18:06:55 -0000
@@ -42,6 +42,7 @@
 PHP_FUNCTION(sybase_num_fields);
 PHP_FUNCTION(sybase_fetch_row);
 PHP_FUNCTION(sybase_fetch_array);
+PHP_FUNCTION(sybase_fetch_assoc);
 PHP_FUNCTION(sybase_fetch_object);
 PHP_FUNCTION(sybase_data_seek);
 PHP_FUNCTION(sybase_affected_rows);
